From 619f499dbe9430fbc66d98aa87534005285d94fe Mon Sep 17 00:00:00 2001 From: Cedric Verstraeten Date: Fri, 13 Mar 2020 11:47:51 +0100 Subject: [PATCH] add factory installation --- .docz/.cache/api-runner-browser-plugins.js | 2 +- .docz/.cache/async-requires.js | 5 +- ...tore-01552352326f147d7136c3207405181f.json | 1 - ...tore-01809ab8e6e259f536cde6f53fe3a7eb.json | 1 - ...tore-03e5545de47d8138dd308e68721efdf0.json | 1 - ...tore-0695551db8cfa380d447884459f127e6.json | 1 - ...tore-07cda10ad8218d64e0eb24ab9adbf176.json | 1 - ...tore-092ef7dafd77e6132e66de60c71d78a6.json | 1 + ...tore-095fe0fbae51998b7a4231d38a090fb3.json | 1 + ...tore-0e72b13555d440ef18d0e78cb5fa3af8.json | 1 - ...tore-0eb20e9469c493e345d4fd5478bcaf16.json | 1 + ...tore-0fac5202084e58929a0b1613758e0843.json | 1 + ...tore-11d60587ea6f2ba336fbcf0d8dfd43a6.json | 2 +- ...tore-128a1ee0400bec41b31679925403ef0d.json | 1 + ...tore-14a114bb1c5de41c24fe708adbdb44df.json | 1 + ...tore-19ff9e1f7611a30989b3cc7a7f4300ef.json | 1 + ...tore-19ffd27e7017ef6077162903c384b5d8.json | 1 - ...tore-1b2fa7b8dd587cee5688797218a2b13e.json | 1 - ...tore-1b34818badd20190b279e5392eacf15f.json | 1 + ...tore-1de87cc11700ceabeff98abb299f5fa9.json | 1 + ...tore-1e6cf19ef007466bf1d062600aa36d7a.json | 1 + ...tore-222cf10403a2c451bc05ea0af53da581.json | 1 + ...tore-2355d47ddd19afb93c3784b35ef0830f.json | 1 - ...tore-27c770133657c6ae7a79046105e97dde.json | 1 - ...tore-2c3e7c147574c13c84efaf4cab6f081a.json | 1 - ...tore-2d04824b64919519831046dd3ff6ca94.json | 1 + ...tore-2fed2abfd80ae15f7308d9585346d442.json | 1 + ...tore-3661d5b14a4927f7dcfd5504c55dde67.json | 2 +- ...tore-38350fd47cf6441333be39c4c8a76012.json | 1 + ...tore-38894f9b70e1dcadeff4de87006f8b5e.json | 1 + ...tore-3a491fc7ff79adb41ea1a5e2b213ded3.json | 1 + ...tore-3ac33388759d113211aa8324dfc5615a.json | 1 + ...tore-3b428ae7cc21126ba4ef432146f656f6.json | 1 - ...tore-3d928074c6477eb92afcf227412a2773.json | 1 + ...tore-3df1c21f1d232d32dafaf22aae80a67e.json | 1 + ...tore-3eda51512f5a97475506e2e5457fd258.json | 1 - ...tore-450a4bd793b2dc0c3970d811745eabc6.json | 1 + ...tore-4de646e20b496fcb22f046c5e40543c9.json | 1 - ...tore-4e2c47ea9e629b020fafa1e9c4f1fd6e.json | 1 - ...tore-4e98d933911f4678819dd9830f149258.json | 1 + ...tore-4f29e6fe71137741286340d58a6965c2.json | 2 +- ...tore-4f42fbd8a078999f5a042225f8bc85ae.json | 1 - ...tore-5281f4070cf65b2b8ab891bcf7590813.json | 1 + ...tore-599bc30edfcb33b4dad5ff3bccebfc78.json | 1 - ...tore-5ffb5ccaea1427be0aca5e8c9a347100.json | 1 + ...tore-624046d78bb6cbefc64c89c4b1c505a9.json | 1 - ...tore-63b018dce1ea299800d11ba4baf3f0d7.json | 2 +- ...tore-6976b00b424fa97011190e7fbdee0394.json | 1 - ...tore-6a44d0e0b58a1f73e5d070db7a687bf1.json | 1 + ...tore-6e07856bf9cd44de99ff2e6e036fc077.json | 1 + ...tore-70ad5e6ff3a23d134aa1e126b21179e4.json | 1 + ...tore-7372f9a38d8e319a968733081ff74422.json | 1 + ...tore-75c00935cc0dfcd79768cd2bf240e752.json | 1 - ...tore-7d22e6a25d83cd5e3872db403e94ce25.json | 1 + ...tore-815c6b91e7de89f1d244d4a558d3301f.json | 1 + ...tore-86a7bfe39b88f5e2776a3fd773fcf2c6.json | 2 +- ...tore-87562f3d721f36421614227b4d7731e7.json | 1 + ...tore-88932312069a6f83a8a3f8c6bc5f1280.json | 1 - ...tore-900840e189f23019cdb8c89722cc1918.json | 1 + ...tore-93d1228f76d979359e37fed98a7d5ba1.json | 1 - ...tore-9485fe549507dfbf38dab4c3beb8d3fe.json | 2 +- ...tore-96c6bd5a46263ca6eef369267d5ffe8a.json | 1 - ...tore-a316e56c69093e697f9ccd27e0d8afcb.json | 1 - ...tore-a68c3c29fa019a10d273faa566b1e0b7.json | 2 +- ...tore-a7892904997d5282b5770a03b5c5edbf.json | 1 - ...tore-a84526a2aa900d12ee78c35bf0ba75c7.json | 2 +- ...tore-a90f8bc40531b0e632d6f3920b39575c.json | 1 - ...tore-ab2d20eac6480bdfc4975c0d23df3b80.json | 1 + ...tore-abdbdd22858253fb0a31a491bb2c35bd.json | 1 + ...tore-ac8eb4fb515f4efca4465f0896385c04.json | 1 + ...tore-acc08a461b9ec5aa0f2601269984dbc9.json | 1 + ...tore-b68667b1ec646f37bd344f0f4d1fefa2.json | 1 - ...tore-b7bce085df39548ca4c865835c50c28e.json | 2 +- ...tore-b7d455e0c2e4a40aab216de5f40db7ac.json | 1 - ...tore-b960f34c777127d0740671b5b4e06ebe.json | 1 - ...tore-bae7eec54345dd03dab9de1825c5fb76.json | 1 + ...tore-bf546b931485862eb682f9184213699e.json | 1 - ...tore-c195f4b74e6b73d89724cbf2c59b82ef.json | 1 + ...tore-c1e67df03a7015deafd8b0a4af2b2a31.json | 2 +- ...tore-c21beb2fa8e8453f9f228b3086e047c3.json | 1 - ...tore-c91cdbcb8d8826bf1375fb5eb8aebafc.json | 1 - ...tore-cf91ba4e064977d9d8744996bec34baf.json | 1 + ...tore-cf9f0bb43e2ce7f7bcc2344a5968a66f.json | 1 - ...tore-d21a7e052ca0deb1bed2dfb7da717d7e.json | 1 - ...tore-d7796b1a984dc6af7d818c599c508e07.json | 1 - ...tore-dc524e71a0878ac85869771105bc5aa2.json | 1 + ...tore-deab0012004d6fd2df771b1528aac216.json | 1 - ...tore-e1e7deff34f9356134cf2ee45a22c675.json | 1 + ...tore-e2962ee393c344b9e2afed7573764805.json | 1 + ...tore-e4e6783028e3167ef60464e5d5d71a1c.json | 1 + ...tore-e77601507b5c1e7b6fd34442f10f50f3.json | 1 - ...tore-e7c80861f8f64039fab82fae732a5fed.json | 1 + ...tore-e8f1ac81a660935cddcc2cab6635d41c.json | 2 +- ...tore-e97ebc3502767fd26f8d98637003ee7c.json | 1 + ...tore-ea9ba0cd48a895e0119e0cae95e9c17d.json | 1 + ...tore-ec9383e7da41a0b42fd42636a469290d.json | 1 - ...tore-eccbd7b456024e7687020bd6167b49cb.json | 1 - ...tore-ee19ff5e4f64cc381dd76a7920c34105.json | 2 +- ...tore-f3577968a9468b505f206c1054b04d0b.json | 1 + ...tore-f419d0eaf9e5eadbac69ab84df48c563.json | 1 + ...tore-f846a15305c2134d10a4d56ed3fc27b4.json | 1 + ...tore-f874626292f8147d044d10c42e8fb31f.json | 1 - ...tore-f8d7763d7b4ed12169917268a01a4f88.json | 1 - .docz/.cache/redux.state | Bin 492970 -> 586880 bytes .docz/.cache/sync-requires.js | 5 +- .docz/app/db.json | 418 ++++-------------- .docz/doczrc.js | 2 +- .docz/gatsby-config.js | 5 +- .../page-data/dev-404-page/page-data.json | 2 +- .../enterprise/installation/page-data.json | 1 + .../enterprise/releases/page-data.json | 2 +- .docz/public/static/d/1803957048.json | 2 +- doczrc.js | 2 +- .../factory/kerberos-factory-loginpage.png | Bin 0 -> 1654137 bytes src/components/ReplaceVersion.jsx | 2 - src/enterprise/index.mdx | 16 +- src/enterprise/installation.mdx | 170 +++++++ src/enterprise/releases.mdx | 329 +------------- 118 files changed, 336 insertions(+), 740 deletions(-) delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-01552352326f147d7136c3207405181f.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-01809ab8e6e259f536cde6f53fe3a7eb.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-03e5545de47d8138dd308e68721efdf0.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-0695551db8cfa380d447884459f127e6.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-07cda10ad8218d64e0eb24ab9adbf176.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-092ef7dafd77e6132e66de60c71d78a6.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-095fe0fbae51998b7a4231d38a090fb3.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-0e72b13555d440ef18d0e78cb5fa3af8.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-0eb20e9469c493e345d4fd5478bcaf16.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-0fac5202084e58929a0b1613758e0843.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-128a1ee0400bec41b31679925403ef0d.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-14a114bb1c5de41c24fe708adbdb44df.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-19ff9e1f7611a30989b3cc7a7f4300ef.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-19ffd27e7017ef6077162903c384b5d8.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-1b2fa7b8dd587cee5688797218a2b13e.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-1b34818badd20190b279e5392eacf15f.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-1de87cc11700ceabeff98abb299f5fa9.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-1e6cf19ef007466bf1d062600aa36d7a.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-222cf10403a2c451bc05ea0af53da581.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-2355d47ddd19afb93c3784b35ef0830f.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-27c770133657c6ae7a79046105e97dde.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-2c3e7c147574c13c84efaf4cab6f081a.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-2d04824b64919519831046dd3ff6ca94.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-2fed2abfd80ae15f7308d9585346d442.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-38350fd47cf6441333be39c4c8a76012.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-38894f9b70e1dcadeff4de87006f8b5e.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-3a491fc7ff79adb41ea1a5e2b213ded3.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-3ac33388759d113211aa8324dfc5615a.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-3b428ae7cc21126ba4ef432146f656f6.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-3d928074c6477eb92afcf227412a2773.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-3df1c21f1d232d32dafaf22aae80a67e.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-3eda51512f5a97475506e2e5457fd258.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-450a4bd793b2dc0c3970d811745eabc6.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-4de646e20b496fcb22f046c5e40543c9.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-4e2c47ea9e629b020fafa1e9c4f1fd6e.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-4e98d933911f4678819dd9830f149258.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-4f42fbd8a078999f5a042225f8bc85ae.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-5281f4070cf65b2b8ab891bcf7590813.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-599bc30edfcb33b4dad5ff3bccebfc78.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-5ffb5ccaea1427be0aca5e8c9a347100.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-624046d78bb6cbefc64c89c4b1c505a9.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-6976b00b424fa97011190e7fbdee0394.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-6a44d0e0b58a1f73e5d070db7a687bf1.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-6e07856bf9cd44de99ff2e6e036fc077.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-70ad5e6ff3a23d134aa1e126b21179e4.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-7372f9a38d8e319a968733081ff74422.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-75c00935cc0dfcd79768cd2bf240e752.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-7d22e6a25d83cd5e3872db403e94ce25.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-815c6b91e7de89f1d244d4a558d3301f.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-87562f3d721f36421614227b4d7731e7.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-88932312069a6f83a8a3f8c6bc5f1280.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-900840e189f23019cdb8c89722cc1918.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-93d1228f76d979359e37fed98a7d5ba1.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-96c6bd5a46263ca6eef369267d5ffe8a.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-a316e56c69093e697f9ccd27e0d8afcb.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-a7892904997d5282b5770a03b5c5edbf.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-a90f8bc40531b0e632d6f3920b39575c.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-ab2d20eac6480bdfc4975c0d23df3b80.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-abdbdd22858253fb0a31a491bb2c35bd.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-ac8eb4fb515f4efca4465f0896385c04.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-acc08a461b9ec5aa0f2601269984dbc9.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-b68667b1ec646f37bd344f0f4d1fefa2.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-b7d455e0c2e4a40aab216de5f40db7ac.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-b960f34c777127d0740671b5b4e06ebe.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-bae7eec54345dd03dab9de1825c5fb76.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-bf546b931485862eb682f9184213699e.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-c195f4b74e6b73d89724cbf2c59b82ef.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-c21beb2fa8e8453f9f228b3086e047c3.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-c91cdbcb8d8826bf1375fb5eb8aebafc.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-cf91ba4e064977d9d8744996bec34baf.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-cf9f0bb43e2ce7f7bcc2344a5968a66f.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-d21a7e052ca0deb1bed2dfb7da717d7e.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-d7796b1a984dc6af7d818c599c508e07.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-dc524e71a0878ac85869771105bc5aa2.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-deab0012004d6fd2df771b1528aac216.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-e1e7deff34f9356134cf2ee45a22c675.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-e2962ee393c344b9e2afed7573764805.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-e4e6783028e3167ef60464e5d5d71a1c.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-e77601507b5c1e7b6fd34442f10f50f3.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-e7c80861f8f64039fab82fae732a5fed.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-e97ebc3502767fd26f8d98637003ee7c.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-ea9ba0cd48a895e0119e0cae95e9c17d.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-ec9383e7da41a0b42fd42636a469290d.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-eccbd7b456024e7687020bd6167b49cb.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-f3577968a9468b505f206c1054b04d0b.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-f419d0eaf9e5eadbac69ab84df48c563.json create mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-f846a15305c2134d10a4d56ed3fc27b4.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-f874626292f8147d044d10c42e8fb31f.json delete mode 100644 .docz/.cache/caches/gatsby-plugin-mdx/diskstore-f8d7763d7b4ed12169917268a01a4f88.json create mode 100644 .docz/public/page-data/enterprise/installation/page-data.json create mode 100644 public/images/factory/kerberos-factory-loginpage.png create mode 100644 src/enterprise/installation.mdx diff --git a/.docz/.cache/api-runner-browser-plugins.js b/.docz/.cache/api-runner-browser-plugins.js index cb2242f..c5a1418 100644 --- a/.docz/.cache/api-runner-browser-plugins.js +++ b/.docz/.cache/api-runner-browser-plugins.js @@ -6,5 +6,5 @@ module.exports = [{ options: {"plugins":[]}, },{ plugin: require('../../node_modules/gatsby-theme-docz/gatsby-browser.js'), - options: {"plugins":[],"themeConfig":{"colors":{"primary":"#943733","secondary":"#9e9e9e","h5":{"color":"#943733"},"header":{"bg":"#943733"},"sidebar":{"bg":"#f9f9f9","navLinkActive":"#943733"},"modes":{"dark":{"primary":"#9e9e9e","secondary":"#943733","header":{"bg":"#943733"},"sidebar":{"navLinkActive":"#fff"}}}}},"themesDir":"src","docgenConfig":{},"menu":["Introduction","Architectures",{"name":"Open Source","menu":["First things first","Releases","Upgrade","Installation","Contribute","License","Machinery","Web"]},"Enterprise","Cloud"],"mdPlugins":[],"hastPlugins":[],"ignore":[],"typescript":false,"ts":false,"propsParser":true,"props-parser":true,"debug":false,"native":false,"openBrowser":false,"o":false,"open":false,"open-browser":false,"root":"/Users/i353408/Vagrant/www/repos/documentation/.docz","base":"/","source":"./","src":"./","files":"**/*.{md,markdown,mdx}","public":"/public","dest":".docz/dist","d":".docz/dist","editBranch":"master","eb":"master","edit-branch":"master","config":"","title":"Kerberos.io","description":"My awesome app using docz","host":"localhost","port":3000,"p":3000,"separator":"-","paths":{"root":"/Users/i353408/Vagrant/www/repos/documentation","templates":"/Users/i353408/Vagrant/www/repos/documentation/node_modules/docz-core/dist/templates","docz":"/Users/i353408/Vagrant/www/repos/documentation/.docz","cache":"/Users/i353408/Vagrant/www/repos/documentation/.docz/.cache","app":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app","appPackageJson":"/Users/i353408/Vagrant/www/repos/documentation/package.json","gatsbyConfig":"/Users/i353408/Vagrant/www/repos/documentation/gatsby-config.js","gatsbyBrowser":"/Users/i353408/Vagrant/www/repos/documentation/gatsby-browser.js","gatsbyNode":"/Users/i353408/Vagrant/www/repos/documentation/gatsby-node.js","gatsbySSR":"/Users/i353408/Vagrant/www/repos/documentation/gatsby-ssr.js","importsJs":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app/imports.js","rootJs":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app/root.jsx","indexJs":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app/index.jsx","indexHtml":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app/index.html","db":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app/db.json"},"repository":"https://github.com/kerberos-io","gatsbyRemarkPlugins":[{"resolve":"gatsby-remark-vscode"},{"resolve":"gatsby-remark-grid-tables"}]}, + options: {"plugins":[],"themeConfig":{"colors":{"primary":"#943733","secondary":"#9e9e9e","h5":{"color":"#943733"},"header":{"bg":"#943733"},"sidebar":{"bg":"#f9f9f9","navLinkActive":"#943733"},"modes":{"dark":{"primary":"#9e9e9e","secondary":"#943733","header":{"bg":"#943733"},"sidebar":{"navLinkActive":"#fff"}}}}},"themesDir":"src","docgenConfig":{},"menu":["Introduction","Architectures",{"name":"Open Source","menu":["First things first","Releases","Upgrade","Installation","Contribute","License","Machinery","Web"]},{"name":"Enterprise","menu":["Introduction","Installation","License"]},"Cloud"],"mdPlugins":[],"hastPlugins":[],"ignore":[],"typescript":false,"ts":false,"propsParser":true,"props-parser":true,"debug":false,"native":false,"openBrowser":false,"o":false,"open":false,"open-browser":false,"root":"/Users/i353408/Vagrant/www/repos/documentation/.docz","base":"/","source":"./","src":"./","files":"**/*.{md,markdown,mdx}","public":"/public","dest":".docz/dist","d":".docz/dist","editBranch":"master","eb":"master","edit-branch":"master","config":"","title":"Kerberos.io","description":"My awesome app using docz","host":"localhost","port":3000,"p":3000,"separator":"-","paths":{"root":"/Users/i353408/Vagrant/www/repos/documentation","templates":"/Users/i353408/Vagrant/www/repos/documentation/node_modules/docz-core/dist/templates","docz":"/Users/i353408/Vagrant/www/repos/documentation/.docz","cache":"/Users/i353408/Vagrant/www/repos/documentation/.docz/.cache","app":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app","appPackageJson":"/Users/i353408/Vagrant/www/repos/documentation/package.json","gatsbyConfig":"/Users/i353408/Vagrant/www/repos/documentation/gatsby-config.js","gatsbyBrowser":"/Users/i353408/Vagrant/www/repos/documentation/gatsby-browser.js","gatsbyNode":"/Users/i353408/Vagrant/www/repos/documentation/gatsby-node.js","gatsbySSR":"/Users/i353408/Vagrant/www/repos/documentation/gatsby-ssr.js","importsJs":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app/imports.js","rootJs":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app/root.jsx","indexJs":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app/index.jsx","indexHtml":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app/index.html","db":"/Users/i353408/Vagrant/www/repos/documentation/.docz/app/db.json"},"repository":"https://github.com/kerberos-io","gatsbyRemarkPlugins":[{"resolve":"gatsby-remark-vscode"},{"resolve":"gatsby-remark-grid-tables"}]}, }] diff --git a/.docz/.cache/async-requires.js b/.docz/.cache/async-requires.js index 29a4e9b..59d748a 100644 --- a/.docz/.cache/async-requires.js +++ b/.docz/.cache/async-requires.js @@ -7,15 +7,16 @@ exports.components = { "component---src-architectures-mdx": () => import("../../src/architectures.mdx" /* webpackChunkName: "component---src-architectures-mdx" */), "component---src-index-mdx": () => import("../../src/index.mdx" /* webpackChunkName: "component---src-index-mdx" */), "component---src-enterprise-index-mdx": () => import("../../src/enterprise/index.mdx" /* webpackChunkName: "component---src-enterprise-index-mdx" */), + "component---src-enterprise-installation-mdx": () => import("../../src/enterprise/installation.mdx" /* webpackChunkName: "component---src-enterprise-installation-mdx" */), + "component---src-enterprise-releases-mdx": () => import("../../src/enterprise/releases.mdx" /* webpackChunkName: "component---src-enterprise-releases-mdx" */), "component---src-open-source-index-mdx": () => import("../../src/open-source/index.mdx" /* webpackChunkName: "component---src-open-source-index-mdx" */), "component---src-open-source-upgrade-mdx": () => import("../../src/open-source/upgrade.mdx" /* webpackChunkName: "component---src-open-source-upgrade-mdx" */), "component---src-open-source-web-mdx": () => import("../../src/open-source/web.mdx" /* webpackChunkName: "component---src-open-source-web-mdx" */), "component---src-cloud-index-mdx": () => import("../../src/cloud/index.mdx" /* webpackChunkName: "component---src-cloud-index-mdx" */), + "component---src-enterprise-license-mdx": () => import("../../src/enterprise/license.mdx" /* webpackChunkName: "component---src-enterprise-license-mdx" */), "component---src-open-source-contribute-mdx": () => import("../../src/open-source/contribute.mdx" /* webpackChunkName: "component---src-open-source-contribute-mdx" */), "component---src-open-source-license-mdx": () => import("../../src/open-source/license.mdx" /* webpackChunkName: "component---src-open-source-license-mdx" */), "component---src-open-source-releases-mdx": () => import("../../src/open-source/releases.mdx" /* webpackChunkName: "component---src-open-source-releases-mdx" */), - "component---src-enterprise-releases-mdx": () => import("../../src/enterprise/releases.mdx" /* webpackChunkName: "component---src-enterprise-releases-mdx" */), - "component---src-enterprise-license-mdx": () => import("../../src/enterprise/license.mdx" /* webpackChunkName: "component---src-enterprise-license-mdx" */), "component---src-open-source-installation-mdx": () => import("../../src/open-source/installation.mdx" /* webpackChunkName: "component---src-open-source-installation-mdx" */), "component---src-open-source-machinery-mdx": () => import("../../src/open-source/machinery.mdx" /* webpackChunkName: "component---src-open-source-machinery-mdx" */) } diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-01552352326f147d7136c3207405181f.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-01552352326f147d7136c3207405181f.json deleted file mode 100644 index 14244e8..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-01552352326f147d7136c3207405181f.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838682387000,"key":"gatsby-plugin-mdx-entire-payload-39b27a708ab4407ee0c342577bd33013-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide the high availability and fail over requirements our customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":310,"offset":1385},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":310,"offset":1385},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":23,"column":1,"offset":1388},"end":{"line":23,"column":31,"offset":1418},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":23,"column":31,"offset":1418}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide the high availability and fail over requirements our customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-01809ab8e6e259f536cde6f53fe3a7eb.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-01809ab8e6e259f536cde6f53fe3a7eb.json deleted file mode 100644 index 13be9d3..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-01809ab8e6e259f536cde6f53fe3a7eb.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838684366000,"key":"gatsby-plugin-mdx-entire-payload-db7ffbea4d0a77ec0015af5dcf4aa2f9-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).","position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Cloud or On premise","position":{"start":{"line":26,"column":4,"offset":1715},"end":{"line":26,"column":23,"offset":1734},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1712},"end":{"line":26,"column":23,"offset":1734},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster.","position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":111,"offset":1846},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":111,"offset":1846},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":31,"column":1,"offset":1849},"end":{"line":31,"column":31,"offset":1879},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":31,"column":31,"offset":1879}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n

{`Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).`}

\n

{`Cloud or On premise`}

\n

{`You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-03e5545de47d8138dd308e68721efdf0.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-03e5545de47d8138dd308e68721efdf0.json deleted file mode 100644 index 5ad0638..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-03e5545de47d8138dd308e68721efdf0.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838682256000,"key":"gatsby-plugin-mdx-entire-payload-d48d1395b01bab5954e02eb61927f6ac-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide the high availability and fail over requirements customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":239,"offset":1314},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":239,"offset":1314},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":23,"column":1,"offset":1317},"end":{"line":23,"column":31,"offset":1347},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":23,"column":31,"offset":1347}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide the high availability and fail over requirements customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0695551db8cfa380d447884459f127e6.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0695551db8cfa380d447884459f127e6.json deleted file mode 100644 index 7ae6dd6..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0695551db8cfa380d447884459f127e6.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838510857000,"key":"gatsby-plugin-mdx-entire-payload-1ce0685927225a0d84368d46d8c6cc59-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Will be released soon.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":10,"column":23,"offset":195},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":10,"column":23,"offset":195},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":13,"column":1,"offset":198},"end":{"line":13,"column":31,"offset":228},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":13,"column":31,"offset":228}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Will be released soon.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-07cda10ad8218d64e0eb24ab9adbf176.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-07cda10ad8218d64e0eb24ab9adbf176.json deleted file mode 100644 index ed012fa..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-07cda10ad8218d64e0eb24ab9adbf176.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838683321000,"key":"gatsby-plugin-mdx-entire-payload-2b06aa0b2e00be56877dccb4edbc17c3-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":25,"column":1,"offset":1489},"end":{"line":25,"column":31,"offset":1519},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":25,"column":31,"offset":1519}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-092ef7dafd77e6132e66de60c71d78a6.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-092ef7dafd77e6132e66de60c71d78a6.json new file mode 100644 index 0000000..9940dbb --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-092ef7dafd77e6132e66de60c71d78a6.json @@ -0,0 +1 @@ +{"expireTime":9007200838831085000,"key":"gatsby-plugin-mdx-entire-payload-24f25bdd406c9cd571e9b085590fb77e-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"## Global Docker image parameters\n## Please, note that this will override the image parameters, including dependencies, configured to use the global value\n## Current available global Docker image parameters: imageRegistry and imagePullSecrets\n##\n# global:\n# imageRegistry: myRegistryName\n# imagePullSecrets:\n# - myRegistryKeySecretName\n# storageClass: myStorageClass\n\nimage:\n ## Bitnami MongoDB registry\n ##\n registry: docker.io\n ## Bitnami MongoDB image name\n ##\n repository: bitnami/mongodb\n ## Bitnami MongoDB image tag\n ## ref: https://hub.docker.com/r/bitnami/mongodb/tags/\n ##\n tag: 4.2.3-debian-10-r31\n ## Specify a imagePullPolicy\n ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n ##\n pullPolicy: IfNotPresent\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n\n ## Set to true if you would like to see extra information on logs\n ## It turns on Bitnami debugging in minideb-extras-base\n ## ref: https://github.com/bitnami/minideb-extras-base\n debug: false\n\n## String to partially override mongodb.fullname template (will maintain the release name)\n##\n# nameOverride:\n\n## String to fully override mongodb.fullname template\n##\n# fullnameOverride:\n\n# Add custom extra environment variables to all the MongoDB containers\n# extraEnvVars:\n\n## Init containers parameters:\n## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.\n##\nvolumePermissions:\n enabled: false\n image:\n registry: docker.io\n repository: bitnami/minideb\n tag: buster\n pullPolicy: Always\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n resources: {}\n\n## Enable authentication\n## ref: https://docs.mongodb.com/manual/tutorial/enable-authentication/\n#\nusePassword: true\n# existingSecret: name-of-existing-secret\n\n## MongoDB admin password\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#setting-the-root-password-on-first-run\n##\nmongodbRootPassword: 9832sfascvn31\n\n## MongoDB custom user and database\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#creating-a-user-and-database-on-first-run\n##\n# mongodbUsername: username\n# mongodbPassword: password\n# mongodbDatabase: database\n\n## Whether enable/disable IPv6 on MongoDB\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-ipv6\n##\nmongodbEnableIPv6: false\n\n## Whether enable/disable DirectoryPerDB on MongoDB\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-directoryperdb\n##\nmongodbDirectoryPerDB: false\n\n## MongoDB System Log configuration\n## ref: https://github.com/bitnami/bitnami-docker-mongodb#configuring-system-log-verbosity-level\n##\nmongodbSystemLogVerbosity: 0\nmongodbDisableSystemLog: false\n\n## MongoDB additional command line flags\n##\n## Can be used to specify command line flags, for example:\n##\n## mongodbExtraFlags:\n## - \"--wiredTigerCacheSizeGB=2\"\nmongodbExtraFlags: []\n\n## Pod Security Context\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n##\nsecurityContext:\n enabled: true\n fsGroup: 1001\n runAsUser: 1001\n\n## Kubernetes Cluster Domain\nclusterDomain: cluster.local\n\n## Kubernetes service type\nservice:\n ## Specify an explicit service name.\n # name: svc-mongo\n ## Provide any additional annotations which may be required.\n ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart\n annotations: {}\n type: ClusterIP\n # clusterIP: None\n port: 27017\n\n ## Specify the nodePort value for the LoadBalancer and NodePort service types.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n ##\n # nodePort:\n\n ## Specify the externalIP value ClusterIP service type.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips\n # externalIPs: []\n\n ## Specify the loadBalancerIP value for LoadBalancer service types.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer\n ##\n # loadBalancerIP:\n\n ## Specify the loadBalancerSourceRanges value for LoadBalancer service types.\n ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service\n ##\n # loadBalancerSourceRanges: []\n\n## Use StatefulSet instead of Deployment when deploying standalone\nuseStatefulSet: false\n\n## Setting up replication\n## ref: https://github.com/bitnami/bitnami-docker-mongodb#setting-up-a-replication\n#\nreplicaSet:\n ## Whether to create a MongoDB replica set for high availability or not\n enabled: false\n useHostnames: true\n\n ## Name of the replica set\n ##\n name: rs0\n\n ## Key used for replica set authentication\n ##\n # key: key\n\n ## Number of replicas per each node type\n ##\n replicas:\n secondary: 0\n arbiter: 0\n\n ## Pod Disruption Budget\n ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/\n pdb:\n enabled: false\n minAvailable:\n secondary: 1\n arbiter: 1\n # maxUnavailable:\n # secondary: 1\n # arbiter: 1\n\n# Annotations to be added to the deployment or statefulsets\nannotations: {}\n\n# Additional labels to apply to the deployment or statefulsets\nlabels: {}\n\n# Annotations to be added to MongoDB pods\npodAnnotations: {}\n\n# Additional pod labels to apply\npodLabels: {}\n\n## Use an alternate scheduler, e.g. \"stork\".\n## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n##\n# schedulerName:\n\n## Configure resource requests and limits\n## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n##\nresources: {}\n# Define separate resources per arbiter, which are less then primary or secondary\n# used only when replica set is enabled\nresourcesArbiter: {}\n# limits:\n# cpu: 500m\n# memory: 512Mi\n# requests:\n# cpu: 100m\n# memory: 256Mi\n\n## Pod priority\n## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/\n# priorityClassName: \"\"\n\n## Node selector\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector\nnodeSelector: {}\n\n## Affinity\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\naffinity: {}\n# Define separate affinity for arbiter pod\naffinityArbiter: {}\n\n## Tolerations\n## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\ntolerations: []\n\n## Add sidecars to the pod\n##\n## For example:\n## sidecars:\n## - name: your-image-name\n## image: your-image\n## imagePullPolicy: Always\n## ports:\n## - name: portname\n## containerPort: 1234\nsidecars: []\n## Array to add extra volumes\n##\nextraVolumes: []\n## Array to add extra mounts (normally used with extraVolumes)\n##\nextraVolumeMounts: []\n\n## Add sidecars to the arbiter pod\n# used only when replica set is enabled\n##\n## For example:\n## sidecars:\n## - name: your-image-name\n## image: your-image\n## imagePullPolicy: Always\n## ports:\n## - name: portname\n## containerPort: 1234\nsidecarsArbiter: []\n## Array to add extra volumes to the arbiter\n# used only when replica set is enabled\n##\nextraVolumesArbiter: []\n## Array to add extra mounts (normally used with extraVolumes) to the arbiter\n# used only when replica set is enabled\n##\nextraVolumeMountsArbiter: []\n\n## updateStrategy for MongoDB Primary, Secondary and Arbitrer statefulsets\n## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies\nupdateStrategy:\n type: RollingUpdate\n\n## Enable persistence using Persistent Volume Claims\n## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/\n##\npersistence:\n enabled: true\n ## A manually managed Persistent Volume and Claim\n ## Requires persistence.enabled: true\n ## If defined, PVC must be created manually before volume will be bound\n ##\n # existingClaim:\n\n ## The path the volume will be mounted at, useful when using different\n ## MongoDB images.\n ##\n mountPath: /bitnami/mongodb\n\n ## The subdirectory of the volume to mount to, useful in dev environments\n ## and one PV for multiple services.\n ##\n subPath: \"\"\n\n ## mongodb data Persistent Volume Storage Class\n ## If defined, storageClassName: \n ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning\n ## If undefined (the default) or set to null, no storageClassName spec is\n ## set, choosing the default provisioner. (gp2 on AWS, standard on\n ## GKE, AWS & OpenStack)\n ##\n # storageClass: \"-\"\n accessModes:\n - ReadWriteOnce\n size: 8Gi\n annotations: {}\n\n## Configure the ingress resource that allows you to access the\n## MongoDB installation. Set up the URL\n## ref: http://kubernetes.io/docs/user-guide/ingress/\n##\ningress:\n ## Set to true to enable ingress record generation\n enabled: false\n\n ## Set this to true in order to add the corresponding annotations for cert-manager\n certManager: false\n\n ## Ingress annotations done as key:value pairs\n ## For a full list of possible ingress annotations, please see\n ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md\n ##\n ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: \"true\" will automatically be set\n ## If certManager is set to true, annotation kubernetes.io/tls-acme: \"true\" will automatically be set\n annotations:\n # kubernetes.io/ingress.class: nginx\n\n ## The list of hostnames to be covered with this ingress record.\n ## Most likely this will be just one host, but in the event more hosts are needed, this is an array\n hosts:\n - name: mongodb.local\n path: /\n\n ## The tls configuration for the ingress\n ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n tls:\n - hosts:\n - mongodb.local\n secretName: mongodb.local-tls\n\n secrets:\n ## If you're providing your own certificates, please use this to add the certificates as secrets\n ## key and certificate should start with -----BEGIN CERTIFICATE----- or\n ## -----BEGIN RSA PRIVATE KEY-----\n ##\n ## name should line up with a tlsSecret set further up\n ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set\n ##\n ## It is also possible to create and manage the certificates outside of this helm chart\n ## Please see README.md for more information\n # - name: airflow.local-tls\n # key:\n # certificate:\n\n## Configure the options for init containers to be run before the main app containers\n## are started. All init containers are run sequentially and must exit without errors\n## for the next one to be started.\n## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\n# extraInitContainers: |\n# - name: do-something\n# image: busybox\n# command: ['do', 'something']\n\n## Configure extra options for liveness and readiness probes\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)\nlivenessProbe:\n enabled: true\n initialDelaySeconds: 30\n periodSeconds: 10\n timeoutSeconds: 5\n failureThreshold: 6\n successThreshold: 1\nreadinessProbe:\n enabled: true\n initialDelaySeconds: 5\n periodSeconds: 10\n timeoutSeconds: 5\n failureThreshold: 6\n successThreshold: 1\n\n# Define custom config map with init scripts\ninitConfigMap: {}\n# name: \"init-config-map\"\n\n## Entries for the MongoDB config file. For documentation of all options, see:\n## http://docs.mongodb.org/manual/reference/configuration-options/\n##\nconfigmap:\n# # where and how to store data.\n# storage:\n# dbPath: /bitnami/mongodb/data/db\n# journal:\n# enabled: true\n# directoryPerDB: false\n# # where to write logging data.\n# systemLog:\n# destination: file\n# quiet: false\n# logAppend: true\n# logRotate: reopen\n# path: /opt/bitnami/mongodb/logs/mongodb.log\n# verbosity: 0\n# # network interfaces\n# net:\n# port: 27017\n# unixDomainSocket:\n# enabled: true\n# pathPrefix: /opt/bitnami/mongodb/tmp\n# ipv6: false\n# bindIpAll: true\n# # replica set options\n# #replication:\n# #replSetName: replicaset\n# #enableMajorityReadConcern: true\n# # process management options\n# processManagement:\n# fork: false\n# pidFilePath: /opt/bitnami/mongodb/tmp/mongodb.pid\n# # set parameter options\n# setParameter:\n# enableLocalhostAuthBypass: true\n# # security options\n# security:\n# authorization: disabled\n# #keyFile: /opt/bitnami/mongodb/conf/keyfile\n\n## Prometheus Exporter / Metrics\n##\nmetrics:\n enabled: true\n\n image:\n registry: docker.io\n repository: bitnami/mongodb-exporter\n tag: 0.10.0-debian-10-r27\n pullPolicy: IfNotPresent\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n\n ## String with extra arguments to the metrics exporter\n ## ref: https://github.com/percona/mongodb_exporter/blob/master/mongodb_exporter.go\n extraArgs: \"\"\n\n ## Metrics exporter resource requests and limits\n ## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n ##\n # resources: {}\n\n ## Metrics exporter liveness and readiness probes\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)\n livenessProbe:\n enabled: true\n initialDelaySeconds: 15\n periodSeconds: 5\n timeoutSeconds: 5\n failureThreshold: 3\n successThreshold: 1\n readinessProbe:\n enabled: true\n initialDelaySeconds: 5\n periodSeconds: 5\n timeoutSeconds: 1\n failureThreshold: 3\n successThreshold: 1\n\n ## Metrics exporter pod Annotation\n podAnnotations:\n prometheus.io/scrape: \"true\"\n prometheus.io/port: \"9216\"\n\n ## Prometheus Service Monitor\n ## ref: https://github.com/coreos/prometheus-operator\n ## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md\n serviceMonitor:\n ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry\n enabled: false\n\n ## Specify a namespace if needed\n # namespace: monitoring\n\n ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec\n additionalLabels: {}\n\n ## Specify Metric Relabellings to add to the scrape endpoint\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint\n # relabellings:\n\n alerting:\n ## Define individual alerting rules as required\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#rulegroup\n ## https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/\n rules: {}\n\n ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Prometheus Rules to work with\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec\n additionalLabels: {}","position":{"start":{"line":115,"column":1,"offset":3500},"end":{"line":620,"column":31,"offset":21023},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":622,"column":4,"offset":21028},"end":{"line":622,"column":11,"offset":21035},"indent":[]}}],"position":{"start":{"line":622,"column":1,"offset":21025},"end":{"line":622,"column":11,"offset":21035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":624,"column":1,"offset":21037},"end":{"line":624,"column":74,"offset":21110},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":624,"column":76,"offset":21112},"end":{"line":624,"column":83,"offset":21119},"indent":[]}}],"position":{"start":{"line":624,"column":74,"offset":21110},"end":{"line":624,"column":85,"offset":21121},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":624,"column":85,"offset":21121},"end":{"line":627,"column":76,"offset":21502},"indent":[1,1,1]}}],"position":{"start":{"line":624,"column":1,"offset":21037},"end":{"line":627,"column":76,"offset":21502},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":629,"column":1,"offset":21504},"end":{"line":629,"column":47,"offset":21550},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":631,"column":1,"offset":21552},"end":{"line":631,"column":26,"offset":21577},"indent":[]}}],"position":{"start":{"line":631,"column":1,"offset":21552},"end":{"line":631,"column":26,"offset":21577},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: factory\nspec:\n replicas: 1\n selector:\n matchLabels:\n app: factory\n minReadySeconds: 10\n strategy:\n type: RollingUpdate\n rollingUpdate:\n maxUnavailable: 1\n maxSurge: 1\n template:\n metadata:\n labels:\n app: factory\n spec:\n containers:\n - name: machinery\n image: cedricvers/factory-buildx:1.0.5\n ports:\n - containerPort: 80\n - containerPort: 8081\n env:\n - name: MACHINERY_VERSION\n value: \"1.0.1\"\n - name: FACTORY_ENVIRONMENT\n value: \"kubernetes\"\n - name: FACTORY_PWD\n value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"\n - name: MONGODB_HOST\n value: \"mongodb\"\n - name: MONGODB_DATABASE_CREDENTIALS\n value: \"admin\"\n - name: MONGODB_USERNAME\n value: \"root\"\n - name: MONGODB_PASSWORD\n value: \"9832sfascvn31\"\n - name: MQTT_URL\n value: \"tcp://127.0.0.1:1883\"\n - name: MQTT_USERNAME\n value: \"\"\n - name: MQTT_PASSWORD\n value: \"\"\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: factory\n labels:\n app: factory\nspec:\n ports:\n - port: 80\n targetPort: 80\n name: frontend\n protocol: TCP\n - port: 8081\n name: backend\n targetPort: 8081\n protocol: TCP\n selector:\n app: factory\n---\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n name: factory\n annotations:\n kubernetes.io/ingress.class: traefik\nspec:\n rules:\n - host: factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 80\n - host: api.factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 8081","position":{"start":{"line":633,"column":1,"offset":21579},"end":{"line":721,"column":32,"offset":23773},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Running","position":{"start":{"line":723,"column":3,"offset":23777},"end":{"line":723,"column":10,"offset":23784},"indent":[]}}],"position":{"start":{"line":723,"column":1,"offset":23775},"end":{"line":723,"column":10,"offset":23784},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":725,"column":1,"offset":23786},"end":{"line":725,"column":94,"offset":23879},"indent":[]}}],"position":{"start":{"line":725,"column":1,"offset":23786},"end":{"line":725,"column":94,"offset":23879},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":727,"column":5,"offset":23885},"end":{"line":727,"column":12,"offset":23892},"indent":[]}}],"position":{"start":{"line":727,"column":5,"offset":23885},"end":{"line":727,"column":12,"offset":23892},"indent":[]}}],"position":{"start":{"line":727,"column":1,"offset":23881},"end":{"line":727,"column":12,"offset":23892},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":728,"column":5,"offset":23897},"end":{"line":728,"column":12,"offset":23904},"indent":[]}}],"position":{"start":{"line":728,"column":5,"offset":23897},"end":{"line":728,"column":12,"offset":23904},"indent":[]}}],"position":{"start":{"line":728,"column":1,"offset":23893},"end":{"line":728,"column":12,"offset":23904},"indent":[]}}],"position":{"start":{"line":727,"column":1,"offset":23881},"end":{"line":728,"column":12,"offset":23904},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":730,"column":1,"offset":23906},"end":{"line":730,"column":26,"offset":23931},"indent":[]}}],"position":{"start":{"line":730,"column":1,"offset":23906},"end":{"line":730,"column":26,"offset":23931},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":732,"column":1,"offset":23933},"end":{"line":736,"column":73,"offset":24245},"indent":[1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":739,"column":1,"offset":24248},"end":{"line":739,"column":31,"offset":24278},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":739,"column":31,"offset":24278}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`## Global Docker image parameters`}{`\n`}{`## Please, note that this will override the image parameters, including dependencies, configured to use the global value`}{`\n`}{`## Current available global Docker image parameters: imageRegistry and imagePullSecrets`}{`\n`}{`##`}{`\n`}{`# global:`}{`\n`}{`#   imageRegistry: myRegistryName`}{`\n`}{`#   imagePullSecrets:`}{`\n`}{`#     - myRegistryKeySecretName`}{`\n`}{`#   storageClass: myStorageClass`}{`\n`}{`\n`}{`image:`}{`\n`}{`  ## Bitnami MongoDB registry`}{`\n`}{`  ##`}{`\n`}{`  registry: docker.io`}{`\n`}{`  ## Bitnami MongoDB image name`}{`\n`}{`  ##`}{`\n`}{`  repository: bitnami/mongodb`}{`\n`}{`  ## Bitnami MongoDB image tag`}{`\n`}{`  ## ref: https://hub.docker.com/r/bitnami/mongodb/tags/`}{`\n`}{`  ##`}{`\n`}{`  tag: 4.2.3-debian-10-r31`}{`\n`}{`  ## Specify a imagePullPolicy`}{`\n`}{`  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images`}{`\n`}{`  ##`}{`\n`}{`  pullPolicy: IfNotPresent`}{`\n`}{`  ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`  ## Secrets must be manually created in the namespace.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`  ##`}{`\n`}{`  # pullSecrets:`}{`\n`}{`  #   - myRegistryKeySecretName`}{`\n`}{`\n`}{`  ## Set to true if you would like to see extra information on logs`}{`\n`}{`  ## It turns on Bitnami debugging in minideb-extras-base`}{`\n`}{`  ## ref:  https://github.com/bitnami/minideb-extras-base`}{`\n`}{`  debug: false`}{`\n`}{`\n`}{`## String to partially override mongodb.fullname template (will maintain the release name)`}{`\n`}{`##`}{`\n`}{`# nameOverride:`}{`\n`}{`\n`}{`## String to fully override mongodb.fullname template`}{`\n`}{`##`}{`\n`}{`# fullnameOverride:`}{`\n`}{`\n`}{`# Add custom extra environment variables to all the MongoDB containers`}{`\n`}{`# extraEnvVars:`}{`\n`}{`\n`}{`## Init containers parameters:`}{`\n`}{`## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.`}{`\n`}{`##`}{`\n`}{`volumePermissions:`}{`\n`}{`  enabled: false`}{`\n`}{`  image:`}{`\n`}{`    registry: docker.io`}{`\n`}{`    repository: bitnami/minideb`}{`\n`}{`    tag: buster`}{`\n`}{`    pullPolicy: Always`}{`\n`}{`    ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`    ## Secrets must be manually created in the namespace.`}{`\n`}{`    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`    ##`}{`\n`}{`    # pullSecrets:`}{`\n`}{`    #   - myRegistryKeySecretName`}{`\n`}{`  resources: {}`}{`\n`}{`\n`}{`## Enable authentication`}{`\n`}{`## ref: https://docs.mongodb.com/manual/tutorial/enable-authentication/`}{`\n`}{`#`}{`\n`}{`usePassword: true`}{`\n`}{`# existingSecret: name-of-existing-secret`}{`\n`}{`\n`}{`## MongoDB admin password`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#setting-the-root-password-on-first-run`}{`\n`}{`##`}{`\n`}{`mongodbRootPassword: 9832sfascvn31`}{`\n`}{`\n`}{`## MongoDB custom user and database`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#creating-a-user-and-database-on-first-run`}{`\n`}{`##`}{`\n`}{`# mongodbUsername: username`}{`\n`}{`# mongodbPassword: password`}{`\n`}{`# mongodbDatabase: database`}{`\n`}{`\n`}{`## Whether enable/disable IPv6 on MongoDB`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-ipv6`}{`\n`}{`##`}{`\n`}{`mongodbEnableIPv6: false`}{`\n`}{`\n`}{`## Whether enable/disable DirectoryPerDB on MongoDB`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-directoryperdb`}{`\n`}{`##`}{`\n`}{`mongodbDirectoryPerDB: false`}{`\n`}{`\n`}{`## MongoDB System Log configuration`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb#configuring-system-log-verbosity-level`}{`\n`}{`##`}{`\n`}{`mongodbSystemLogVerbosity: 0`}{`\n`}{`mongodbDisableSystemLog: false`}{`\n`}{`\n`}{`## MongoDB additional command line flags`}{`\n`}{`##`}{`\n`}{`## Can be used to specify command line flags, for example:`}{`\n`}{`##`}{`\n`}{`## mongodbExtraFlags:`}{`\n`}{`##  - \"--wiredTigerCacheSizeGB=2\"`}{`\n`}{`mongodbExtraFlags: []`}{`\n`}{`\n`}{`## Pod Security Context`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/`}{`\n`}{`##`}{`\n`}{`securityContext:`}{`\n`}{`  enabled: true`}{`\n`}{`  fsGroup: 1001`}{`\n`}{`  runAsUser: 1001`}{`\n`}{`\n`}{`## Kubernetes Cluster Domain`}{`\n`}{`clusterDomain: cluster.local`}{`\n`}{`\n`}{`## Kubernetes service type`}{`\n`}{`service:`}{`\n`}{`  ## Specify an explicit service name.`}{`\n`}{`  # name: svc-mongo`}{`\n`}{`  ## Provide any additional annotations which may be required.`}{`\n`}{`  ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart`}{`\n`}{`  annotations: {}`}{`\n`}{`  type: ClusterIP`}{`\n`}{`  # clusterIP: None`}{`\n`}{`  port: 27017`}{`\n`}{`\n`}{`  ## Specify the nodePort value for the LoadBalancer and NodePort service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport`}{`\n`}{`  ##`}{`\n`}{`  # nodePort:`}{`\n`}{`\n`}{`  ## Specify the externalIP value ClusterIP service type.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips`}{`\n`}{`  # externalIPs: []`}{`\n`}{`\n`}{`  ## Specify the loadBalancerIP value for LoadBalancer service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer`}{`\n`}{`  ##`}{`\n`}{`  # loadBalancerIP:`}{`\n`}{`\n`}{`  ## Specify the loadBalancerSourceRanges value for LoadBalancer service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service`}{`\n`}{`  ##`}{`\n`}{`  # loadBalancerSourceRanges: []`}{`\n`}{`\n`}{`## Use StatefulSet instead of Deployment when deploying standalone`}{`\n`}{`useStatefulSet: false`}{`\n`}{`\n`}{`## Setting up replication`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb#setting-up-a-replication`}{`\n`}{`#`}{`\n`}{`replicaSet:`}{`\n`}{`  ## Whether to create a MongoDB replica set for high availability or not`}{`\n`}{`  enabled: false`}{`\n`}{`  useHostnames: true`}{`\n`}{`\n`}{`  ## Name of the replica set`}{`\n`}{`  ##`}{`\n`}{`  name: rs0`}{`\n`}{`\n`}{`  ## Key used for replica set authentication`}{`\n`}{`  ##`}{`\n`}{`  # key: key`}{`\n`}{`\n`}{`  ## Number of replicas per each node type`}{`\n`}{`  ##`}{`\n`}{`  replicas:`}{`\n`}{`    secondary: 0`}{`\n`}{`    arbiter: 0`}{`\n`}{`\n`}{`  ## Pod Disruption Budget`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/`}{`\n`}{`  pdb:`}{`\n`}{`    enabled: false`}{`\n`}{`    minAvailable:`}{`\n`}{`      secondary: 1`}{`\n`}{`      arbiter: 1`}{`\n`}{`    # maxUnavailable:`}{`\n`}{`      # secondary: 1`}{`\n`}{`      # arbiter: 1`}{`\n`}{`\n`}{`# Annotations to be added to the deployment or statefulsets`}{`\n`}{`annotations: {}`}{`\n`}{`\n`}{`# Additional labels to apply to the deployment or statefulsets`}{`\n`}{`labels: {}`}{`\n`}{`\n`}{`# Annotations to be added to MongoDB pods`}{`\n`}{`podAnnotations: {}`}{`\n`}{`\n`}{`# Additional pod labels to apply`}{`\n`}{`podLabels: {}`}{`\n`}{`\n`}{`## Use an alternate scheduler, e.g. \"stork\".`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/`}{`\n`}{`##`}{`\n`}{`# schedulerName:`}{`\n`}{`\n`}{`## Configure resource requests and limits`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/compute-resources/`}{`\n`}{`##`}{`\n`}{`resources: {}`}{`\n`}{`# Define separate resources per arbiter, which are less then primary or secondary`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`resourcesArbiter: {}`}{`\n`}{`# limits:`}{`\n`}{`#   cpu: 500m`}{`\n`}{`#   memory: 512Mi`}{`\n`}{`# requests:`}{`\n`}{`#   cpu: 100m`}{`\n`}{`#   memory: 256Mi`}{`\n`}{`\n`}{`## Pod priority`}{`\n`}{`## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/`}{`\n`}{`# priorityClassName: \"\"`}{`\n`}{`\n`}{`## Node selector`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector`}{`\n`}{`nodeSelector: {}`}{`\n`}{`\n`}{`## Affinity`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity`}{`\n`}{`affinity: {}`}{`\n`}{`# Define separate affinity for arbiter pod`}{`\n`}{`affinityArbiter: {}`}{`\n`}{`\n`}{`## Tolerations`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/`}{`\n`}{`tolerations: []`}{`\n`}{`\n`}{`## Add sidecars to the pod`}{`\n`}{`##`}{`\n`}{`## For example:`}{`\n`}{`## sidecars:`}{`\n`}{`##   - name: your-image-name`}{`\n`}{`##     image: your-image`}{`\n`}{`##     imagePullPolicy: Always`}{`\n`}{`##     ports:`}{`\n`}{`##       - name: portname`}{`\n`}{`##         containerPort: 1234`}{`\n`}{`sidecars: []`}{`\n`}{`## Array to add extra volumes`}{`\n`}{`##`}{`\n`}{`extraVolumes: []`}{`\n`}{`## Array to add extra mounts (normally used with extraVolumes)`}{`\n`}{`##`}{`\n`}{`extraVolumeMounts: []`}{`\n`}{`\n`}{`## Add sidecars to the arbiter pod`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`## For example:`}{`\n`}{`## sidecars:`}{`\n`}{`##   - name: your-image-name`}{`\n`}{`##     image: your-image`}{`\n`}{`##     imagePullPolicy: Always`}{`\n`}{`##     ports:`}{`\n`}{`##       - name: portname`}{`\n`}{`##         containerPort: 1234`}{`\n`}{`sidecarsArbiter: []`}{`\n`}{`## Array to add extra volumes to the arbiter`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`extraVolumesArbiter: []`}{`\n`}{`## Array to add extra mounts (normally used with extraVolumes) to the arbiter`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`extraVolumeMountsArbiter: []`}{`\n`}{`\n`}{`## updateStrategy for MongoDB Primary, Secondary and Arbitrer statefulsets`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies`}{`\n`}{`updateStrategy:`}{`\n`}{`  type: RollingUpdate`}{`\n`}{`\n`}{`## Enable persistence using Persistent Volume Claims`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/`}{`\n`}{`##`}{`\n`}{`persistence:`}{`\n`}{`  enabled: true`}{`\n`}{`  ## A manually managed Persistent Volume and Claim`}{`\n`}{`  ## Requires persistence.enabled: true`}{`\n`}{`  ## If defined, PVC must be created manually before volume will be bound`}{`\n`}{`  ##`}{`\n`}{`  # existingClaim:`}{`\n`}{`\n`}{`  ## The path the volume will be mounted at, useful when using different`}{`\n`}{`  ## MongoDB images.`}{`\n`}{`  ##`}{`\n`}{`  mountPath: /bitnami/mongodb`}{`\n`}{`\n`}{`  ## The subdirectory of the volume to mount to, useful in dev environments`}{`\n`}{`  ## and one PV for multiple services.`}{`\n`}{`  ##`}{`\n`}{`  subPath: \"\"`}{`\n`}{`\n`}{`  ## mongodb data Persistent Volume Storage Class`}{`\n`}{`  ## If defined, storageClassName: `}{`\n`}{`  ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning`}{`\n`}{`  ## If undefined (the default) or set to null, no storageClassName spec is`}{`\n`}{`  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on`}{`\n`}{`  ##   GKE, AWS & OpenStack)`}{`\n`}{`  ##`}{`\n`}{`  # storageClass: \"-\"`}{`\n`}{`  accessModes:`}{`\n`}{`    - ReadWriteOnce`}{`\n`}{`  size: 8Gi`}{`\n`}{`  annotations: {}`}{`\n`}{`\n`}{`## Configure the ingress resource that allows you to access the`}{`\n`}{`## MongoDB installation. Set up the URL`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/ingress/`}{`\n`}{`##`}{`\n`}{`ingress:`}{`\n`}{`  ## Set to true to enable ingress record generation`}{`\n`}{`  enabled: false`}{`\n`}{`\n`}{`  ## Set this to true in order to add the corresponding annotations for cert-manager`}{`\n`}{`  certManager: false`}{`\n`}{`\n`}{`  ## Ingress annotations done as key:value pairs`}{`\n`}{`  ## For a full list of possible ingress annotations, please see`}{`\n`}{`  ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md`}{`\n`}{`  ##`}{`\n`}{`  ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: \"true\" will automatically be set`}{`\n`}{`  ## If certManager is set to true, annotation kubernetes.io/tls-acme: \"true\" will automatically be set`}{`\n`}{`  annotations:`}{`\n`}{`  #  kubernetes.io/ingress.class: nginx`}{`\n`}{`\n`}{`  ## The list of hostnames to be covered with this ingress record.`}{`\n`}{`  ## Most likely this will be just one host, but in the event more hosts are needed, this is an array`}{`\n`}{`  hosts:`}{`\n`}{`  - name: mongodb.local`}{`\n`}{`    path: /`}{`\n`}{`\n`}{`  ## The tls configuration for the ingress`}{`\n`}{`  ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls`}{`\n`}{`  tls:`}{`\n`}{`  - hosts:`}{`\n`}{`      - mongodb.local`}{`\n`}{`    secretName: mongodb.local-tls`}{`\n`}{`\n`}{`  secrets:`}{`\n`}{`  ## If you're providing your own certificates, please use this to add the certificates as secrets`}{`\n`}{`  ## key and certificate should start with -----BEGIN CERTIFICATE----- or`}{`\n`}{`  ## -----BEGIN RSA PRIVATE KEY-----`}{`\n`}{`  ##`}{`\n`}{`  ## name should line up with a tlsSecret set further up`}{`\n`}{`  ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set`}{`\n`}{`  ##`}{`\n`}{`  ## It is also possible to create and manage the certificates outside of this helm chart`}{`\n`}{`  ## Please see README.md for more information`}{`\n`}{`  # - name: airflow.local-tls`}{`\n`}{`  #   key:`}{`\n`}{`  #   certificate:`}{`\n`}{`\n`}{`## Configure the options for init containers to be run before the main app containers`}{`\n`}{`## are started. All init containers are run sequentially and must exit without errors`}{`\n`}{`## for the next one to be started.`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/`}{`\n`}{`# extraInitContainers: |`}{`\n`}{`#   - name: do-something`}{`\n`}{`#     image: busybox`}{`\n`}{`#     command: ['do', 'something']`}{`\n`}{`\n`}{`## Configure extra options for liveness and readiness probes`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)`}{`\n`}{`livenessProbe:`}{`\n`}{`  enabled: true`}{`\n`}{`  initialDelaySeconds: 30`}{`\n`}{`  periodSeconds: 10`}{`\n`}{`  timeoutSeconds: 5`}{`\n`}{`  failureThreshold: 6`}{`\n`}{`  successThreshold: 1`}{`\n`}{`readinessProbe:`}{`\n`}{`  enabled: true`}{`\n`}{`  initialDelaySeconds: 5`}{`\n`}{`  periodSeconds: 10`}{`\n`}{`  timeoutSeconds: 5`}{`\n`}{`  failureThreshold: 6`}{`\n`}{`  successThreshold: 1`}{`\n`}{`\n`}{`# Define custom config map with init scripts`}{`\n`}{`initConfigMap: {}`}{`\n`}{`#  name: \"init-config-map\"`}{`\n`}{`\n`}{`## Entries for the MongoDB config file. For documentation of all options, see:`}{`\n`}{`##   http://docs.mongodb.org/manual/reference/configuration-options/`}{`\n`}{`##`}{`\n`}{`configmap:`}{`\n`}{`#  # where and how to store data.`}{`\n`}{`#  storage:`}{`\n`}{`#    dbPath: /bitnami/mongodb/data/db`}{`\n`}{`#    journal:`}{`\n`}{`#      enabled: true`}{`\n`}{`#    directoryPerDB: false`}{`\n`}{`#  # where to write logging data.`}{`\n`}{`#  systemLog:`}{`\n`}{`#    destination: file`}{`\n`}{`#    quiet: false`}{`\n`}{`#    logAppend: true`}{`\n`}{`#    logRotate: reopen`}{`\n`}{`#    path: /opt/bitnami/mongodb/logs/mongodb.log`}{`\n`}{`#    verbosity: 0`}{`\n`}{`#  # network interfaces`}{`\n`}{`#  net:`}{`\n`}{`#    port: 27017`}{`\n`}{`#    unixDomainSocket:`}{`\n`}{`#      enabled: true`}{`\n`}{`#      pathPrefix: /opt/bitnami/mongodb/tmp`}{`\n`}{`#    ipv6: false`}{`\n`}{`#    bindIpAll: true`}{`\n`}{`#  # replica set options`}{`\n`}{`#  #replication:`}{`\n`}{`#    #replSetName: replicaset`}{`\n`}{`#    #enableMajorityReadConcern: true`}{`\n`}{`#  # process management options`}{`\n`}{`#  processManagement:`}{`\n`}{`#     fork: false`}{`\n`}{`#     pidFilePath: /opt/bitnami/mongodb/tmp/mongodb.pid`}{`\n`}{`#  # set parameter options`}{`\n`}{`#  setParameter:`}{`\n`}{`#     enableLocalhostAuthBypass: true`}{`\n`}{`#  # security options`}{`\n`}{`#  security:`}{`\n`}{`#    authorization: disabled`}{`\n`}{`#    #keyFile: /opt/bitnami/mongodb/conf/keyfile`}{`\n`}{`\n`}{`## Prometheus Exporter / Metrics`}{`\n`}{`##`}{`\n`}{`metrics:`}{`\n`}{`  enabled: true`}{`\n`}{`\n`}{`  image:`}{`\n`}{`    registry: docker.io`}{`\n`}{`    repository: bitnami/mongodb-exporter`}{`\n`}{`    tag: 0.10.0-debian-10-r27`}{`\n`}{`    pullPolicy: IfNotPresent`}{`\n`}{`    ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`    ## Secrets must be manually created in the namespace.`}{`\n`}{`    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`    ##`}{`\n`}{`    # pullSecrets:`}{`\n`}{`    #   - myRegistryKeySecretName`}{`\n`}{`\n`}{`  ## String with extra arguments to the metrics exporter`}{`\n`}{`  ## ref: https://github.com/percona/mongodb_exporter/blob/master/mongodb_exporter.go`}{`\n`}{`  extraArgs: \"\"`}{`\n`}{`\n`}{`  ## Metrics exporter resource requests and limits`}{`\n`}{`  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/`}{`\n`}{`  ##`}{`\n`}{`  # resources: {}`}{`\n`}{`\n`}{`  ## Metrics exporter liveness and readiness probes`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)`}{`\n`}{`  livenessProbe:`}{`\n`}{`    enabled: true`}{`\n`}{`    initialDelaySeconds: 15`}{`\n`}{`    periodSeconds: 5`}{`\n`}{`    timeoutSeconds: 5`}{`\n`}{`    failureThreshold: 3`}{`\n`}{`    successThreshold: 1`}{`\n`}{`  readinessProbe:`}{`\n`}{`    enabled: true`}{`\n`}{`    initialDelaySeconds: 5`}{`\n`}{`    periodSeconds: 5`}{`\n`}{`    timeoutSeconds: 1`}{`\n`}{`    failureThreshold: 3`}{`\n`}{`    successThreshold: 1`}{`\n`}{`\n`}{`  ## Metrics exporter pod Annotation`}{`\n`}{`  podAnnotations:`}{`\n`}{`    prometheus.io/scrape: \"true\"`}{`\n`}{`    prometheus.io/port: \"9216\"`}{`\n`}{`\n`}{`  ## Prometheus Service Monitor`}{`\n`}{`  ## ref: https://github.com/coreos/prometheus-operator`}{`\n`}{`  ##      https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md`}{`\n`}{`  serviceMonitor:`}{`\n`}{`    ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry`}{`\n`}{`    enabled: false`}{`\n`}{`\n`}{`    ## Specify a namespace if needed`}{`\n`}{`    # namespace: monitoring`}{`\n`}{`\n`}{`    ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with`}{`\n`}{`    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec`}{`\n`}{`    additionalLabels: {}`}{`\n`}{`\n`}{`    ## Specify Metric Relabellings to add to the scrape endpoint`}{`\n`}{`    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint`}{`\n`}{`    # relabellings:`}{`\n`}{`\n`}{`    alerting:`}{`\n`}{`      ## Define individual alerting rules as required`}{`\n`}{`      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#rulegroup`}{`\n`}{`      ##      https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/`}{`\n`}{`      rules: {}`}{`\n`}{`\n`}{`      ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Prometheus Rules to work with`}{`\n`}{`      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec`}{`\n`}{`      additionalLabels: {}`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`apiVersion: apps/v1`}{`\n`}{`kind: Deployment`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`spec:`}{`\n`}{`  replicas: 1`}{`\n`}{`  selector:`}{`\n`}{`    matchLabels:`}{`\n`}{`      app: factory`}{`\n`}{`  minReadySeconds: 10`}{`\n`}{`  strategy:`}{`\n`}{`    type: RollingUpdate`}{`\n`}{`    rollingUpdate:`}{`\n`}{`      maxUnavailable: 1`}{`\n`}{`      maxSurge: 1`}{`\n`}{`  template:`}{`\n`}{`    metadata:`}{`\n`}{`      labels:`}{`\n`}{`        app: factory`}{`\n`}{`    spec:`}{`\n`}{`      containers:`}{`\n`}{`      - name: machinery`}{`\n`}{`        image: cedricvers/factory-buildx:1.0.5`}{`\n`}{`        ports:`}{`\n`}{`          - containerPort: 80`}{`\n`}{`          - containerPort: 8081`}{`\n`}{`        env:`}{`\n`}{`        - name: MACHINERY_VERSION`}{`\n`}{`          value: \"1.0.1\"`}{`\n`}{`        - name: FACTORY_ENVIRONMENT`}{`\n`}{`          value: \"kubernetes\"`}{`\n`}{`        - name: FACTORY_PWD`}{`\n`}{`          value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"`}{`\n`}{`        - name: MONGODB_HOST`}{`\n`}{`          value: \"mongodb\"`}{`\n`}{`        - name: MONGODB_DATABASE_CREDENTIALS`}{`\n`}{`          value: \"admin\"`}{`\n`}{`        - name: MONGODB_USERNAME`}{`\n`}{`          value: \"root\"`}{`\n`}{`        - name: MONGODB_PASSWORD`}{`\n`}{`          value: \"9832sfascvn31\"`}{`\n`}{`        - name: MQTT_URL`}{`\n`}{`          value: \"tcp://127.0.0.1:1883\"`}{`\n`}{`        - name: MQTT_USERNAME`}{`\n`}{`          value: \"\"`}{`\n`}{`        - name: MQTT_PASSWORD`}{`\n`}{`          value: \"\"`}{`\n`}{`---`}{`\n`}{`apiVersion: v1`}{`\n`}{`kind: Service`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  labels:`}{`\n`}{`    app: factory`}{`\n`}{`spec:`}{`\n`}{`  ports:`}{`\n`}{`  - port: 80`}{`\n`}{`    targetPort: 80`}{`\n`}{`    name: frontend`}{`\n`}{`    protocol: TCP`}{`\n`}{`  - port: 8081`}{`\n`}{`    name: backend`}{`\n`}{`    targetPort: 8081`}{`\n`}{`    protocol: TCP`}{`\n`}{`  selector:`}{`\n`}{`    app: factory`}{`\n`}{`---`}{`\n`}{`apiVersion: extensions/v1beta1`}{`\n`}{`kind: Ingress`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  annotations:`}{`\n`}{`    kubernetes.io/ingress.class: traefik`}{`\n`}{`spec:`}{`\n`}{`  rules:`}{`\n`}{`  - host: factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 80`}{`\n`}{`  - host: api.factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 8081`}
\n

{`Running`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-095fe0fbae51998b7a4231d38a090fb3.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-095fe0fbae51998b7a4231d38a090fb3.json new file mode 100644 index 0000000..426bc36 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-095fe0fbae51998b7a4231d38a090fb3.json @@ -0,0 +1 @@ +{"expireTime":9007200838836934000,"key":"gatsby-plugin-mdx-entire-payload-f34e6ce71acba44151a2d9047eb8f1ad-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":107,"column":4,"offset":3144},"end":{"line":107,"column":11,"offset":3151},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":3141},"end":{"line":107,"column":11,"offset":3151},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}}],"position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":112,"column":1,"offset":3398},"end":{"line":112,"column":78,"offset":3475},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":116,"column":1,"offset":3501},"end":{"line":116,"column":8,"offset":3508},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":118,"column":4,"offset":3513},"end":{"line":118,"column":11,"offset":3520},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3510},"end":{"line":118,"column":11,"offset":3520},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":120,"column":74,"offset":3595},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":120,"column":76,"offset":3597},"end":{"line":120,"column":83,"offset":3604},"indent":[]}}],"position":{"start":{"line":120,"column":74,"offset":3595},"end":{"line":120,"column":85,"offset":3606},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":120,"column":85,"offset":3606},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}}],"position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":125,"column":1,"offset":3989},"end":{"line":125,"column":47,"offset":4035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}}],"position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":129,"column":1,"offset":4064},"end":{"line":129,"column":25,"offset":4088},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":131,"column":3,"offset":4092},"end":{"line":131,"column":25,"offset":4114},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":4090},"end":{"line":131,"column":25,"offset":4114},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":135,"column":12,"offset":4222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4223},"end":{"line":136,"column":12,"offset":4234},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4235},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":137,"column":12,"offset":4246},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":141,"column":1,"offset":4275},"end":{"line":145,"column":73,"offset":4587},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":147,"column":4,"offset":4592},"end":{"line":147,"column":21,"offset":4609},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4589},"end":{"line":147,"column":21,"offset":4609},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure your DNS server. Look for the\nTraefik service, and copy its external ip. Add this IP to your DNS server, so it will resolve your domains:","position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":108,"offset":4851},"indent":[1]}}],"position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":108,"offset":4851},"indent":[1]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"traefik.domain.com (change to your domain)","position":{"start":{"line":152,"column":5,"offset":4857},"end":{"line":152,"column":47,"offset":4899},"indent":[]}}],"position":{"start":{"line":152,"column":5,"offset":4857},"end":{"line":152,"column":47,"offset":4899},"indent":[]}}],"position":{"start":{"line":152,"column":1,"offset":4853},"end":{"line":152,"column":47,"offset":4899},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"factory.domain.com (change to your domain).","position":{"start":{"line":153,"column":5,"offset":4904},"end":{"line":153,"column":48,"offset":4947},"indent":[]}}],"position":{"start":{"line":153,"column":5,"offset":4904},"end":{"line":153,"column":48,"offset":4947},"indent":[]}}],"position":{"start":{"line":153,"column":1,"offset":4900},"end":{"line":153,"column":48,"offset":4947},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"api.factory.domain.com (change to your domain).","position":{"start":{"line":154,"column":5,"offset":4952},"end":{"line":154,"column":52,"offset":4999},"indent":[]}}],"position":{"start":{"line":154,"column":5,"offset":4952},"end":{"line":154,"column":52,"offset":4999},"indent":[]}}],"position":{"start":{"line":154,"column":1,"offset":4948},"end":{"line":154,"column":52,"offset":4999},"indent":[]}}],"position":{"start":{"line":152,"column":1,"offset":4853},"end":{"line":154,"column":52,"offset":4999},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Look for the external ip, by listing the services.","position":{"start":{"line":156,"column":1,"offset":5001},"end":{"line":156,"column":51,"offset":5051},"indent":[]}}],"position":{"start":{"line":156,"column":1,"offset":5001},"end":{"line":156,"column":51,"offset":5051},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":" $ kubectl get svc\n NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n factory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\n kubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\n mongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\n--> traefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h\n traefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":158,"column":1,"offset":5053},"end":{"line":164,"column":109,"offset":5730},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Access the system","position":{"start":{"line":167,"column":4,"offset":5736},"end":{"line":167,"column":21,"offset":5753},"indent":[]}}],"position":{"start":{"line":167,"column":1,"offset":5733},"end":{"line":167,"column":21,"offset":5753},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating","position":{"start":{"line":169,"column":1,"offset":5755},"end":{"line":169,"column":129,"offset":5883},"indent":[]}}],"position":{"start":{"line":169,"column":1,"offset":5755},"end":{"line":169,"column":129,"offset":5883},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":172,"column":1,"offset":5886},"end":{"line":172,"column":31,"offset":5916},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":172,"column":31,"offset":5916}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure your DNS server. Look for the\nTraefik service, and copy its external ip. Add this IP to your DNS server, so it will resolve your domains:`}

\n
    \n
  • {`traefik.domain.com (change to your domain)`}
  • \n
  • {`factory.domain.com (change to your domain).`}
  • \n
  • {`api.factory.domain.com (change to your domain).`}
  • \n
\n

{`Look for the external ip, by listing the services.`}

\n
{`    $ kubectl get svc`}{`\n`}{`    NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`    factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`    kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`    mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`--> traefik              LoadBalancer   10.0.10.97    34.66.138.141   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`    traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n

{`Access the system`}

\n

{`Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0e72b13555d440ef18d0e78cb5fa3af8.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0e72b13555d440ef18d0e78cb5fa3af8.json deleted file mode 100644 index 5b52c7c..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0e72b13555d440ef18d0e78cb5fa3af8.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838682322000,"key":"gatsby-plugin-mdx-entire-payload-9cfb82031157441815771b643a0ae0c7-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide the high availability and fail over requirements our customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":243,"offset":1318},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":243,"offset":1318},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":23,"column":1,"offset":1321},"end":{"line":23,"column":31,"offset":1351},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":23,"column":31,"offset":1351}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide the high availability and fail over requirements our customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0eb20e9469c493e345d4fd5478bcaf16.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0eb20e9469c493e345d4fd5478bcaf16.json new file mode 100644 index 0000000..e978ce8 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0eb20e9469c493e345d4fd5478bcaf16.json @@ -0,0 +1 @@ +{"expireTime":9007200838830625000,"key":"gatsby-plugin-mdx-entire-payload-0e57e4c461047b878c18ee30a5383f07-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"## Global Docker image parameters\n## Please, note that this will override the image parameters, including dependencies, configured to use the global value\n## Current available global Docker image parameters: imageRegistry and imagePullSecrets\n##\n# global:\n# imageRegistry: myRegistryName\n# imagePullSecrets:\n# - myRegistryKeySecretName\n# storageClass: myStorageClass\n\nimage:\n ## Bitnami MongoDB registry\n ##\n registry: docker.io\n ## Bitnami MongoDB image name\n ##\n repository: bitnami/mongodb\n ## Bitnami MongoDB image tag\n ## ref: https://hub.docker.com/r/bitnami/mongodb/tags/\n ##\n tag: 4.2.3-debian-10-r31\n ## Specify a imagePullPolicy\n ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n ##\n pullPolicy: IfNotPresent\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n\n ## Set to true if you would like to see extra information on logs\n ## It turns on Bitnami debugging in minideb-extras-base\n ## ref: https://github.com/bitnami/minideb-extras-base\n debug: false\n\n## String to partially override mongodb.fullname template (will maintain the release name)\n##\n# nameOverride:\n\n## String to fully override mongodb.fullname template\n##\n# fullnameOverride:\n\n# Add custom extra environment variables to all the MongoDB containers\n# extraEnvVars:\n\n## Init containers parameters:\n## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.\n##\nvolumePermissions:\n enabled: false\n image:\n registry: docker.io\n repository: bitnami/minideb\n tag: buster\n pullPolicy: Always\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n resources: {}\n\n## Enable authentication\n## ref: https://docs.mongodb.com/manual/tutorial/enable-authentication/\n#\nusePassword: true\n# existingSecret: name-of-existing-secret\n\n## MongoDB admin password\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#setting-the-root-password-on-first-run\n##\nmongodbRootPassword: 9832sfascvn31\n\n## MongoDB custom user and database\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#creating-a-user-and-database-on-first-run\n##\n# mongodbUsername: username\n# mongodbPassword: password\n# mongodbDatabase: database\n\n## Whether enable/disable IPv6 on MongoDB\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-ipv6\n##\nmongodbEnableIPv6: false\n\n## Whether enable/disable DirectoryPerDB on MongoDB\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-directoryperdb\n##\nmongodbDirectoryPerDB: false\n\n## MongoDB System Log configuration\n## ref: https://github.com/bitnami/bitnami-docker-mongodb#configuring-system-log-verbosity-level\n##\nmongodbSystemLogVerbosity: 0\nmongodbDisableSystemLog: false\n\n## MongoDB additional command line flags\n##\n## Can be used to specify command line flags, for example:\n##\n## mongodbExtraFlags:\n## - \"--wiredTigerCacheSizeGB=2\"\nmongodbExtraFlags: []\n\n## Pod Security Context\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n##\nsecurityContext:\n enabled: true\n fsGroup: 1001\n runAsUser: 1001\n\n## Kubernetes Cluster Domain\nclusterDomain: cluster.local\n\n## Kubernetes service type\nservice:\n ## Specify an explicit service name.\n # name: svc-mongo\n ## Provide any additional annotations which may be required.\n ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart\n annotations: {}\n type: ClusterIP\n # clusterIP: None\n port: 27017\n\n ## Specify the nodePort value for the LoadBalancer and NodePort service types.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n ##\n # nodePort:\n\n ## Specify the externalIP value ClusterIP service type.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips\n # externalIPs: []\n\n ## Specify the loadBalancerIP value for LoadBalancer service types.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer\n ##\n # loadBalancerIP:\n\n ## Specify the loadBalancerSourceRanges value for LoadBalancer service types.\n ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service\n ##\n # loadBalancerSourceRanges: []\n\n## Use StatefulSet instead of Deployment when deploying standalone\nuseStatefulSet: false\n\n## Setting up replication\n## ref: https://github.com/bitnami/bitnami-docker-mongodb#setting-up-a-replication\n#\nreplicaSet:\n ## Whether to create a MongoDB replica set for high availability or not\n enabled: false\n useHostnames: true\n\n ## Name of the replica set\n ##\n name: rs0\n\n ## Key used for replica set authentication\n ##\n # key: key\n\n ## Number of replicas per each node type\n ##\n replicas:\n secondary: 0\n arbiter: 0\n\n ## Pod Disruption Budget\n ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/\n pdb:\n enabled: false\n minAvailable:\n secondary: 1\n arbiter: 1\n # maxUnavailable:\n # secondary: 1\n # arbiter: 1\n\n# Annotations to be added to the deployment or statefulsets\nannotations: {}\n\n# Additional labels to apply to the deployment or statefulsets\nlabels: {}\n\n# Annotations to be added to MongoDB pods\npodAnnotations: {}\n\n# Additional pod labels to apply\npodLabels: {}\n\n## Use an alternate scheduler, e.g. \"stork\".\n## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n##\n# schedulerName:\n\n## Configure resource requests and limits\n## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n##\nresources: {}\n# Define separate resources per arbiter, which are less then primary or secondary\n# used only when replica set is enabled\nresourcesArbiter: {}\n# limits:\n# cpu: 500m\n# memory: 512Mi\n# requests:\n# cpu: 100m\n# memory: 256Mi\n\n## Pod priority\n## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/\n# priorityClassName: \"\"\n\n## Node selector\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector\nnodeSelector: {}\n\n## Affinity\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\naffinity: {}\n# Define separate affinity for arbiter pod\naffinityArbiter: {}\n\n## Tolerations\n## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\ntolerations: []\n\n## Add sidecars to the pod\n##\n## For example:\n## sidecars:\n## - name: your-image-name\n## image: your-image\n## imagePullPolicy: Always\n## ports:\n## - name: portname\n## containerPort: 1234\nsidecars: []\n## Array to add extra volumes\n##\nextraVolumes: []\n## Array to add extra mounts (normally used with extraVolumes)\n##\nextraVolumeMounts: []\n\n## Add sidecars to the arbiter pod\n# used only when replica set is enabled\n##\n## For example:\n## sidecars:\n## - name: your-image-name\n## image: your-image\n## imagePullPolicy: Always\n## ports:\n## - name: portname\n## containerPort: 1234\nsidecarsArbiter: []\n## Array to add extra volumes to the arbiter\n# used only when replica set is enabled\n##\nextraVolumesArbiter: []\n## Array to add extra mounts (normally used with extraVolumes) to the arbiter\n# used only when replica set is enabled\n##\nextraVolumeMountsArbiter: []\n\n## updateStrategy for MongoDB Primary, Secondary and Arbitrer statefulsets\n## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies\nupdateStrategy:\n type: RollingUpdate\n\n## Enable persistence using Persistent Volume Claims\n## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/\n##\npersistence:\n enabled: true\n ## A manually managed Persistent Volume and Claim\n ## Requires persistence.enabled: true\n ## If defined, PVC must be created manually before volume will be bound\n ##\n # existingClaim:\n\n ## The path the volume will be mounted at, useful when using different\n ## MongoDB images.\n ##\n mountPath: /bitnami/mongodb\n\n ## The subdirectory of the volume to mount to, useful in dev environments\n ## and one PV for multiple services.\n ##\n subPath: \"\"\n\n ## mongodb data Persistent Volume Storage Class\n ## If defined, storageClassName: \n ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning\n ## If undefined (the default) or set to null, no storageClassName spec is\n ## set, choosing the default provisioner. (gp2 on AWS, standard on\n ## GKE, AWS & OpenStack)\n ##\n # storageClass: \"-\"\n accessModes:\n - ReadWriteOnce\n size: 8Gi\n annotations: {}\n\n## Configure the ingress resource that allows you to access the\n## MongoDB installation. Set up the URL\n## ref: http://kubernetes.io/docs/user-guide/ingress/\n##\ningress:\n ## Set to true to enable ingress record generation\n enabled: false\n\n ## Set this to true in order to add the corresponding annotations for cert-manager\n certManager: false\n\n ## Ingress annotations done as key:value pairs\n ## For a full list of possible ingress annotations, please see\n ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md\n ##\n ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: \"true\" will automatically be set\n ## If certManager is set to true, annotation kubernetes.io/tls-acme: \"true\" will automatically be set\n annotations:\n # kubernetes.io/ingress.class: nginx\n\n ## The list of hostnames to be covered with this ingress record.\n ## Most likely this will be just one host, but in the event more hosts are needed, this is an array\n hosts:\n - name: mongodb.local\n path: /\n\n ## The tls configuration for the ingress\n ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n tls:\n - hosts:\n - mongodb.local\n secretName: mongodb.local-tls\n\n secrets:\n ## If you're providing your own certificates, please use this to add the certificates as secrets\n ## key and certificate should start with -----BEGIN CERTIFICATE----- or\n ## -----BEGIN RSA PRIVATE KEY-----\n ##\n ## name should line up with a tlsSecret set further up\n ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set\n ##\n ## It is also possible to create and manage the certificates outside of this helm chart\n ## Please see README.md for more information\n # - name: airflow.local-tls\n # key:\n # certificate:\n\n## Configure the options for init containers to be run before the main app containers\n## are started. All init containers are run sequentially and must exit without errors\n## for the next one to be started.\n## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\n# extraInitContainers: |\n# - name: do-something\n# image: busybox\n# command: ['do', 'something']\n\n## Configure extra options for liveness and readiness probes\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)\nlivenessProbe:\n enabled: true\n initialDelaySeconds: 30\n periodSeconds: 10\n timeoutSeconds: 5\n failureThreshold: 6\n successThreshold: 1\nreadinessProbe:\n enabled: true\n initialDelaySeconds: 5\n periodSeconds: 10\n timeoutSeconds: 5\n failureThreshold: 6\n successThreshold: 1\n\n# Define custom config map with init scripts\ninitConfigMap: {}\n# name: \"init-config-map\"\n\n## Entries for the MongoDB config file. For documentation of all options, see:\n## http://docs.mongodb.org/manual/reference/configuration-options/\n##\nconfigmap:\n# # where and how to store data.\n# storage:\n# dbPath: /bitnami/mongodb/data/db\n# journal:\n# enabled: true\n# directoryPerDB: false\n# # where to write logging data.\n# systemLog:\n# destination: file\n# quiet: false\n# logAppend: true\n# logRotate: reopen\n# path: /opt/bitnami/mongodb/logs/mongodb.log\n# verbosity: 0\n# # network interfaces\n# net:\n# port: 27017\n# unixDomainSocket:\n# enabled: true\n# pathPrefix: /opt/bitnami/mongodb/tmp\n# ipv6: false\n# bindIpAll: true\n# # replica set options\n# #replication:\n# #replSetName: replicaset\n# #enableMajorityReadConcern: true\n# # process management options\n# processManagement:\n# fork: false\n# pidFilePath: /opt/bitnami/mongodb/tmp/mongodb.pid\n# # set parameter options\n# setParameter:\n# enableLocalhostAuthBypass: true\n# # security options\n# security:\n# authorization: disabled\n# #keyFile: /opt/bitnami/mongodb/conf/keyfile\n\n## Prometheus Exporter / Metrics\n##\nmetrics:\n enabled: true\n\n image:\n registry: docker.io\n repository: bitnami/mongodb-exporter\n tag: 0.10.0-debian-10-r27\n pullPolicy: IfNotPresent\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n\n ## String with extra arguments to the metrics exporter\n ## ref: https://github.com/percona/mongodb_exporter/blob/master/mongodb_exporter.go\n extraArgs: \"\"\n\n ## Metrics exporter resource requests and limits\n ## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n ##\n # resources: {}\n\n ## Metrics exporter liveness and readiness probes\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)\n livenessProbe:\n enabled: true\n initialDelaySeconds: 15\n periodSeconds: 5\n timeoutSeconds: 5\n failureThreshold: 3\n successThreshold: 1\n readinessProbe:\n enabled: true\n initialDelaySeconds: 5\n periodSeconds: 5\n timeoutSeconds: 1\n failureThreshold: 3\n successThreshold: 1\n\n ## Metrics exporter pod Annotation\n podAnnotations:\n prometheus.io/scrape: \"true\"\n prometheus.io/port: \"9216\"\n\n ## Prometheus Service Monitor\n ## ref: https://github.com/coreos/prometheus-operator\n ## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md\n serviceMonitor:\n ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry\n enabled: false\n\n ## Specify a namespace if needed\n # namespace: monitoring\n\n ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec\n additionalLabels: {}\n\n ## Specify Metric Relabellings to add to the scrape endpoint\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint\n # relabellings:\n\n alerting:\n ## Define individual alerting rules as required\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#rulegroup\n ## https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/\n rules: {}\n\n ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Prometheus Rules to work with\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec\n additionalLabels: {}","position":{"start":{"line":115,"column":1,"offset":3500},"end":{"line":620,"column":31,"offset":21023},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":622,"column":4,"offset":21028},"end":{"line":622,"column":11,"offset":21035},"indent":[]}}],"position":{"start":{"line":622,"column":1,"offset":21025},"end":{"line":622,"column":11,"offset":21035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":624,"column":1,"offset":21037},"end":{"line":624,"column":74,"offset":21110},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":624,"column":76,"offset":21112},"end":{"line":624,"column":83,"offset":21119},"indent":[]}}],"position":{"start":{"line":624,"column":74,"offset":21110},"end":{"line":624,"column":85,"offset":21121},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":624,"column":85,"offset":21121},"end":{"line":627,"column":76,"offset":21502},"indent":[1,1,1]}}],"position":{"start":{"line":624,"column":1,"offset":21037},"end":{"line":627,"column":76,"offset":21502},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":629,"column":1,"offset":21504},"end":{"line":629,"column":47,"offset":21550},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":631,"column":1,"offset":21552},"end":{"line":631,"column":26,"offset":21577},"indent":[]}}],"position":{"start":{"line":631,"column":1,"offset":21552},"end":{"line":631,"column":26,"offset":21577},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: factory\nspec:\n replicas: 1\n selector:\n matchLabels:\n app: factory\n minReadySeconds: 10\n strategy:\n type: RollingUpdate\n rollingUpdate:\n maxUnavailable: 1\n maxSurge: 1\n template:\n metadata:\n labels:\n app: factory\n spec:\n containers:\n - name: machinery\n image: cedricvers/factory-buildx:1.0.5\n ports:\n - containerPort: 80\n - containerPort: 8081\n env:\n - name: MACHINERY_VERSION\n value: \"1.0.1\"\n - name: FACTORY_ENVIRONMENT\n value: \"kubernetes\"\n - name: FACTORY_PWD\n value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"\n - name: MONGODB_HOST\n value: \"mongodb\"\n - name: MONGODB_DATABASE_CREDENTIALS\n value: \"admin\"\n - name: MONGODB_USERNAME\n value: \"root\"\n - name: MONGODB_PASSWORD\n value: \"9832sfascvn31\"\n - name: MQTT_URL\n value: \"tcp://127.0.0.1:1883\"\n - name: MQTT_USERNAME\n value: \"\"\n - name: MQTT_PASSWORD\n value: \"\"\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: factory\n labels:\n app: factory\nspec:\n ports:\n - port: 80\n targetPort: 80\n name: frontend\n protocol: TCP\n - port: 8081\n name: backend\n targetPort: 8081\n protocol: TCP\n selector:\n app: factory\n---\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n name: factory\n annotations:\n kubernetes.io/ingress.class: traefik\nspec:\n rules:\n - host: factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 80\n - host: api.factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 8081","position":{"start":{"line":633,"column":1,"offset":21579},"end":{"line":721,"column":32,"offset":23773},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Running","position":{"start":{"line":723,"column":3,"offset":23777},"end":{"line":723,"column":10,"offset":23784},"indent":[]}}],"position":{"start":{"line":723,"column":1,"offset":23775},"end":{"line":723,"column":10,"offset":23784},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":725,"column":1,"offset":23786},"end":{"line":725,"column":94,"offset":23879},"indent":[]}}],"position":{"start":{"line":725,"column":1,"offset":23786},"end":{"line":725,"column":94,"offset":23879},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[],"position":{"start":{"line":727,"column":1,"offset":23881},"end":{"line":727,"column":5,"offset":23885},"indent":[]}}],"position":{"start":{"line":727,"column":1,"offset":23881},"end":{"line":727,"column":5,"offset":23885},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":730,"column":1,"offset":23888},"end":{"line":730,"column":31,"offset":23918},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":730,"column":31,"offset":23918}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`## Global Docker image parameters`}{`\n`}{`## Please, note that this will override the image parameters, including dependencies, configured to use the global value`}{`\n`}{`## Current available global Docker image parameters: imageRegistry and imagePullSecrets`}{`\n`}{`##`}{`\n`}{`# global:`}{`\n`}{`#   imageRegistry: myRegistryName`}{`\n`}{`#   imagePullSecrets:`}{`\n`}{`#     - myRegistryKeySecretName`}{`\n`}{`#   storageClass: myStorageClass`}{`\n`}{`\n`}{`image:`}{`\n`}{`  ## Bitnami MongoDB registry`}{`\n`}{`  ##`}{`\n`}{`  registry: docker.io`}{`\n`}{`  ## Bitnami MongoDB image name`}{`\n`}{`  ##`}{`\n`}{`  repository: bitnami/mongodb`}{`\n`}{`  ## Bitnami MongoDB image tag`}{`\n`}{`  ## ref: https://hub.docker.com/r/bitnami/mongodb/tags/`}{`\n`}{`  ##`}{`\n`}{`  tag: 4.2.3-debian-10-r31`}{`\n`}{`  ## Specify a imagePullPolicy`}{`\n`}{`  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images`}{`\n`}{`  ##`}{`\n`}{`  pullPolicy: IfNotPresent`}{`\n`}{`  ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`  ## Secrets must be manually created in the namespace.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`  ##`}{`\n`}{`  # pullSecrets:`}{`\n`}{`  #   - myRegistryKeySecretName`}{`\n`}{`\n`}{`  ## Set to true if you would like to see extra information on logs`}{`\n`}{`  ## It turns on Bitnami debugging in minideb-extras-base`}{`\n`}{`  ## ref:  https://github.com/bitnami/minideb-extras-base`}{`\n`}{`  debug: false`}{`\n`}{`\n`}{`## String to partially override mongodb.fullname template (will maintain the release name)`}{`\n`}{`##`}{`\n`}{`# nameOverride:`}{`\n`}{`\n`}{`## String to fully override mongodb.fullname template`}{`\n`}{`##`}{`\n`}{`# fullnameOverride:`}{`\n`}{`\n`}{`# Add custom extra environment variables to all the MongoDB containers`}{`\n`}{`# extraEnvVars:`}{`\n`}{`\n`}{`## Init containers parameters:`}{`\n`}{`## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.`}{`\n`}{`##`}{`\n`}{`volumePermissions:`}{`\n`}{`  enabled: false`}{`\n`}{`  image:`}{`\n`}{`    registry: docker.io`}{`\n`}{`    repository: bitnami/minideb`}{`\n`}{`    tag: buster`}{`\n`}{`    pullPolicy: Always`}{`\n`}{`    ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`    ## Secrets must be manually created in the namespace.`}{`\n`}{`    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`    ##`}{`\n`}{`    # pullSecrets:`}{`\n`}{`    #   - myRegistryKeySecretName`}{`\n`}{`  resources: {}`}{`\n`}{`\n`}{`## Enable authentication`}{`\n`}{`## ref: https://docs.mongodb.com/manual/tutorial/enable-authentication/`}{`\n`}{`#`}{`\n`}{`usePassword: true`}{`\n`}{`# existingSecret: name-of-existing-secret`}{`\n`}{`\n`}{`## MongoDB admin password`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#setting-the-root-password-on-first-run`}{`\n`}{`##`}{`\n`}{`mongodbRootPassword: 9832sfascvn31`}{`\n`}{`\n`}{`## MongoDB custom user and database`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#creating-a-user-and-database-on-first-run`}{`\n`}{`##`}{`\n`}{`# mongodbUsername: username`}{`\n`}{`# mongodbPassword: password`}{`\n`}{`# mongodbDatabase: database`}{`\n`}{`\n`}{`## Whether enable/disable IPv6 on MongoDB`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-ipv6`}{`\n`}{`##`}{`\n`}{`mongodbEnableIPv6: false`}{`\n`}{`\n`}{`## Whether enable/disable DirectoryPerDB on MongoDB`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-directoryperdb`}{`\n`}{`##`}{`\n`}{`mongodbDirectoryPerDB: false`}{`\n`}{`\n`}{`## MongoDB System Log configuration`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb#configuring-system-log-verbosity-level`}{`\n`}{`##`}{`\n`}{`mongodbSystemLogVerbosity: 0`}{`\n`}{`mongodbDisableSystemLog: false`}{`\n`}{`\n`}{`## MongoDB additional command line flags`}{`\n`}{`##`}{`\n`}{`## Can be used to specify command line flags, for example:`}{`\n`}{`##`}{`\n`}{`## mongodbExtraFlags:`}{`\n`}{`##  - \"--wiredTigerCacheSizeGB=2\"`}{`\n`}{`mongodbExtraFlags: []`}{`\n`}{`\n`}{`## Pod Security Context`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/`}{`\n`}{`##`}{`\n`}{`securityContext:`}{`\n`}{`  enabled: true`}{`\n`}{`  fsGroup: 1001`}{`\n`}{`  runAsUser: 1001`}{`\n`}{`\n`}{`## Kubernetes Cluster Domain`}{`\n`}{`clusterDomain: cluster.local`}{`\n`}{`\n`}{`## Kubernetes service type`}{`\n`}{`service:`}{`\n`}{`  ## Specify an explicit service name.`}{`\n`}{`  # name: svc-mongo`}{`\n`}{`  ## Provide any additional annotations which may be required.`}{`\n`}{`  ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart`}{`\n`}{`  annotations: {}`}{`\n`}{`  type: ClusterIP`}{`\n`}{`  # clusterIP: None`}{`\n`}{`  port: 27017`}{`\n`}{`\n`}{`  ## Specify the nodePort value for the LoadBalancer and NodePort service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport`}{`\n`}{`  ##`}{`\n`}{`  # nodePort:`}{`\n`}{`\n`}{`  ## Specify the externalIP value ClusterIP service type.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips`}{`\n`}{`  # externalIPs: []`}{`\n`}{`\n`}{`  ## Specify the loadBalancerIP value for LoadBalancer service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer`}{`\n`}{`  ##`}{`\n`}{`  # loadBalancerIP:`}{`\n`}{`\n`}{`  ## Specify the loadBalancerSourceRanges value for LoadBalancer service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service`}{`\n`}{`  ##`}{`\n`}{`  # loadBalancerSourceRanges: []`}{`\n`}{`\n`}{`## Use StatefulSet instead of Deployment when deploying standalone`}{`\n`}{`useStatefulSet: false`}{`\n`}{`\n`}{`## Setting up replication`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb#setting-up-a-replication`}{`\n`}{`#`}{`\n`}{`replicaSet:`}{`\n`}{`  ## Whether to create a MongoDB replica set for high availability or not`}{`\n`}{`  enabled: false`}{`\n`}{`  useHostnames: true`}{`\n`}{`\n`}{`  ## Name of the replica set`}{`\n`}{`  ##`}{`\n`}{`  name: rs0`}{`\n`}{`\n`}{`  ## Key used for replica set authentication`}{`\n`}{`  ##`}{`\n`}{`  # key: key`}{`\n`}{`\n`}{`  ## Number of replicas per each node type`}{`\n`}{`  ##`}{`\n`}{`  replicas:`}{`\n`}{`    secondary: 0`}{`\n`}{`    arbiter: 0`}{`\n`}{`\n`}{`  ## Pod Disruption Budget`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/`}{`\n`}{`  pdb:`}{`\n`}{`    enabled: false`}{`\n`}{`    minAvailable:`}{`\n`}{`      secondary: 1`}{`\n`}{`      arbiter: 1`}{`\n`}{`    # maxUnavailable:`}{`\n`}{`      # secondary: 1`}{`\n`}{`      # arbiter: 1`}{`\n`}{`\n`}{`# Annotations to be added to the deployment or statefulsets`}{`\n`}{`annotations: {}`}{`\n`}{`\n`}{`# Additional labels to apply to the deployment or statefulsets`}{`\n`}{`labels: {}`}{`\n`}{`\n`}{`# Annotations to be added to MongoDB pods`}{`\n`}{`podAnnotations: {}`}{`\n`}{`\n`}{`# Additional pod labels to apply`}{`\n`}{`podLabels: {}`}{`\n`}{`\n`}{`## Use an alternate scheduler, e.g. \"stork\".`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/`}{`\n`}{`##`}{`\n`}{`# schedulerName:`}{`\n`}{`\n`}{`## Configure resource requests and limits`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/compute-resources/`}{`\n`}{`##`}{`\n`}{`resources: {}`}{`\n`}{`# Define separate resources per arbiter, which are less then primary or secondary`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`resourcesArbiter: {}`}{`\n`}{`# limits:`}{`\n`}{`#   cpu: 500m`}{`\n`}{`#   memory: 512Mi`}{`\n`}{`# requests:`}{`\n`}{`#   cpu: 100m`}{`\n`}{`#   memory: 256Mi`}{`\n`}{`\n`}{`## Pod priority`}{`\n`}{`## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/`}{`\n`}{`# priorityClassName: \"\"`}{`\n`}{`\n`}{`## Node selector`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector`}{`\n`}{`nodeSelector: {}`}{`\n`}{`\n`}{`## Affinity`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity`}{`\n`}{`affinity: {}`}{`\n`}{`# Define separate affinity for arbiter pod`}{`\n`}{`affinityArbiter: {}`}{`\n`}{`\n`}{`## Tolerations`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/`}{`\n`}{`tolerations: []`}{`\n`}{`\n`}{`## Add sidecars to the pod`}{`\n`}{`##`}{`\n`}{`## For example:`}{`\n`}{`## sidecars:`}{`\n`}{`##   - name: your-image-name`}{`\n`}{`##     image: your-image`}{`\n`}{`##     imagePullPolicy: Always`}{`\n`}{`##     ports:`}{`\n`}{`##       - name: portname`}{`\n`}{`##         containerPort: 1234`}{`\n`}{`sidecars: []`}{`\n`}{`## Array to add extra volumes`}{`\n`}{`##`}{`\n`}{`extraVolumes: []`}{`\n`}{`## Array to add extra mounts (normally used with extraVolumes)`}{`\n`}{`##`}{`\n`}{`extraVolumeMounts: []`}{`\n`}{`\n`}{`## Add sidecars to the arbiter pod`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`## For example:`}{`\n`}{`## sidecars:`}{`\n`}{`##   - name: your-image-name`}{`\n`}{`##     image: your-image`}{`\n`}{`##     imagePullPolicy: Always`}{`\n`}{`##     ports:`}{`\n`}{`##       - name: portname`}{`\n`}{`##         containerPort: 1234`}{`\n`}{`sidecarsArbiter: []`}{`\n`}{`## Array to add extra volumes to the arbiter`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`extraVolumesArbiter: []`}{`\n`}{`## Array to add extra mounts (normally used with extraVolumes) to the arbiter`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`extraVolumeMountsArbiter: []`}{`\n`}{`\n`}{`## updateStrategy for MongoDB Primary, Secondary and Arbitrer statefulsets`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies`}{`\n`}{`updateStrategy:`}{`\n`}{`  type: RollingUpdate`}{`\n`}{`\n`}{`## Enable persistence using Persistent Volume Claims`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/`}{`\n`}{`##`}{`\n`}{`persistence:`}{`\n`}{`  enabled: true`}{`\n`}{`  ## A manually managed Persistent Volume and Claim`}{`\n`}{`  ## Requires persistence.enabled: true`}{`\n`}{`  ## If defined, PVC must be created manually before volume will be bound`}{`\n`}{`  ##`}{`\n`}{`  # existingClaim:`}{`\n`}{`\n`}{`  ## The path the volume will be mounted at, useful when using different`}{`\n`}{`  ## MongoDB images.`}{`\n`}{`  ##`}{`\n`}{`  mountPath: /bitnami/mongodb`}{`\n`}{`\n`}{`  ## The subdirectory of the volume to mount to, useful in dev environments`}{`\n`}{`  ## and one PV for multiple services.`}{`\n`}{`  ##`}{`\n`}{`  subPath: \"\"`}{`\n`}{`\n`}{`  ## mongodb data Persistent Volume Storage Class`}{`\n`}{`  ## If defined, storageClassName: `}{`\n`}{`  ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning`}{`\n`}{`  ## If undefined (the default) or set to null, no storageClassName spec is`}{`\n`}{`  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on`}{`\n`}{`  ##   GKE, AWS & OpenStack)`}{`\n`}{`  ##`}{`\n`}{`  # storageClass: \"-\"`}{`\n`}{`  accessModes:`}{`\n`}{`    - ReadWriteOnce`}{`\n`}{`  size: 8Gi`}{`\n`}{`  annotations: {}`}{`\n`}{`\n`}{`## Configure the ingress resource that allows you to access the`}{`\n`}{`## MongoDB installation. Set up the URL`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/ingress/`}{`\n`}{`##`}{`\n`}{`ingress:`}{`\n`}{`  ## Set to true to enable ingress record generation`}{`\n`}{`  enabled: false`}{`\n`}{`\n`}{`  ## Set this to true in order to add the corresponding annotations for cert-manager`}{`\n`}{`  certManager: false`}{`\n`}{`\n`}{`  ## Ingress annotations done as key:value pairs`}{`\n`}{`  ## For a full list of possible ingress annotations, please see`}{`\n`}{`  ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md`}{`\n`}{`  ##`}{`\n`}{`  ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: \"true\" will automatically be set`}{`\n`}{`  ## If certManager is set to true, annotation kubernetes.io/tls-acme: \"true\" will automatically be set`}{`\n`}{`  annotations:`}{`\n`}{`  #  kubernetes.io/ingress.class: nginx`}{`\n`}{`\n`}{`  ## The list of hostnames to be covered with this ingress record.`}{`\n`}{`  ## Most likely this will be just one host, but in the event more hosts are needed, this is an array`}{`\n`}{`  hosts:`}{`\n`}{`  - name: mongodb.local`}{`\n`}{`    path: /`}{`\n`}{`\n`}{`  ## The tls configuration for the ingress`}{`\n`}{`  ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls`}{`\n`}{`  tls:`}{`\n`}{`  - hosts:`}{`\n`}{`      - mongodb.local`}{`\n`}{`    secretName: mongodb.local-tls`}{`\n`}{`\n`}{`  secrets:`}{`\n`}{`  ## If you're providing your own certificates, please use this to add the certificates as secrets`}{`\n`}{`  ## key and certificate should start with -----BEGIN CERTIFICATE----- or`}{`\n`}{`  ## -----BEGIN RSA PRIVATE KEY-----`}{`\n`}{`  ##`}{`\n`}{`  ## name should line up with a tlsSecret set further up`}{`\n`}{`  ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set`}{`\n`}{`  ##`}{`\n`}{`  ## It is also possible to create and manage the certificates outside of this helm chart`}{`\n`}{`  ## Please see README.md for more information`}{`\n`}{`  # - name: airflow.local-tls`}{`\n`}{`  #   key:`}{`\n`}{`  #   certificate:`}{`\n`}{`\n`}{`## Configure the options for init containers to be run before the main app containers`}{`\n`}{`## are started. All init containers are run sequentially and must exit without errors`}{`\n`}{`## for the next one to be started.`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/`}{`\n`}{`# extraInitContainers: |`}{`\n`}{`#   - name: do-something`}{`\n`}{`#     image: busybox`}{`\n`}{`#     command: ['do', 'something']`}{`\n`}{`\n`}{`## Configure extra options for liveness and readiness probes`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)`}{`\n`}{`livenessProbe:`}{`\n`}{`  enabled: true`}{`\n`}{`  initialDelaySeconds: 30`}{`\n`}{`  periodSeconds: 10`}{`\n`}{`  timeoutSeconds: 5`}{`\n`}{`  failureThreshold: 6`}{`\n`}{`  successThreshold: 1`}{`\n`}{`readinessProbe:`}{`\n`}{`  enabled: true`}{`\n`}{`  initialDelaySeconds: 5`}{`\n`}{`  periodSeconds: 10`}{`\n`}{`  timeoutSeconds: 5`}{`\n`}{`  failureThreshold: 6`}{`\n`}{`  successThreshold: 1`}{`\n`}{`\n`}{`# Define custom config map with init scripts`}{`\n`}{`initConfigMap: {}`}{`\n`}{`#  name: \"init-config-map\"`}{`\n`}{`\n`}{`## Entries for the MongoDB config file. For documentation of all options, see:`}{`\n`}{`##   http://docs.mongodb.org/manual/reference/configuration-options/`}{`\n`}{`##`}{`\n`}{`configmap:`}{`\n`}{`#  # where and how to store data.`}{`\n`}{`#  storage:`}{`\n`}{`#    dbPath: /bitnami/mongodb/data/db`}{`\n`}{`#    journal:`}{`\n`}{`#      enabled: true`}{`\n`}{`#    directoryPerDB: false`}{`\n`}{`#  # where to write logging data.`}{`\n`}{`#  systemLog:`}{`\n`}{`#    destination: file`}{`\n`}{`#    quiet: false`}{`\n`}{`#    logAppend: true`}{`\n`}{`#    logRotate: reopen`}{`\n`}{`#    path: /opt/bitnami/mongodb/logs/mongodb.log`}{`\n`}{`#    verbosity: 0`}{`\n`}{`#  # network interfaces`}{`\n`}{`#  net:`}{`\n`}{`#    port: 27017`}{`\n`}{`#    unixDomainSocket:`}{`\n`}{`#      enabled: true`}{`\n`}{`#      pathPrefix: /opt/bitnami/mongodb/tmp`}{`\n`}{`#    ipv6: false`}{`\n`}{`#    bindIpAll: true`}{`\n`}{`#  # replica set options`}{`\n`}{`#  #replication:`}{`\n`}{`#    #replSetName: replicaset`}{`\n`}{`#    #enableMajorityReadConcern: true`}{`\n`}{`#  # process management options`}{`\n`}{`#  processManagement:`}{`\n`}{`#     fork: false`}{`\n`}{`#     pidFilePath: /opt/bitnami/mongodb/tmp/mongodb.pid`}{`\n`}{`#  # set parameter options`}{`\n`}{`#  setParameter:`}{`\n`}{`#     enableLocalhostAuthBypass: true`}{`\n`}{`#  # security options`}{`\n`}{`#  security:`}{`\n`}{`#    authorization: disabled`}{`\n`}{`#    #keyFile: /opt/bitnami/mongodb/conf/keyfile`}{`\n`}{`\n`}{`## Prometheus Exporter / Metrics`}{`\n`}{`##`}{`\n`}{`metrics:`}{`\n`}{`  enabled: true`}{`\n`}{`\n`}{`  image:`}{`\n`}{`    registry: docker.io`}{`\n`}{`    repository: bitnami/mongodb-exporter`}{`\n`}{`    tag: 0.10.0-debian-10-r27`}{`\n`}{`    pullPolicy: IfNotPresent`}{`\n`}{`    ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`    ## Secrets must be manually created in the namespace.`}{`\n`}{`    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`    ##`}{`\n`}{`    # pullSecrets:`}{`\n`}{`    #   - myRegistryKeySecretName`}{`\n`}{`\n`}{`  ## String with extra arguments to the metrics exporter`}{`\n`}{`  ## ref: https://github.com/percona/mongodb_exporter/blob/master/mongodb_exporter.go`}{`\n`}{`  extraArgs: \"\"`}{`\n`}{`\n`}{`  ## Metrics exporter resource requests and limits`}{`\n`}{`  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/`}{`\n`}{`  ##`}{`\n`}{`  # resources: {}`}{`\n`}{`\n`}{`  ## Metrics exporter liveness and readiness probes`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)`}{`\n`}{`  livenessProbe:`}{`\n`}{`    enabled: true`}{`\n`}{`    initialDelaySeconds: 15`}{`\n`}{`    periodSeconds: 5`}{`\n`}{`    timeoutSeconds: 5`}{`\n`}{`    failureThreshold: 3`}{`\n`}{`    successThreshold: 1`}{`\n`}{`  readinessProbe:`}{`\n`}{`    enabled: true`}{`\n`}{`    initialDelaySeconds: 5`}{`\n`}{`    periodSeconds: 5`}{`\n`}{`    timeoutSeconds: 1`}{`\n`}{`    failureThreshold: 3`}{`\n`}{`    successThreshold: 1`}{`\n`}{`\n`}{`  ## Metrics exporter pod Annotation`}{`\n`}{`  podAnnotations:`}{`\n`}{`    prometheus.io/scrape: \"true\"`}{`\n`}{`    prometheus.io/port: \"9216\"`}{`\n`}{`\n`}{`  ## Prometheus Service Monitor`}{`\n`}{`  ## ref: https://github.com/coreos/prometheus-operator`}{`\n`}{`  ##      https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md`}{`\n`}{`  serviceMonitor:`}{`\n`}{`    ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry`}{`\n`}{`    enabled: false`}{`\n`}{`\n`}{`    ## Specify a namespace if needed`}{`\n`}{`    # namespace: monitoring`}{`\n`}{`\n`}{`    ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with`}{`\n`}{`    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec`}{`\n`}{`    additionalLabels: {}`}{`\n`}{`\n`}{`    ## Specify Metric Relabellings to add to the scrape endpoint`}{`\n`}{`    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint`}{`\n`}{`    # relabellings:`}{`\n`}{`\n`}{`    alerting:`}{`\n`}{`      ## Define individual alerting rules as required`}{`\n`}{`      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#rulegroup`}{`\n`}{`      ##      https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/`}{`\n`}{`      rules: {}`}{`\n`}{`\n`}{`      ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Prometheus Rules to work with`}{`\n`}{`      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec`}{`\n`}{`      additionalLabels: {}`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`apiVersion: apps/v1`}{`\n`}{`kind: Deployment`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`spec:`}{`\n`}{`  replicas: 1`}{`\n`}{`  selector:`}{`\n`}{`    matchLabels:`}{`\n`}{`      app: factory`}{`\n`}{`  minReadySeconds: 10`}{`\n`}{`  strategy:`}{`\n`}{`    type: RollingUpdate`}{`\n`}{`    rollingUpdate:`}{`\n`}{`      maxUnavailable: 1`}{`\n`}{`      maxSurge: 1`}{`\n`}{`  template:`}{`\n`}{`    metadata:`}{`\n`}{`      labels:`}{`\n`}{`        app: factory`}{`\n`}{`    spec:`}{`\n`}{`      containers:`}{`\n`}{`      - name: machinery`}{`\n`}{`        image: cedricvers/factory-buildx:1.0.5`}{`\n`}{`        ports:`}{`\n`}{`          - containerPort: 80`}{`\n`}{`          - containerPort: 8081`}{`\n`}{`        env:`}{`\n`}{`        - name: MACHINERY_VERSION`}{`\n`}{`          value: \"1.0.1\"`}{`\n`}{`        - name: FACTORY_ENVIRONMENT`}{`\n`}{`          value: \"kubernetes\"`}{`\n`}{`        - name: FACTORY_PWD`}{`\n`}{`          value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"`}{`\n`}{`        - name: MONGODB_HOST`}{`\n`}{`          value: \"mongodb\"`}{`\n`}{`        - name: MONGODB_DATABASE_CREDENTIALS`}{`\n`}{`          value: \"admin\"`}{`\n`}{`        - name: MONGODB_USERNAME`}{`\n`}{`          value: \"root\"`}{`\n`}{`        - name: MONGODB_PASSWORD`}{`\n`}{`          value: \"9832sfascvn31\"`}{`\n`}{`        - name: MQTT_URL`}{`\n`}{`          value: \"tcp://127.0.0.1:1883\"`}{`\n`}{`        - name: MQTT_USERNAME`}{`\n`}{`          value: \"\"`}{`\n`}{`        - name: MQTT_PASSWORD`}{`\n`}{`          value: \"\"`}{`\n`}{`---`}{`\n`}{`apiVersion: v1`}{`\n`}{`kind: Service`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  labels:`}{`\n`}{`    app: factory`}{`\n`}{`spec:`}{`\n`}{`  ports:`}{`\n`}{`  - port: 80`}{`\n`}{`    targetPort: 80`}{`\n`}{`    name: frontend`}{`\n`}{`    protocol: TCP`}{`\n`}{`  - port: 8081`}{`\n`}{`    name: backend`}{`\n`}{`    targetPort: 8081`}{`\n`}{`    protocol: TCP`}{`\n`}{`  selector:`}{`\n`}{`    app: factory`}{`\n`}{`---`}{`\n`}{`apiVersion: extensions/v1beta1`}{`\n`}{`kind: Ingress`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  annotations:`}{`\n`}{`    kubernetes.io/ingress.class: traefik`}{`\n`}{`spec:`}{`\n`}{`  rules:`}{`\n`}{`  - host: factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 80`}{`\n`}{`  - host: api.factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 8081`}
\n

{`Running`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • \n
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0fac5202084e58929a0b1613758e0843.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0fac5202084e58929a0b1613758e0843.json new file mode 100644 index 0000000..25e4ec9 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-0fac5202084e58929a0b1613758e0843.json @@ -0,0 +1 @@ +{"expireTime":9007200838837412000,"key":"gatsby-plugin-mdx-entire-payload-49ccf518fcc711561fd76c6627a2ee75-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":107,"column":4,"offset":3144},"end":{"line":107,"column":11,"offset":3151},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":3141},"end":{"line":107,"column":11,"offset":3151},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}}],"position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":112,"column":1,"offset":3398},"end":{"line":112,"column":78,"offset":3475},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":116,"column":1,"offset":3501},"end":{"line":116,"column":8,"offset":3508},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":118,"column":4,"offset":3513},"end":{"line":118,"column":11,"offset":3520},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3510},"end":{"line":118,"column":11,"offset":3520},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":120,"column":74,"offset":3595},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":120,"column":76,"offset":3597},"end":{"line":120,"column":83,"offset":3604},"indent":[]}}],"position":{"start":{"line":120,"column":74,"offset":3595},"end":{"line":120,"column":85,"offset":3606},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":120,"column":85,"offset":3606},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}}],"position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":125,"column":1,"offset":3989},"end":{"line":125,"column":47,"offset":4035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}}],"position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":129,"column":1,"offset":4064},"end":{"line":129,"column":25,"offset":4088},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":131,"column":3,"offset":4092},"end":{"line":131,"column":25,"offset":4114},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":4090},"end":{"line":131,"column":25,"offset":4114},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":135,"column":12,"offset":4222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4223},"end":{"line":136,"column":12,"offset":4234},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4235},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":137,"column":12,"offset":4246},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":141,"column":1,"offset":4275},"end":{"line":145,"column":73,"offset":4587},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":147,"column":4,"offset":4592},"end":{"line":147,"column":21,"offset":4609},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4589},"end":{"line":147,"column":21,"offset":4609},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure your DNS server. Look for the\nTraefik service, and copy its External IP.","position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":43,"offset":4786},"indent":[1]}}],"position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":43,"offset":4786},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":" $ kubectl get svc\n NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n factory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\n kubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\n mongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\n--> traefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h\n traefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":152,"column":1,"offset":4788},"end":{"line":158,"column":109,"offset":5465},"indent":[1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Add this External IP to your DNS server, so it will resolve your domains:","position":{"start":{"line":160,"column":1,"offset":5467},"end":{"line":160,"column":74,"offset":5540},"indent":[]}}],"position":{"start":{"line":160,"column":1,"offset":5467},"end":{"line":160,"column":74,"offset":5540},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"traefik.domain.com (change to your domain)","position":{"start":{"line":162,"column":5,"offset":5546},"end":{"line":162,"column":47,"offset":5588},"indent":[]}}],"position":{"start":{"line":162,"column":5,"offset":5546},"end":{"line":162,"column":47,"offset":5588},"indent":[]}}],"position":{"start":{"line":162,"column":1,"offset":5542},"end":{"line":162,"column":47,"offset":5588},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"factory.domain.com (change to your domain).","position":{"start":{"line":163,"column":5,"offset":5593},"end":{"line":163,"column":48,"offset":5636},"indent":[]}}],"position":{"start":{"line":163,"column":5,"offset":5593},"end":{"line":163,"column":48,"offset":5636},"indent":[]}}],"position":{"start":{"line":163,"column":1,"offset":5589},"end":{"line":163,"column":48,"offset":5636},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"api.factory.domain.com (change to your domain).","position":{"start":{"line":164,"column":5,"offset":5641},"end":{"line":164,"column":52,"offset":5688},"indent":[]}}],"position":{"start":{"line":164,"column":5,"offset":5641},"end":{"line":164,"column":52,"offset":5688},"indent":[]}}],"position":{"start":{"line":164,"column":1,"offset":5637},"end":{"line":164,"column":52,"offset":5688},"indent":[]}}],"position":{"start":{"line":162,"column":1,"offset":5542},"end":{"line":164,"column":52,"offset":5688},"indent":[1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Access the system","position":{"start":{"line":166,"column":4,"offset":5693},"end":{"line":166,"column":21,"offset":5710},"indent":[]}}],"position":{"start":{"line":166,"column":1,"offset":5690},"end":{"line":166,"column":21,"offset":5710},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating\nto the Factory domain in your browser you will see the Factory login page showing up.","position":{"start":{"line":168,"column":1,"offset":5712},"end":{"line":169,"column":86,"offset":5926},"indent":[1]}}],"position":{"start":{"line":168,"column":1,"offset":5712},"end":{"line":169,"column":86,"offset":5926},"indent":[1]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/factory/kerberos-factory-loginpage.png","alt":"Factory","position":{"start":{"line":171,"column":1,"offset":5928},"end":{"line":171,"column":71,"offset":5998},"indent":[]}}],"position":{"start":{"line":171,"column":1,"offset":5928},"end":{"line":171,"column":71,"offset":5998},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":174,"column":1,"offset":6001},"end":{"line":174,"column":31,"offset":6031},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":174,"column":31,"offset":6031}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure your DNS server. Look for the\nTraefik service, and copy its External IP.`}

\n
{`    $ kubectl get svc`}{`\n`}{`    NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`    factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`    kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`    mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`--> traefik              LoadBalancer   10.0.10.97    34.66.138.141   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`    traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n

{`Add this External IP to your DNS server, so it will resolve your domains:`}

\n
    \n
  • {`traefik.domain.com (change to your domain)`}
  • \n
  • {`factory.domain.com (change to your domain).`}
  • \n
  • {`api.factory.domain.com (change to your domain).`}
  • \n
\n

{`Access the system`}

\n

{`Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating\nto the Factory domain in your browser you will see the Factory login page showing up.`}

\n

\"Factory\"

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-11d60587ea6f2ba336fbcf0d8dfd43a6.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-11d60587ea6f2ba336fbcf0d8dfd43a6.json index a0eab88..21b65cb 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-11d60587ea6f2ba336fbcf0d8dfd43a6.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-11d60587ea6f2ba336fbcf0d8dfd43a6.json @@ -1 +1 @@ -{"expireTime":9007200838510857000,"key":"gatsby-plugin-mdx-entire-payload-1bfb759d069bbc31b896895a730ecf56-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"First things first","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":21,"offset":179},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":21,"offset":179},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos started as an Open Source project back in 2014. Our main goal was, and still is, to provide everyone in this world with a free, professional and complete video surveillance system, which they can install in a couple of minutes.\nKerberos was initially developed for the Raspberry Pi, due to this many of the tools we have been using are lightweight and fast (such as C++). Over the years we have found other ways to make Kerberos available, such as KiOS (our custom Linux), Docker and Kubernetes.","position":{"start":{"line":10,"column":1,"offset":181},"end":{"line":11,"column":268,"offset":685},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":181},"end":{"line":11,"column":268,"offset":685},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"In this section we want to make clear what the Open Source version of Kerberos is about, and when you should be using it. What it can do, and what it can't do.","position":{"start":{"line":13,"column":1,"offset":687},"end":{"line":13,"column":160,"offset":846},"indent":[]}}],"position":{"start":{"line":13,"column":1,"offset":687},"end":{"line":13,"column":160,"offset":846},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"License","position":{"start":{"line":15,"column":4,"offset":851},"end":{"line":15,"column":11,"offset":858},"indent":[]}}],"position":{"start":{"line":15,"column":1,"offset":848},"end":{"line":15,"column":11,"offset":858},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Kerberos Open Source project is licensed with ","position":{"start":{"line":17,"column":1,"offset":860},"end":{"line":17,"column":51,"offset":910},"indent":[]}},{"type":"link","title":null,"url":"/opensource/license","children":[{"type":"text","value":"BY-NC-SA 4.0","position":{"start":{"line":17,"column":52,"offset":911},"end":{"line":17,"column":64,"offset":923},"indent":[]}}],"position":{"start":{"line":17,"column":51,"offset":910},"end":{"line":17,"column":86,"offset":945},"indent":[]}},{"type":"text","value":", this means that everyone can use Kerberos and modify if to their needs, in a non commercial activity.","position":{"start":{"line":17,"column":86,"offset":945},"end":{"line":17,"column":189,"offset":1048},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":860},"end":{"line":17,"column":189,"offset":1048},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"When using the Open Source version","position":{"start":{"line":20,"column":4,"offset":1054},"end":{"line":20,"column":38,"offset":1088},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1051},"end":{"line":20,"column":38,"offset":1088},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect for personal usage. It's great if you only have a couple of surveillance cameras to be managed. A Kerberos agent (e.g. on a Raspberry Pi or inside a Docker container) runs for each camera. Their are many different installation possibilities, please have a look at the ","position":{"start":{"line":22,"column":1,"offset":1090},"end":{"line":22,"column":301,"offset":1390},"indent":[]}},{"type":"link","title":null,"url":"/architectures","children":[{"type":"text","value":"architecture","position":{"start":{"line":22,"column":302,"offset":1391},"end":{"line":22,"column":314,"offset":1403},"indent":[]}}],"position":{"start":{"line":22,"column":301,"offset":1390},"end":{"line":22,"column":331,"offset":1420},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":22,"column":331,"offset":1420},"end":{"line":22,"column":335,"offset":1424},"indent":[]}},{"type":"link","title":null,"url":"/opensource/installation","children":[{"type":"text","value":"installation page","position":{"start":{"line":22,"column":336,"offset":1425},"end":{"line":22,"column":353,"offset":1442},"indent":[]}}],"position":{"start":{"line":22,"column":335,"offset":1424},"end":{"line":22,"column":380,"offset":1469},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":22,"column":380,"offset":1469},"end":{"line":22,"column":381,"offset":1470},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1090},"end":{"line":22,"column":381,"offset":1470},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Every Kerberos agent has it's own web interface (front-end) to review media recording, and processing engine (back-end) of a specific surveillance camera. The Open Source version doesn't come with a central overview of all recordings generated by your Kerberos agents. For this feature we highly recommend ","position":{"start":{"line":24,"column":1,"offset":1472},"end":{"line":24,"column":307,"offset":1778},"indent":[]}},{"type":"link","title":null,"url":"/cloud","children":[{"type":"text","value":"Kerberos cloud","position":{"start":{"line":24,"column":308,"offset":1779},"end":{"line":24,"column":322,"offset":1793},"indent":[]}}],"position":{"start":{"line":24,"column":307,"offset":1778},"end":{"line":24,"column":331,"offset":1802},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":24,"column":331,"offset":1802},"end":{"line":24,"column":332,"offset":1803},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1472},"end":{"line":24,"column":332,"offset":1803},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to manage more than 10 Kerberos agents, it's recommended to use ","position":{"start":{"line":26,"column":1,"offset":1805},"end":{"line":26,"column":77,"offset":1881},"indent":[]}},{"type":"link","title":null,"url":"/enterprise","children":[{"type":"text","value":"Kerberos Enterprise","position":{"start":{"line":26,"column":78,"offset":1882},"end":{"line":26,"column":97,"offset":1901},"indent":[]}}],"position":{"start":{"line":26,"column":77,"offset":1881},"end":{"line":26,"column":111,"offset":1915},"indent":[]}},{"type":"text","value":". This will help you to scale, support high availability and load balancing. Check out the ","position":{"start":{"line":26,"column":111,"offset":1915},"end":{"line":26,"column":202,"offset":2006},"indent":[]}},{"type":"link","title":null,"url":"/architectures","children":[{"type":"text","value":"architectures section","position":{"start":{"line":26,"column":203,"offset":2007},"end":{"line":26,"column":224,"offset":2028},"indent":[]}}],"position":{"start":{"line":26,"column":202,"offset":2006},"end":{"line":26,"column":241,"offset":2045},"indent":[]}},{"type":"text","value":" for a better understanding of when to use what.","position":{"start":{"line":26,"column":241,"offset":2045},"end":{"line":26,"column":289,"offset":2093},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1805},"end":{"line":26,"column":289,"offset":2093},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"How to install","position":{"start":{"line":28,"column":4,"offset":2098},"end":{"line":28,"column":18,"offset":2112},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":2095},"end":{"line":28,"column":18,"offset":2112},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A Kerberos Open Source agent can be installed in different ways. Every installation method have their own advantages and disadvantages. Depending on the usecase you could choose one method over the other. Read more on the ","position":{"start":{"line":30,"column":1,"offset":2114},"end":{"line":30,"column":223,"offset":2336},"indent":[]}},{"type":"link","title":null,"url":"/opensource/installation","children":[{"type":"text","value":"installation section","position":{"start":{"line":30,"column":224,"offset":2337},"end":{"line":30,"column":244,"offset":2357},"indent":[]}}],"position":{"start":{"line":30,"column":223,"offset":2336},"end":{"line":30,"column":271,"offset":2384},"indent":[]}},{"type":"text","value":", to learn about the different installation methods.","position":{"start":{"line":30,"column":271,"offset":2384},"end":{"line":30,"column":323,"offset":2436},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":2114},"end":{"line":30,"column":323,"offset":2436},"indent":[]}},{"type":"list","ordered":true,"start":1,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"KiOS: You have a Raspberry Pi, and you only want to run the Kerberos agent on it.","position":{"start":{"line":32,"column":4,"offset":2441},"end":{"line":32,"column":85,"offset":2522},"indent":[]}}],"position":{"start":{"line":32,"column":4,"offset":2441},"end":{"line":32,"column":85,"offset":2522},"indent":[]}}],"position":{"start":{"line":32,"column":1,"offset":2438},"end":{"line":32,"column":85,"offset":2522},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Raspbian: You have a Raspberry Pi, but you want other services running next to your Kerberos agent.","position":{"start":{"line":33,"column":4,"offset":2526},"end":{"line":33,"column":103,"offset":2625},"indent":[]}}],"position":{"start":{"line":33,"column":4,"offset":2526},"end":{"line":33,"column":103,"offset":2625},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":2523},"end":{"line":33,"column":103,"offset":2625},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Docker: You have a lot of IP cameras, and/or don't want to mess with dependencies.","position":{"start":{"line":34,"column":4,"offset":2629},"end":{"line":34,"column":86,"offset":2711},"indent":[]}}],"position":{"start":{"line":34,"column":4,"offset":2629},"end":{"line":34,"column":86,"offset":2711},"indent":[]}}],"position":{"start":{"line":34,"column":1,"offset":2626},"end":{"line":34,"column":86,"offset":2711},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Generic: You want to develop/extend Kerberos Open Source with your own features, or you want to run the Kerberos agent on a not supported OS/architecure.","position":{"start":{"line":35,"column":4,"offset":2715},"end":{"line":35,"column":158,"offset":2869},"indent":[]}}],"position":{"start":{"line":35,"column":4,"offset":2715},"end":{"line":35,"column":158,"offset":2869},"indent":[]}}],"position":{"start":{"line":35,"column":1,"offset":2712},"end":{"line":35,"column":158,"offset":2869},"indent":[]}}],"position":{"start":{"line":32,"column":1,"offset":2438},"end":{"line":35,"column":158,"offset":2869},"indent":[1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":38,"column":1,"offset":2872},"end":{"line":38,"column":31,"offset":2902},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":38,"column":31,"offset":2902}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`First things first`}

\n

{`Kerberos started as an Open Source project back in 2014. Our main goal was, and still is, to provide everyone in this world with a free, professional and complete video surveillance system, which they can install in a couple of minutes.\nKerberos was initially developed for the Raspberry Pi, due to this many of the tools we have been using are lightweight and fast (such as C++). Over the years we have found other ways to make Kerberos available, such as KiOS (our custom Linux), Docker and Kubernetes.`}

\n

{`In this section we want to make clear what the Open Source version of Kerberos is about, and when you should be using it. What it can do, and what it can't do.`}

\n

{`License`}

\n

{`The Kerberos Open Source project is licensed with `}{`BY-NC-SA 4.0`}{`, this means that everyone can use Kerberos and modify if to their needs, in a non commercial activity.`}

\n

{`When using the Open Source version`}

\n

{`Kerberos Open Source is perfect for personal usage. It's great if you only have a couple of surveillance cameras to be managed. A Kerberos agent (e.g. on a Raspberry Pi or inside a Docker container) runs for each camera. Their are many different installation possibilities, please have a look at the `}{`architecture`}{` or `}{`installation page`}{`.`}

\n

{`Every Kerberos agent has it's own web interface (front-end) to review media recording, and processing engine (back-end) of a specific surveillance camera. The Open Source version doesn't come with a central overview of all recordings generated by your Kerberos agents. For this feature we highly recommend `}{`Kerberos cloud`}{`.`}

\n

{`If you want to manage more than 10 Kerberos agents, it's recommended to use `}{`Kerberos Enterprise`}{`. This will help you to scale, support high availability and load balancing. Check out the `}{`architectures section`}{` for a better understanding of when to use what.`}

\n

{`How to install`}

\n

{`A Kerberos Open Source agent can be installed in different ways. Every installation method have their own advantages and disadvantages. Depending on the usecase you could choose one method over the other. Read more on the `}{`installation section`}{`, to learn about the different installation methods.`}

\n
    \n
  1. {`KiOS: You have a Raspberry Pi, and you only want to run the Kerberos agent on it.`}
  2. \n
  3. {`Raspbian: You have a Raspberry Pi, but you want other services running next to your Kerberos agent.`}
  4. \n
  5. {`Docker: You have a lot of IP cameras, and/or don't want to mess with dependencies.`}
  6. \n
  7. {`Generic: You want to develop/extend Kerberos Open Source with your own features, or you want to run the Kerberos agent on a not supported OS/architecure.`}
  8. \n
\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760428000,"key":"gatsby-plugin-mdx-entire-payload-1bfb759d069bbc31b896895a730ecf56-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"First things first","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":21,"offset":179},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":21,"offset":179},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos started as an Open Source project back in 2014. Our main goal was, and still is, to provide everyone in this world with a free, professional and complete video surveillance system, which they can install in a couple of minutes.\nKerberos was initially developed for the Raspberry Pi, due to this many of the tools we have been using are lightweight and fast (such as C++). Over the years we have found other ways to make Kerberos available, such as KiOS (our custom Linux), Docker and Kubernetes.","position":{"start":{"line":10,"column":1,"offset":181},"end":{"line":11,"column":268,"offset":685},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":181},"end":{"line":11,"column":268,"offset":685},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"In this section we want to make clear what the Open Source version of Kerberos is about, and when you should be using it. What it can do, and what it can't do.","position":{"start":{"line":13,"column":1,"offset":687},"end":{"line":13,"column":160,"offset":846},"indent":[]}}],"position":{"start":{"line":13,"column":1,"offset":687},"end":{"line":13,"column":160,"offset":846},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"License","position":{"start":{"line":15,"column":4,"offset":851},"end":{"line":15,"column":11,"offset":858},"indent":[]}}],"position":{"start":{"line":15,"column":1,"offset":848},"end":{"line":15,"column":11,"offset":858},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Kerberos Open Source project is licensed with ","position":{"start":{"line":17,"column":1,"offset":860},"end":{"line":17,"column":51,"offset":910},"indent":[]}},{"type":"link","title":null,"url":"/opensource/license","children":[{"type":"text","value":"BY-NC-SA 4.0","position":{"start":{"line":17,"column":52,"offset":911},"end":{"line":17,"column":64,"offset":923},"indent":[]}}],"position":{"start":{"line":17,"column":51,"offset":910},"end":{"line":17,"column":86,"offset":945},"indent":[]}},{"type":"text","value":", this means that everyone can use Kerberos and modify if to their needs, in a non commercial activity.","position":{"start":{"line":17,"column":86,"offset":945},"end":{"line":17,"column":189,"offset":1048},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":860},"end":{"line":17,"column":189,"offset":1048},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"When using the Open Source version","position":{"start":{"line":20,"column":4,"offset":1054},"end":{"line":20,"column":38,"offset":1088},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1051},"end":{"line":20,"column":38,"offset":1088},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect for personal usage. It's great if you only have a couple of surveillance cameras to be managed. A Kerberos agent (e.g. on a Raspberry Pi or inside a Docker container) runs for each camera. Their are many different installation possibilities, please have a look at the ","position":{"start":{"line":22,"column":1,"offset":1090},"end":{"line":22,"column":301,"offset":1390},"indent":[]}},{"type":"link","title":null,"url":"/architectures","children":[{"type":"text","value":"architecture","position":{"start":{"line":22,"column":302,"offset":1391},"end":{"line":22,"column":314,"offset":1403},"indent":[]}}],"position":{"start":{"line":22,"column":301,"offset":1390},"end":{"line":22,"column":331,"offset":1420},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":22,"column":331,"offset":1420},"end":{"line":22,"column":335,"offset":1424},"indent":[]}},{"type":"link","title":null,"url":"/opensource/installation","children":[{"type":"text","value":"installation page","position":{"start":{"line":22,"column":336,"offset":1425},"end":{"line":22,"column":353,"offset":1442},"indent":[]}}],"position":{"start":{"line":22,"column":335,"offset":1424},"end":{"line":22,"column":380,"offset":1469},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":22,"column":380,"offset":1469},"end":{"line":22,"column":381,"offset":1470},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1090},"end":{"line":22,"column":381,"offset":1470},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Every Kerberos agent has it's own web interface (front-end) to review media recording, and processing engine (back-end) of a specific surveillance camera. The Open Source version doesn't come with a central overview of all recordings generated by your Kerberos agents. For this feature we highly recommend ","position":{"start":{"line":24,"column":1,"offset":1472},"end":{"line":24,"column":307,"offset":1778},"indent":[]}},{"type":"link","title":null,"url":"/cloud","children":[{"type":"text","value":"Kerberos cloud","position":{"start":{"line":24,"column":308,"offset":1779},"end":{"line":24,"column":322,"offset":1793},"indent":[]}}],"position":{"start":{"line":24,"column":307,"offset":1778},"end":{"line":24,"column":331,"offset":1802},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":24,"column":331,"offset":1802},"end":{"line":24,"column":332,"offset":1803},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1472},"end":{"line":24,"column":332,"offset":1803},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to manage more than 10 Kerberos agents, it's recommended to use ","position":{"start":{"line":26,"column":1,"offset":1805},"end":{"line":26,"column":77,"offset":1881},"indent":[]}},{"type":"link","title":null,"url":"/enterprise","children":[{"type":"text","value":"Kerberos Enterprise","position":{"start":{"line":26,"column":78,"offset":1882},"end":{"line":26,"column":97,"offset":1901},"indent":[]}}],"position":{"start":{"line":26,"column":77,"offset":1881},"end":{"line":26,"column":111,"offset":1915},"indent":[]}},{"type":"text","value":". This will help you to scale, support high availability and load balancing. Check out the ","position":{"start":{"line":26,"column":111,"offset":1915},"end":{"line":26,"column":202,"offset":2006},"indent":[]}},{"type":"link","title":null,"url":"/architectures","children":[{"type":"text","value":"architectures section","position":{"start":{"line":26,"column":203,"offset":2007},"end":{"line":26,"column":224,"offset":2028},"indent":[]}}],"position":{"start":{"line":26,"column":202,"offset":2006},"end":{"line":26,"column":241,"offset":2045},"indent":[]}},{"type":"text","value":" for a better understanding of when to use what.","position":{"start":{"line":26,"column":241,"offset":2045},"end":{"line":26,"column":289,"offset":2093},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1805},"end":{"line":26,"column":289,"offset":2093},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"How to install","position":{"start":{"line":28,"column":4,"offset":2098},"end":{"line":28,"column":18,"offset":2112},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":2095},"end":{"line":28,"column":18,"offset":2112},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A Kerberos Open Source agent can be installed in different ways. Every installation method have their own advantages and disadvantages. Depending on the usecase you could choose one method over the other. Read more on the ","position":{"start":{"line":30,"column":1,"offset":2114},"end":{"line":30,"column":223,"offset":2336},"indent":[]}},{"type":"link","title":null,"url":"/opensource/installation","children":[{"type":"text","value":"installation section","position":{"start":{"line":30,"column":224,"offset":2337},"end":{"line":30,"column":244,"offset":2357},"indent":[]}}],"position":{"start":{"line":30,"column":223,"offset":2336},"end":{"line":30,"column":271,"offset":2384},"indent":[]}},{"type":"text","value":", to learn about the different installation methods.","position":{"start":{"line":30,"column":271,"offset":2384},"end":{"line":30,"column":323,"offset":2436},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":2114},"end":{"line":30,"column":323,"offset":2436},"indent":[]}},{"type":"list","ordered":true,"start":1,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"KiOS: You have a Raspberry Pi, and you only want to run the Kerberos agent on it.","position":{"start":{"line":32,"column":4,"offset":2441},"end":{"line":32,"column":85,"offset":2522},"indent":[]}}],"position":{"start":{"line":32,"column":4,"offset":2441},"end":{"line":32,"column":85,"offset":2522},"indent":[]}}],"position":{"start":{"line":32,"column":1,"offset":2438},"end":{"line":32,"column":85,"offset":2522},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Raspbian: You have a Raspberry Pi, but you want other services running next to your Kerberos agent.","position":{"start":{"line":33,"column":4,"offset":2526},"end":{"line":33,"column":103,"offset":2625},"indent":[]}}],"position":{"start":{"line":33,"column":4,"offset":2526},"end":{"line":33,"column":103,"offset":2625},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":2523},"end":{"line":33,"column":103,"offset":2625},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Docker: You have a lot of IP cameras, and/or don't want to mess with dependencies.","position":{"start":{"line":34,"column":4,"offset":2629},"end":{"line":34,"column":86,"offset":2711},"indent":[]}}],"position":{"start":{"line":34,"column":4,"offset":2629},"end":{"line":34,"column":86,"offset":2711},"indent":[]}}],"position":{"start":{"line":34,"column":1,"offset":2626},"end":{"line":34,"column":86,"offset":2711},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Generic: You want to develop/extend Kerberos Open Source with your own features, or you want to run the Kerberos agent on a not supported OS/architecure.","position":{"start":{"line":35,"column":4,"offset":2715},"end":{"line":35,"column":158,"offset":2869},"indent":[]}}],"position":{"start":{"line":35,"column":4,"offset":2715},"end":{"line":35,"column":158,"offset":2869},"indent":[]}}],"position":{"start":{"line":35,"column":1,"offset":2712},"end":{"line":35,"column":158,"offset":2869},"indent":[]}}],"position":{"start":{"line":32,"column":1,"offset":2438},"end":{"line":35,"column":158,"offset":2869},"indent":[1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":38,"column":1,"offset":2872},"end":{"line":38,"column":31,"offset":2902},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":38,"column":31,"offset":2902}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`First things first`}

\n

{`Kerberos started as an Open Source project back in 2014. Our main goal was, and still is, to provide everyone in this world with a free, professional and complete video surveillance system, which they can install in a couple of minutes.\nKerberos was initially developed for the Raspberry Pi, due to this many of the tools we have been using are lightweight and fast (such as C++). Over the years we have found other ways to make Kerberos available, such as KiOS (our custom Linux), Docker and Kubernetes.`}

\n

{`In this section we want to make clear what the Open Source version of Kerberos is about, and when you should be using it. What it can do, and what it can't do.`}

\n

{`License`}

\n

{`The Kerberos Open Source project is licensed with `}{`BY-NC-SA 4.0`}{`, this means that everyone can use Kerberos and modify if to their needs, in a non commercial activity.`}

\n

{`When using the Open Source version`}

\n

{`Kerberos Open Source is perfect for personal usage. It's great if you only have a couple of surveillance cameras to be managed. A Kerberos agent (e.g. on a Raspberry Pi or inside a Docker container) runs for each camera. Their are many different installation possibilities, please have a look at the `}{`architecture`}{` or `}{`installation page`}{`.`}

\n

{`Every Kerberos agent has it's own web interface (front-end) to review media recording, and processing engine (back-end) of a specific surveillance camera. The Open Source version doesn't come with a central overview of all recordings generated by your Kerberos agents. For this feature we highly recommend `}{`Kerberos cloud`}{`.`}

\n

{`If you want to manage more than 10 Kerberos agents, it's recommended to use `}{`Kerberos Enterprise`}{`. This will help you to scale, support high availability and load balancing. Check out the `}{`architectures section`}{` for a better understanding of when to use what.`}

\n

{`How to install`}

\n

{`A Kerberos Open Source agent can be installed in different ways. Every installation method have their own advantages and disadvantages. Depending on the usecase you could choose one method over the other. Read more on the `}{`installation section`}{`, to learn about the different installation methods.`}

\n
    \n
  1. {`KiOS: You have a Raspberry Pi, and you only want to run the Kerberos agent on it.`}
  2. \n
  3. {`Raspbian: You have a Raspberry Pi, but you want other services running next to your Kerberos agent.`}
  4. \n
  5. {`Docker: You have a lot of IP cameras, and/or don't want to mess with dependencies.`}
  6. \n
  7. {`Generic: You want to develop/extend Kerberos Open Source with your own features, or you want to run the Kerberos agent on a not supported OS/architecure.`}
  8. \n
\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-128a1ee0400bec41b31679925403ef0d.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-128a1ee0400bec41b31679925403ef0d.json new file mode 100644 index 0000000..1bd954d --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-128a1ee0400bec41b31679925403ef0d.json @@ -0,0 +1 @@ +{"expireTime":9007200838824460000,"key":"gatsby-plugin-mdx-entire-payload-2cd5f7f4e0c40d80366cb532210b8142-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2167},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2167},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2169},"end":{"line":74,"column":39,"offset":2327},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2329},"end":{"line":76,"column":31,"offset":2359},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2329},"end":{"line":76,"column":31,"offset":2359},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2361},"end":{"line":89,"column":19,"offset":2662},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2667},"end":{"line":91,"column":11,"offset":2674},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2664},"end":{"line":91,"column":11,"offset":2674},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2679},"end":{"line":93,"column":11,"offset":2686},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2677},"end":{"line":93,"column":13,"offset":2688},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2676},"end":{"line":93,"column":44,"offset":2719},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.","position":{"start":{"line":93,"column":44,"offset":2719},"end":{"line":94,"column":103,"offset":2879},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2676},"end":{"line":94,"column":103,"offset":2879},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2881},"end":{"line":96,"column":72,"offset":2952},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2954},"end":{"line":98,"column":22,"offset":2975},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2954},"end":{"line":98,"column":22,"offset":2975},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":2977},"end":{"line":105,"column":22,"offset":3101},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3105},"end":{"line":106,"column":11,"offset":3112},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3102},"end":{"line":106,"column":11,"offset":3112},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3114},"end":{"line":109,"column":117,"offset":3364},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3114},"end":{"line":109,"column":117,"offset":3364},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3366},"end":{"line":111,"column":78,"offset":3443},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kerberos factory","position":{"start":{"line":113,"column":4,"offset":3448},"end":{"line":113,"column":20,"offset":3464},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3445},"end":{"line":113,"column":20,"offset":3464},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":115,"column":1,"offset":3466},"end":{"line":115,"column":74,"offset":3539},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":115,"column":76,"offset":3541},"end":{"line":115,"column":83,"offset":3548},"indent":[]}}],"position":{"start":{"line":115,"column":74,"offset":3539},"end":{"line":115,"column":85,"offset":3550},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating","position":{"start":{"line":115,"column":85,"offset":3550},"end":{"line":115,"column":128,"offset":3593},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":3466},"end":{"line":115,"column":128,"offset":3593},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":117,"column":1,"offset":3595},"end":{"line":117,"column":47,"offset":3641},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":120,"column":1,"offset":3644},"end":{"line":120,"column":31,"offset":3674},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":120,"column":31,"offset":3674}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Kerberos factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-14a114bb1c5de41c24fe708adbdb44df.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-14a114bb1c5de41c24fe708adbdb44df.json new file mode 100644 index 0000000..c6425e4 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-14a114bb1c5de41c24fe708adbdb44df.json @@ -0,0 +1 @@ +{"expireTime":9007200838781045000,"key":"gatsby-plugin-mdx-entire-payload-5067ee2426221eaae59d6429f33ee875-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":73,"column":1,"offset":2191},"end":{"line":84,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":86,"column":4,"offset":2497},"end":{"line":86,"column":11,"offset":2504},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2494},"end":{"line":86,"column":11,"offset":2504},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Traefik is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily.","position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":113,"offset":2618},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":113,"offset":2618},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":90,"column":1,"offset":2620},"end":{"line":90,"column":72,"offset":2691},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":93,"column":1,"offset":2694},"end":{"line":93,"column":31,"offset":2724},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":93,"column":31,"offset":2724}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-19ff9e1f7611a30989b3cc7a7f4300ef.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-19ff9e1f7611a30989b3cc7a7f4300ef.json new file mode 100644 index 0000000..3f69705 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-19ff9e1f7611a30989b3cc7a7f4300ef.json @@ -0,0 +1 @@ +{"expireTime":9007200838783455000,"key":"gatsby-plugin-mdx-entire-payload-ed7ec63e528ae87eeec0205843656bc2-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":73,"column":1,"offset":2191},"end":{"line":84,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":86,"column":4,"offset":2497},"end":{"line":86,"column":11,"offset":2504},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2494},"end":{"line":86,"column":11,"offset":2504},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":88,"column":4,"offset":2509},"end":{"line":88,"column":11,"offset":2516},"indent":[]}}],"position":{"start":{"line":88,"column":2,"offset":2507},"end":{"line":88,"column":13,"offset":2518},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":44,"offset":2549},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.","position":{"start":{"line":88,"column":44,"offset":2549},"end":{"line":88,"column":204,"offset":2709},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":204,"offset":2709},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":90,"column":1,"offset":2711},"end":{"line":90,"column":72,"offset":2782},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":92,"column":1,"offset":2784},"end":{"line":92,"column":22,"offset":2805},"indent":[]}}],"position":{"start":{"line":92,"column":1,"offset":2784},"end":{"line":92,"column":22,"offset":2805},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":94,"column":1,"offset":2807},"end":{"line":99,"column":22,"offset":2931},"indent":[1,1,1,1,1]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":101,"column":3,"offset":2935},"end":{"line":101,"column":10,"offset":2942},"indent":[]}}],"position":{"start":{"line":101,"column":1,"offset":2933},"end":{"line":101,"column":10,"offset":2942},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database.","position":{"start":{"line":103,"column":1,"offset":2944},"end":{"line":104,"column":44,"offset":3121},"indent":[1]}}],"position":{"start":{"line":103,"column":1,"offset":2944},"end":{"line":104,"column":44,"offset":3121},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":106,"column":1,"offset":3123},"end":{"line":106,"column":78,"offset":3200},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":109,"column":1,"offset":3203},"end":{"line":109,"column":31,"offset":3233},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":109,"column":31,"offset":3233}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-19ffd27e7017ef6077162903c384b5d8.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-19ffd27e7017ef6077162903c384b5d8.json deleted file mode 100644 index 480e4d7..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-19ffd27e7017ef6077162903c384b5d8.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838684805000,"key":"gatsby-plugin-mdx-entire-payload-9aacba489859b87857f1b6c84cfff2b6-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Release notes","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":16,"offset":174},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":16,"offset":174},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.8.0","position":{"start":{"line":10,"column":5,"offset":180},"end":{"line":10,"column":10,"offset":185},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":10,"offset":185},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Aligned machinery, web and KiOS versions. Too many people were confused by the versioning.","position":{"start":{"line":12,"column":1,"offset":187},"end":{"line":12,"column":91,"offset":277},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":187},"end":{"line":12,"column":91,"offset":277},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":14,"column":6,"offset":284},"end":{"line":14,"column":9,"offset":287},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":279},"end":{"line":14,"column":9,"offset":287},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Videos displayed on canvas were blocked in latest browsers.","position":{"start":{"line":16,"column":3,"offset":291},"end":{"line":16,"column":62,"offset":350},"indent":[]}}],"position":{"start":{"line":16,"column":3,"offset":291},"end":{"line":16,"column":62,"offset":350},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":289},"end":{"line":16,"column":62,"offset":350},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disabled reboot and shutdown.","position":{"start":{"line":17,"column":3,"offset":353},"end":{"line":17,"column":32,"offset":382},"indent":[]}}],"position":{"start":{"line":17,"column":3,"offset":353},"end":{"line":17,"column":32,"offset":382},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":351},"end":{"line":17,"column":32,"offset":382},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disabled upgrade process, use fwupdate shell command instead.","position":{"start":{"line":18,"column":3,"offset":385},"end":{"line":18,"column":64,"offset":446},"indent":[]}}],"position":{"start":{"line":18,"column":3,"offset":385},"end":{"line":18,"column":64,"offset":446},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":383},"end":{"line":18,"column":64,"offset":446},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":289},"end":{"line":18,"column":64,"offset":446},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":20,"column":6,"offset":453},"end":{"line":20,"column":10,"offset":457},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":448},"end":{"line":20,"column":10,"offset":457},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Major upgrade, solved many different problems (list to long); not possible to upgrade from 2.7.0 to 2.8.0.","position":{"start":{"line":22,"column":3,"offset":461},"end":{"line":22,"column":109,"offset":567},"indent":[]}}],"position":{"start":{"line":22,"column":3,"offset":461},"end":{"line":22,"column":109,"offset":567},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":459},"end":{"line":22,"column":109,"offset":567},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).","position":{"start":{"line":23,"column":3,"offset":570},"end":{"line":23,"column":73,"offset":640},"indent":[]}}],"position":{"start":{"line":23,"column":3,"offset":570},"end":{"line":23,"column":73,"offset":640},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":568},"end":{"line":23,"column":73,"offset":640},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi 4.","position":{"start":{"line":24,"column":3,"offset":643},"end":{"line":24,"column":34,"offset":674},"indent":[]}}],"position":{"start":{"line":24,"column":3,"offset":643},"end":{"line":24,"column":34,"offset":674},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":641},"end":{"line":24,"column":34,"offset":674},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":459},"end":{"line":24,"column":34,"offset":674},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.7.2","position":{"start":{"line":26,"column":5,"offset":680},"end":{"line":26,"column":10,"offset":685},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":676},"end":{"line":26,"column":10,"offset":685},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":28,"column":6,"offset":692},"end":{"line":28,"column":15,"offset":701},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":687},"end":{"line":28,"column":15,"offset":701},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"To optimise the cloud experience we've added a proxy.kerberos.io machine in between.","position":{"start":{"line":30,"column":3,"offset":705},"end":{"line":30,"column":87,"offset":789},"indent":[]}}],"position":{"start":{"line":30,"column":3,"offset":705},"end":{"line":30,"column":87,"offset":789},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":703},"end":{"line":30,"column":87,"offset":789},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"We've changed the S3 storage scheme (class:ONEZONE_IA).","position":{"start":{"line":31,"column":3,"offset":792},"end":{"line":31,"column":58,"offset":847},"indent":[]}}],"position":{"start":{"line":31,"column":3,"offset":792},"end":{"line":31,"column":58,"offset":847},"indent":[]}}],"position":{"start":{"line":31,"column":1,"offset":790},"end":{"line":31,"column":58,"offset":847},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":703},"end":{"line":31,"column":58,"offset":847},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.7.1","position":{"start":{"line":33,"column":5,"offset":853},"end":{"line":33,"column":10,"offset":858},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":849},"end":{"line":33,"column":10,"offset":858},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":35,"column":6,"offset":865},"end":{"line":35,"column":15,"offset":874},"indent":[]}}],"position":{"start":{"line":35,"column":1,"offset":860},"end":{"line":35,"column":15,"offset":874},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved deadlock with livestreaming while restarting machinery.","position":{"start":{"line":37,"column":3,"offset":878},"end":{"line":37,"column":67,"offset":942},"indent":[]}}],"position":{"start":{"line":37,"column":3,"offset":878},"end":{"line":37,"column":67,"offset":942},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":876},"end":{"line":37,"column":67,"offset":942},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Revert logging library; enabled log rotating.","position":{"start":{"line":38,"column":3,"offset":945},"end":{"line":38,"column":48,"offset":990},"indent":[]}}],"position":{"start":{"line":38,"column":3,"offset":945},"end":{"line":38,"column":48,"offset":990},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":943},"end":{"line":38,"column":48,"offset":990},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":876},"end":{"line":38,"column":48,"offset":990},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":40,"column":6,"offset":997},"end":{"line":40,"column":10,"offset":1001},"indent":[]}}],"position":{"start":{"line":40,"column":1,"offset":992},"end":{"line":40,"column":10,"offset":1001},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).","position":{"start":{"line":42,"column":3,"offset":1005},"end":{"line":42,"column":73,"offset":1075},"indent":[]}}],"position":{"start":{"line":42,"column":3,"offset":1005},"end":{"line":42,"column":73,"offset":1075},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":1003},"end":{"line":42,"column":73,"offset":1075},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved issue with WIFI on Raspberry Pi 3B+","position":{"start":{"line":43,"column":3,"offset":1078},"end":{"line":43,"column":47,"offset":1122},"indent":[]}}],"position":{"start":{"line":43,"column":3,"offset":1078},"end":{"line":43,"column":47,"offset":1122},"indent":[]}}],"position":{"start":{"line":43,"column":1,"offset":1076},"end":{"line":43,"column":47,"offset":1122},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":1003},"end":{"line":43,"column":47,"offset":1122},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.7.0","position":{"start":{"line":45,"column":5,"offset":1128},"end":{"line":45,"column":10,"offset":1133},"indent":[]}}],"position":{"start":{"line":45,"column":1,"offset":1124},"end":{"line":45,"column":10,"offset":1133},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":47,"column":6,"offset":1140},"end":{"line":47,"column":9,"offset":1143},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":1135},"end":{"line":47,"column":9,"offset":1143},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Unique session cookie, which allows to open multiple web interfaces (e.g. when using docker).","position":{"start":{"line":49,"column":3,"offset":1147},"end":{"line":49,"column":96,"offset":1240},"indent":[]}}],"position":{"start":{"line":49,"column":3,"offset":1147},"end":{"line":49,"column":96,"offset":1240},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1145},"end":{"line":49,"column":96,"offset":1240},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1145},"end":{"line":49,"column":96,"offset":1240},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":51,"column":6,"offset":1247},"end":{"line":51,"column":15,"offset":1256},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1242},"end":{"line":51,"column":15,"offset":1256},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added live streaming feature for app.kerberos.io","position":{"start":{"line":53,"column":3,"offset":1260},"end":{"line":53,"column":51,"offset":1308},"indent":[]}}],"position":{"start":{"line":53,"column":3,"offset":1260},"end":{"line":53,"column":51,"offset":1308},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1258},"end":{"line":53,"column":51,"offset":1308},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgraded logging library: log file can be max 5MB, and will rotate.","position":{"start":{"line":54,"column":3,"offset":1311},"end":{"line":54,"column":70,"offset":1378},"indent":[]}}],"position":{"start":{"line":54,"column":3,"offset":1311},"end":{"line":54,"column":70,"offset":1378},"indent":[]}}],"position":{"start":{"line":54,"column":1,"offset":1309},"end":{"line":54,"column":70,"offset":1378},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Better logging for cloud uploads (failed information).","position":{"start":{"line":55,"column":3,"offset":1381},"end":{"line":55,"column":57,"offset":1435},"indent":[]}}],"position":{"start":{"line":55,"column":3,"offset":1381},"end":{"line":55,"column":57,"offset":1435},"indent":[]}}],"position":{"start":{"line":55,"column":1,"offset":1379},"end":{"line":55,"column":57,"offset":1435},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1258},"end":{"line":55,"column":57,"offset":1435},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":57,"column":6,"offset":1442},"end":{"line":57,"column":12,"offset":1448},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1437},"end":{"line":57,"column":12,"offset":1448},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"No longer need docker-compose, we merged the web and machinery containers to ","position":{"start":{"line":59,"column":3,"offset":1452},"end":{"line":59,"column":80,"offset":1529},"indent":[]}},{"type":"link","title":null,"url":"http://hub.docker.com/r/kerberos/kerberos","children":[{"type":"text","value":"a single container","position":{"start":{"line":59,"column":81,"offset":1530},"end":{"line":59,"column":99,"offset":1548},"indent":[]}}],"position":{"start":{"line":59,"column":80,"offset":1529},"end":{"line":59,"column":143,"offset":1592},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":59,"column":143,"offset":1592},"end":{"line":59,"column":144,"offset":1593},"indent":[]}}],"position":{"start":{"line":59,"column":3,"offset":1452},"end":{"line":59,"column":144,"offset":1593},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":1450},"end":{"line":59,"column":144,"offset":1593},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":1450},"end":{"line":59,"column":144,"offset":1593},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":61,"column":6,"offset":1600},"end":{"line":61,"column":10,"offset":1604},"indent":[]}}],"position":{"start":{"line":61,"column":1,"offset":1595},"end":{"line":61,"column":10,"offset":1604},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Updated firmware to latest Raspbian.","position":{"start":{"line":63,"column":3,"offset":1608},"end":{"line":63,"column":39,"offset":1644},"indent":[]}}],"position":{"start":{"line":63,"column":3,"offset":1608},"end":{"line":63,"column":39,"offset":1644},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1606},"end":{"line":63,"column":39,"offset":1644},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi 3B+.","position":{"start":{"line":64,"column":3,"offset":1647},"end":{"line":64,"column":36,"offset":1680},"indent":[]}}],"position":{"start":{"line":64,"column":3,"offset":1647},"end":{"line":64,"column":36,"offset":1680},"indent":[]}}],"position":{"start":{"line":64,"column":1,"offset":1645},"end":{"line":64,"column":36,"offset":1680},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1606},"end":{"line":64,"column":36,"offset":1680},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.6.1","position":{"start":{"line":66,"column":5,"offset":1686},"end":{"line":66,"column":10,"offset":1691},"indent":[]}}],"position":{"start":{"line":66,"column":1,"offset":1682},"end":{"line":66,"column":10,"offset":1691},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":68,"column":6,"offset":1698},"end":{"line":68,"column":9,"offset":1701},"indent":[]}}],"position":{"start":{"line":68,"column":1,"offset":1693},"end":{"line":68,"column":9,"offset":1701},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Solved issue with persisting login configuration. ","position":{"start":{"line":70,"column":3,"offset":1705},"end":{"line":70,"column":53,"offset":1755},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/111","children":[{"type":"text","value":"#111","position":{"start":{"line":70,"column":54,"offset":1756},"end":{"line":70,"column":58,"offset":1760},"indent":[]}}],"position":{"start":{"line":70,"column":53,"offset":1755},"end":{"line":70,"column":106,"offset":1808},"indent":[]}}],"position":{"start":{"line":70,"column":3,"offset":1705},"end":{"line":70,"column":106,"offset":1808},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":1703},"end":{"line":70,"column":106,"offset":1808},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":1703},"end":{"line":70,"column":106,"offset":1808},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":72,"column":6,"offset":1815},"end":{"line":72,"column":15,"offset":1824},"indent":[]}}],"position":{"start":{"line":72,"column":1,"offset":1810},"end":{"line":72,"column":15,"offset":1824},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added Pushbullet. ","position":{"start":{"line":74,"column":3,"offset":1828},"end":{"line":74,"column":21,"offset":1846},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/pull/139","children":[{"type":"text","value":"#139","position":{"start":{"line":74,"column":22,"offset":1847},"end":{"line":74,"column":26,"offset":1851},"indent":[]}}],"position":{"start":{"line":74,"column":21,"offset":1846},"end":{"line":74,"column":78,"offset":1903},"indent":[]}}],"position":{"start":{"line":74,"column":3,"offset":1828},"end":{"line":74,"column":78,"offset":1903},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":1826},"end":{"line":74,"column":78,"offset":1903},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Cloud upload was not longer working (hotfix also in 2.6.0).","position":{"start":{"line":75,"column":3,"offset":1906},"end":{"line":75,"column":62,"offset":1965},"indent":[]}}],"position":{"start":{"line":75,"column":3,"offset":1906},"end":{"line":75,"column":62,"offset":1965},"indent":[]}}],"position":{"start":{"line":75,"column":1,"offset":1904},"end":{"line":75,"column":62,"offset":1965},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":1826},"end":{"line":75,"column":62,"offset":1965},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.6.0","position":{"start":{"line":77,"column":5,"offset":1971},"end":{"line":77,"column":10,"offset":1976},"indent":[]}}],"position":{"start":{"line":77,"column":1,"offset":1967},"end":{"line":77,"column":10,"offset":1976},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":79,"column":6,"offset":1983},"end":{"line":79,"column":9,"offset":1986},"indent":[]}}],"position":{"start":{"line":79,"column":1,"offset":1978},"end":{"line":79,"column":9,"offset":1986},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add a cloud connection verification method. ","position":{"start":{"line":81,"column":3,"offset":1990},"end":{"line":81,"column":47,"offset":2034},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/112","children":[{"type":"text","value":"#112","position":{"start":{"line":81,"column":48,"offset":2035},"end":{"line":81,"column":52,"offset":2039},"indent":[]}}],"position":{"start":{"line":81,"column":47,"offset":2034},"end":{"line":81,"column":100,"offset":2087},"indent":[]}}],"position":{"start":{"line":81,"column":3,"offset":1990},"end":{"line":81,"column":100,"offset":2087},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":1988},"end":{"line":81,"column":100,"offset":2087},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":1988},"end":{"line":81,"column":100,"offset":2087},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":83,"column":6,"offset":2094},"end":{"line":83,"column":15,"offset":2103},"indent":[]}}],"position":{"start":{"line":83,"column":1,"offset":2089},"end":{"line":83,"column":15,"offset":2103},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add background color timestamp. ","position":{"start":{"line":85,"column":3,"offset":2107},"end":{"line":85,"column":35,"offset":2139},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/128","children":[{"type":"text","value":"#128","position":{"start":{"line":85,"column":36,"offset":2140},"end":{"line":85,"column":40,"offset":2144},"indent":[]}}],"position":{"start":{"line":85,"column":35,"offset":2139},"end":{"line":85,"column":94,"offset":2198},"indent":[]}}],"position":{"start":{"line":85,"column":3,"offset":2107},"end":{"line":85,"column":94,"offset":2198},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":2105},"end":{"line":85,"column":94,"offset":2198},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Send instanceId in AWS header when uploading to cloud (necessary for new cloud app).","position":{"start":{"line":86,"column":3,"offset":2201},"end":{"line":86,"column":87,"offset":2285},"indent":[]}}],"position":{"start":{"line":86,"column":3,"offset":2201},"end":{"line":86,"column":87,"offset":2285},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2199},"end":{"line":86,"column":87,"offset":2285},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Better support for Chinese IP cameras.","position":{"start":{"line":87,"column":3,"offset":2288},"end":{"line":87,"column":41,"offset":2326},"indent":[]}}],"position":{"start":{"line":87,"column":3,"offset":2288},"end":{"line":87,"column":41,"offset":2326},"indent":[]}}],"position":{"start":{"line":87,"column":1,"offset":2286},"end":{"line":87,"column":41,"offset":2326},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":2105},"end":{"line":87,"column":41,"offset":2326},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":89,"column":6,"offset":2333},"end":{"line":89,"column":12,"offset":2339},"indent":[]}}],"position":{"start":{"line":89,"column":1,"offset":2328},"end":{"line":89,"column":12,"offset":2339},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: Autoremove old images/video within Docker Containers. ","position":{"start":{"line":91,"column":3,"offset":2343},"end":{"line":91,"column":62,"offset":2402},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/104","children":[{"type":"text","value":"#104","position":{"start":{"line":91,"column":63,"offset":2403},"end":{"line":91,"column":67,"offset":2407},"indent":[]}}],"position":{"start":{"line":91,"column":62,"offset":2402},"end":{"line":91,"column":115,"offset":2455},"indent":[]}}],"position":{"start":{"line":91,"column":3,"offset":2343},"end":{"line":91,"column":115,"offset":2455},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2341},"end":{"line":91,"column":115,"offset":2455},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2341},"end":{"line":91,"column":115,"offset":2455},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.5.0","position":{"start":{"line":93,"column":5,"offset":2461},"end":{"line":93,"column":10,"offset":2466},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2457},"end":{"line":93,"column":10,"offset":2466},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":95,"column":6,"offset":2473},"end":{"line":95,"column":9,"offset":2476},"indent":[]}}],"position":{"start":{"line":95,"column":1,"offset":2468},"end":{"line":95,"column":9,"offset":2476},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added Chinese and Italian language.","position":{"start":{"line":97,"column":3,"offset":2480},"end":{"line":97,"column":38,"offset":2515},"indent":[]}}],"position":{"start":{"line":97,"column":3,"offset":2480},"end":{"line":97,"column":38,"offset":2515},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":2478},"end":{"line":97,"column":38,"offset":2515},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved issue with INSTALLED=true.","position":{"start":{"line":98,"column":3,"offset":2518},"end":{"line":98,"column":38,"offset":2553},"indent":[]}}],"position":{"start":{"line":98,"column":3,"offset":2518},"end":{"line":98,"column":38,"offset":2553},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2516},"end":{"line":98,"column":38,"offset":2553},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Make latest_sequence available with basic auth. ","position":{"start":{"line":99,"column":3,"offset":2556},"end":{"line":99,"column":52,"offset":2605},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/99","children":[{"type":"text","value":"#99","position":{"start":{"line":99,"column":53,"offset":2606},"end":{"line":99,"column":56,"offset":2609},"indent":[]}}],"position":{"start":{"line":99,"column":52,"offset":2605},"end":{"line":99,"column":103,"offset":2656},"indent":[]}}],"position":{"start":{"line":99,"column":3,"offset":2556},"end":{"line":99,"column":103,"offset":2656},"indent":[]}}],"position":{"start":{"line":99,"column":1,"offset":2554},"end":{"line":99,"column":103,"offset":2656},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":2478},"end":{"line":99,"column":103,"offset":2656},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":101,"column":6,"offset":2663},"end":{"line":101,"column":15,"offset":2672},"indent":[]}}],"position":{"start":{"line":101,"column":1,"offset":2658},"end":{"line":101,"column":15,"offset":2672},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Provide an IO service for publishing events to MQTT. ","position":{"start":{"line":103,"column":3,"offset":2676},"end":{"line":103,"column":56,"offset":2729},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/89","children":[{"type":"text","value":"#89","position":{"start":{"line":103,"column":57,"offset":2730},"end":{"line":103,"column":60,"offset":2733},"indent":[]}}],"position":{"start":{"line":103,"column":56,"offset":2729},"end":{"line":103,"column":113,"offset":2786},"indent":[]}}],"position":{"start":{"line":103,"column":3,"offset":2676},"end":{"line":103,"column":113,"offset":2786},"indent":[]}}],"position":{"start":{"line":103,"column":1,"offset":2674},"end":{"line":103,"column":113,"offset":2786},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimize recording with H264_OMX. ","position":{"start":{"line":104,"column":3,"offset":2789},"end":{"line":104,"column":37,"offset":2823},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/83","children":[{"type":"text","value":"#83","position":{"start":{"line":104,"column":38,"offset":2824},"end":{"line":104,"column":41,"offset":2827},"indent":[]}}],"position":{"start":{"line":104,"column":37,"offset":2823},"end":{"line":104,"column":94,"offset":2880},"indent":[]}}],"position":{"start":{"line":104,"column":3,"offset":2789},"end":{"line":104,"column":94,"offset":2880},"indent":[]}}],"position":{"start":{"line":104,"column":1,"offset":2787},"end":{"line":104,"column":94,"offset":2880},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Implement throttler for Io detections. ","position":{"start":{"line":105,"column":3,"offset":2883},"end":{"line":105,"column":42,"offset":2922},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/96","children":[{"type":"text","value":"#96","position":{"start":{"line":105,"column":43,"offset":2923},"end":{"line":105,"column":46,"offset":2926},"indent":[]}}],"position":{"start":{"line":105,"column":42,"offset":2922},"end":{"line":105,"column":99,"offset":2979},"indent":[]}}],"position":{"start":{"line":105,"column":3,"offset":2883},"end":{"line":105,"column":99,"offset":2979},"indent":[]}}],"position":{"start":{"line":105,"column":1,"offset":2881},"end":{"line":105,"column":99,"offset":2979},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"SSL version 1.0.0 is no longer accessible in Raspbian. ","position":{"start":{"line":106,"column":3,"offset":2982},"end":{"line":106,"column":58,"offset":3037},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/109","children":[{"type":"text","value":"#109","position":{"start":{"line":106,"column":59,"offset":3038},"end":{"line":106,"column":63,"offset":3042},"indent":[]}}],"position":{"start":{"line":106,"column":58,"offset":3037},"end":{"line":106,"column":117,"offset":3096},"indent":[]}}],"position":{"start":{"line":106,"column":3,"offset":2982},"end":{"line":106,"column":117,"offset":3096},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":2980},"end":{"line":106,"column":117,"offset":3096},"indent":[]}}],"position":{"start":{"line":103,"column":1,"offset":2674},"end":{"line":106,"column":117,"offset":3096},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.4.2","position":{"start":{"line":108,"column":5,"offset":3102},"end":{"line":108,"column":10,"offset":3107},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":3098},"end":{"line":108,"column":10,"offset":3107},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":110,"column":6,"offset":3114},"end":{"line":110,"column":9,"offset":3117},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":3109},"end":{"line":110,"column":9,"offset":3117},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Typo in french translation, causes the web interface crash.","position":{"start":{"line":112,"column":3,"offset":3121},"end":{"line":112,"column":62,"offset":3180},"indent":[]}}],"position":{"start":{"line":112,"column":3,"offset":3121},"end":{"line":112,"column":62,"offset":3180},"indent":[]}}],"position":{"start":{"line":112,"column":1,"offset":3119},"end":{"line":112,"column":62,"offset":3180},"indent":[]}}],"position":{"start":{"line":112,"column":1,"offset":3119},"end":{"line":112,"column":62,"offset":3180},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":114,"column":6,"offset":3187},"end":{"line":114,"column":15,"offset":3196},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3182},"end":{"line":114,"column":15,"offset":3196},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved major bug in livestream: memory leak in stream class. ","position":{"start":{"line":116,"column":3,"offset":3200},"end":{"line":116,"column":66,"offset":3263},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/94","children":[{"type":"text","value":"#94","position":{"start":{"line":116,"column":67,"offset":3264},"end":{"line":116,"column":70,"offset":3267},"indent":[]}}],"position":{"start":{"line":116,"column":66,"offset":3263},"end":{"line":116,"column":123,"offset":3320},"indent":[]}}],"position":{"start":{"line":116,"column":3,"offset":3200},"end":{"line":116,"column":123,"offset":3320},"indent":[]}}],"position":{"start":{"line":116,"column":1,"offset":3198},"end":{"line":116,"column":123,"offset":3320},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Capture health verification: check if the chosen capture device is still grabbing (and didn't stalled).","position":{"start":{"line":117,"column":3,"offset":3323},"end":{"line":117,"column":106,"offset":3426},"indent":[]}}],"position":{"start":{"line":117,"column":3,"offset":3323},"end":{"line":117,"column":106,"offset":3426},"indent":[]}}],"position":{"start":{"line":117,"column":1,"offset":3321},"end":{"line":117,"column":106,"offset":3426},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Extra logging when recording with raspberry pi camera.","position":{"start":{"line":118,"column":3,"offset":3429},"end":{"line":118,"column":57,"offset":3483},"indent":[]}}],"position":{"start":{"line":118,"column":3,"offset":3429},"end":{"line":118,"column":57,"offset":3483},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3427},"end":{"line":118,"column":57,"offset":3483},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Make sure the cloud upload is functioning properly, after an upload it's verified if the files really exist in the cloud.","position":{"start":{"line":119,"column":3,"offset":3486},"end":{"line":119,"column":124,"offset":3607},"indent":[]}}],"position":{"start":{"line":119,"column":3,"offset":3486},"end":{"line":119,"column":124,"offset":3607},"indent":[]}}],"position":{"start":{"line":119,"column":1,"offset":3484},"end":{"line":119,"column":124,"offset":3607},"indent":[]}}],"position":{"start":{"line":116,"column":1,"offset":3198},"end":{"line":119,"column":124,"offset":3607},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.4.1","position":{"start":{"line":121,"column":5,"offset":3613},"end":{"line":121,"column":10,"offset":3618},"indent":[]}}],"position":{"start":{"line":121,"column":1,"offset":3609},"end":{"line":121,"column":10,"offset":3618},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":123,"column":6,"offset":3625},"end":{"line":123,"column":9,"offset":3628},"indent":[]}}],"position":{"start":{"line":123,"column":1,"offset":3620},"end":{"line":123,"column":9,"offset":3628},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Show warning when system is disabled. ","position":{"start":{"line":125,"column":3,"offset":3632},"end":{"line":125,"column":41,"offset":3670},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/88","children":[{"type":"text","value":"#88","position":{"start":{"line":125,"column":42,"offset":3671},"end":{"line":125,"column":45,"offset":3674},"indent":[]}}],"position":{"start":{"line":125,"column":41,"offset":3670},"end":{"line":125,"column":92,"offset":3721},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":125,"column":92,"offset":3721},"end":{"line":125,"column":93,"offset":3722},"indent":[]}}],"position":{"start":{"line":125,"column":3,"offset":3632},"end":{"line":125,"column":93,"offset":3722},"indent":[]}}],"position":{"start":{"line":125,"column":1,"offset":3630},"end":{"line":125,"column":93,"offset":3722},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Hull selector in basic view not always working.","position":{"start":{"line":126,"column":3,"offset":3725},"end":{"line":126,"column":50,"offset":3772},"indent":[]}}],"position":{"start":{"line":126,"column":3,"offset":3725},"end":{"line":126,"column":50,"offset":3772},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":3723},"end":{"line":126,"column":50,"offset":3772},"indent":[]}}],"position":{"start":{"line":125,"column":1,"offset":3630},"end":{"line":126,"column":50,"offset":3772},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.4.0","position":{"start":{"line":128,"column":5,"offset":3778},"end":{"line":128,"column":10,"offset":3783},"indent":[]}}],"position":{"start":{"line":128,"column":1,"offset":3774},"end":{"line":128,"column":10,"offset":3783},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":130,"column":6,"offset":3790},"end":{"line":130,"column":15,"offset":3799},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":3785},"end":{"line":130,"column":15,"offset":3799},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Enable/Disable force network mode.","position":{"start":{"line":132,"column":3,"offset":3803},"end":{"line":132,"column":37,"offset":3837},"indent":[]}}],"position":{"start":{"line":132,"column":3,"offset":3803},"end":{"line":132,"column":37,"offset":3837},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":3801},"end":{"line":132,"column":37,"offset":3837},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Enable/Disable auto removal media.","position":{"start":{"line":133,"column":3,"offset":3840},"end":{"line":133,"column":37,"offset":3874},"indent":[]}}],"position":{"start":{"line":133,"column":3,"offset":3840},"end":{"line":133,"column":37,"offset":3874},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":3838},"end":{"line":133,"column":37,"offset":3874},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":3801},"end":{"line":133,"column":37,"offset":3874},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":135,"column":6,"offset":3881},"end":{"line":135,"column":9,"offset":3884},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":3876},"end":{"line":135,"column":9,"offset":3884},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgrade from Laravel 4.2 to Laravel 5.4 ","position":{"start":{"line":137,"column":3,"offset":3888},"end":{"line":137,"column":43,"offset":3928},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/70","children":[{"type":"text","value":"#70","position":{"start":{"line":137,"column":44,"offset":3929},"end":{"line":137,"column":47,"offset":3932},"indent":[]}}],"position":{"start":{"line":137,"column":43,"offset":3928},"end":{"line":137,"column":94,"offset":3979},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":137,"column":94,"offset":3979},"end":{"line":137,"column":95,"offset":3980},"indent":[]}}],"position":{"start":{"line":137,"column":3,"offset":3888},"end":{"line":137,"column":95,"offset":3980},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":3886},"end":{"line":137,"column":95,"offset":3980},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fix bug with heatmap radius slider ","position":{"start":{"line":138,"column":3,"offset":3983},"end":{"line":138,"column":38,"offset":4018},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/84","children":[{"type":"text","value":"#84","position":{"start":{"line":138,"column":39,"offset":4019},"end":{"line":138,"column":42,"offset":4022},"indent":[]}}],"position":{"start":{"line":138,"column":38,"offset":4018},"end":{"line":138,"column":89,"offset":4069},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":138,"column":89,"offset":4069},"end":{"line":138,"column":90,"offset":4070},"indent":[]}}],"position":{"start":{"line":138,"column":3,"offset":3983},"end":{"line":138,"column":90,"offset":4070},"indent":[]}}],"position":{"start":{"line":138,"column":1,"offset":3981},"end":{"line":138,"column":90,"offset":4070},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Design tweaks toggle button (remove outline).","position":{"start":{"line":139,"column":3,"offset":4073},"end":{"line":139,"column":48,"offset":4118},"indent":[]}}],"position":{"start":{"line":139,"column":3,"offset":4073},"end":{"line":139,"column":48,"offset":4118},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4071},"end":{"line":139,"column":48,"offset":4118},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disabled possibility to timestamp video when using hardware acceleration.","position":{"start":{"line":140,"column":3,"offset":4121},"end":{"line":140,"column":76,"offset":4194},"indent":[]}}],"position":{"start":{"line":140,"column":3,"offset":4121},"end":{"line":140,"column":76,"offset":4194},"indent":[]}}],"position":{"start":{"line":140,"column":1,"offset":4119},"end":{"line":140,"column":76,"offset":4194},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":3886},"end":{"line":140,"column":76,"offset":4194},"indent":[1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":142,"column":6,"offset":4201},"end":{"line":142,"column":12,"offset":4207},"indent":[]}}],"position":{"start":{"line":142,"column":1,"offset":4196},"end":{"line":142,"column":12,"offset":4207},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fix SSL support ","position":{"start":{"line":144,"column":3,"offset":4211},"end":{"line":144,"column":19,"offset":4227},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/docker/issues/4","children":[{"type":"text","value":"#4","position":{"start":{"line":144,"column":20,"offset":4228},"end":{"line":144,"column":22,"offset":4230},"indent":[]}}],"position":{"start":{"line":144,"column":19,"offset":4227},"end":{"line":144,"column":71,"offset":4279},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":144,"column":71,"offset":4279},"end":{"line":144,"column":72,"offset":4280},"indent":[]}}],"position":{"start":{"line":144,"column":3,"offset":4211},"end":{"line":144,"column":72,"offset":4280},"indent":[]}}],"position":{"start":{"line":144,"column":1,"offset":4209},"end":{"line":144,"column":72,"offset":4280},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Auto removal if disk is full.","position":{"start":{"line":145,"column":3,"offset":4283},"end":{"line":145,"column":32,"offset":4312},"indent":[]}}],"position":{"start":{"line":145,"column":3,"offset":4283},"end":{"line":145,"column":32,"offset":4312},"indent":[]}}],"position":{"start":{"line":145,"column":1,"offset":4281},"end":{"line":145,"column":32,"offset":4312},"indent":[]}}],"position":{"start":{"line":144,"column":1,"offset":4209},"end":{"line":145,"column":32,"offset":4312},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":147,"column":6,"offset":4319},"end":{"line":147,"column":15,"offset":4328},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4314},"end":{"line":147,"column":15,"offset":4328},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"OpenMAX IL hardware encoding for Raspberry Pi camera. ","position":{"start":{"line":149,"column":3,"offset":4332},"end":{"line":149,"column":57,"offset":4386},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/83","children":[{"type":"text","value":"#83","position":{"start":{"line":149,"column":58,"offset":4387},"end":{"line":149,"column":61,"offset":4390},"indent":[]}}],"position":{"start":{"line":149,"column":57,"offset":4386},"end":{"line":149,"column":114,"offset":4443},"indent":[]}}],"position":{"start":{"line":149,"column":3,"offset":4332},"end":{"line":149,"column":114,"offset":4443},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimized live streaming.","position":{"start":{"line":150,"column":5,"offset":4448},"end":{"line":150,"column":30,"offset":4473},"indent":[]}}],"position":{"start":{"line":150,"column":5,"offset":4448},"end":{"line":150,"column":30,"offset":4473},"indent":[]}}],"position":{"start":{"line":150,"column":3,"offset":4446},"end":{"line":150,"column":30,"offset":4473},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimized h264 recording.","position":{"start":{"line":151,"column":5,"offset":4478},"end":{"line":151,"column":30,"offset":4503},"indent":[]}}],"position":{"start":{"line":151,"column":5,"offset":4478},"end":{"line":151,"column":30,"offset":4503},"indent":[]}}],"position":{"start":{"line":151,"column":3,"offset":4476},"end":{"line":151,"column":30,"offset":4503},"indent":[]}}],"position":{"start":{"line":150,"column":3,"offset":4446},"end":{"line":151,"column":30,"offset":4503},"indent":[3]}}],"position":{"start":{"line":149,"column":1,"offset":4330},"end":{"line":151,"column":30,"offset":4503},"indent":[1,1]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Basic authentication for live streaming (username and password). ","position":{"start":{"line":152,"column":3,"offset":4506},"end":{"line":152,"column":68,"offset":4571},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/80","children":[{"type":"text","value":"#80","position":{"start":{"line":152,"column":69,"offset":4572},"end":{"line":152,"column":72,"offset":4575},"indent":[]}}],"position":{"start":{"line":152,"column":68,"offset":4571},"end":{"line":152,"column":125,"offset":4628},"indent":[]}}],"position":{"start":{"line":152,"column":3,"offset":4506},"end":{"line":152,"column":125,"offset":4628},"indent":[]}}],"position":{"start":{"line":152,"column":1,"offset":4504},"end":{"line":152,"column":125,"offset":4628},"indent":[]}}],"position":{"start":{"line":149,"column":1,"offset":4330},"end":{"line":152,"column":125,"offset":4628},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.3.1","position":{"start":{"line":154,"column":5,"offset":4634},"end":{"line":154,"column":10,"offset":4639},"indent":[]}}],"position":{"start":{"line":154,"column":1,"offset":4630},"end":{"line":154,"column":10,"offset":4639},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":156,"column":6,"offset":4646},"end":{"line":156,"column":15,"offset":4655},"indent":[]}}],"position":{"start":{"line":156,"column":1,"offset":4641},"end":{"line":156,"column":15,"offset":4655},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Update for kerberos.cloud: pushing content-type.","position":{"start":{"line":158,"column":3,"offset":4659},"end":{"line":158,"column":51,"offset":4707},"indent":[]}}],"position":{"start":{"line":158,"column":3,"offset":4659},"end":{"line":158,"column":51,"offset":4707},"indent":[]}}],"position":{"start":{"line":158,"column":1,"offset":4657},"end":{"line":158,"column":51,"offset":4707},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Change default configurations.","position":{"start":{"line":159,"column":3,"offset":4710},"end":{"line":159,"column":33,"offset":4740},"indent":[]}}],"position":{"start":{"line":159,"column":3,"offset":4710},"end":{"line":159,"column":33,"offset":4740},"indent":[]}}],"position":{"start":{"line":159,"column":1,"offset":4708},"end":{"line":159,"column":33,"offset":4740},"indent":[]}}],"position":{"start":{"line":158,"column":1,"offset":4657},"end":{"line":159,"column":33,"offset":4740},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.3.0","position":{"start":{"line":161,"column":5,"offset":4746},"end":{"line":161,"column":10,"offset":4751},"indent":[]}}],"position":{"start":{"line":161,"column":1,"offset":4742},"end":{"line":161,"column":10,"offset":4751},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":163,"column":6,"offset":4758},"end":{"line":163,"column":15,"offset":4767},"indent":[]}}],"position":{"start":{"line":163,"column":1,"offset":4753},"end":{"line":163,"column":15,"offset":4767},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for Raspberry Pi Zero W. ","position":{"start":{"line":165,"column":3,"offset":4771},"end":{"line":165,"column":36,"offset":4804},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/8","children":[{"type":"text","value":"#8","position":{"start":{"line":165,"column":37,"offset":4805},"end":{"line":165,"column":39,"offset":4807},"indent":[]}}],"position":{"start":{"line":165,"column":36,"offset":4804},"end":{"line":165,"column":86,"offset":4854},"indent":[]}}],"position":{"start":{"line":165,"column":3,"offset":4771},"end":{"line":165,"column":86,"offset":4854},"indent":[]}}],"position":{"start":{"line":165,"column":1,"offset":4769},"end":{"line":165,"column":86,"offset":4854},"indent":[]}}],"position":{"start":{"line":165,"column":1,"offset":4769},"end":{"line":165,"column":86,"offset":4854},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.2.1","position":{"start":{"line":167,"column":5,"offset":4860},"end":{"line":167,"column":10,"offset":4865},"indent":[]}}],"position":{"start":{"line":167,"column":1,"offset":4856},"end":{"line":167,"column":10,"offset":4865},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":169,"column":6,"offset":4872},"end":{"line":169,"column":15,"offset":4881},"indent":[]}}],"position":{"start":{"line":169,"column":1,"offset":4867},"end":{"line":169,"column":15,"offset":4881},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgraded FFmpeg and libx264 on KiOS.","position":{"start":{"line":171,"column":3,"offset":4885},"end":{"line":171,"column":39,"offset":4921},"indent":[]}}],"position":{"start":{"line":171,"column":3,"offset":4885},"end":{"line":171,"column":39,"offset":4921},"indent":[]}}],"position":{"start":{"line":171,"column":1,"offset":4883},"end":{"line":171,"column":39,"offset":4921},"indent":[]}}],"position":{"start":{"line":171,"column":1,"offset":4883},"end":{"line":171,"column":39,"offset":4921},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":173,"column":6,"offset":4928},"end":{"line":173,"column":9,"offset":4931},"indent":[]}}],"position":{"start":{"line":173,"column":1,"offset":4923},"end":{"line":173,"column":9,"offset":4931},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add Bulgarian translation. ","position":{"start":{"line":175,"column":3,"offset":4935},"end":{"line":175,"column":30,"offset":4962},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/pull/81","children":[{"type":"text","value":"#81","position":{"start":{"line":175,"column":31,"offset":4963},"end":{"line":175,"column":34,"offset":4966},"indent":[]}}],"position":{"start":{"line":175,"column":30,"offset":4962},"end":{"line":175,"column":79,"offset":5011},"indent":[]}}],"position":{"start":{"line":175,"column":3,"offset":4935},"end":{"line":175,"column":79,"offset":5011},"indent":[]}}],"position":{"start":{"line":175,"column":1,"offset":4933},"end":{"line":175,"column":79,"offset":5011},"indent":[]}}],"position":{"start":{"line":175,"column":1,"offset":4933},"end":{"line":175,"column":79,"offset":5011},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":177,"column":6,"offset":5018},"end":{"line":177,"column":15,"offset":5027},"indent":[]}}],"position":{"start":{"line":177,"column":1,"offset":5013},"end":{"line":177,"column":15,"offset":5027},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: IoVideo crashes due to a memory leak. ","position":{"start":{"line":179,"column":3,"offset":5031},"end":{"line":179,"column":46,"offset":5074},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/70","children":[{"type":"text","value":"#70","position":{"start":{"line":179,"column":47,"offset":5075},"end":{"line":179,"column":50,"offset":5078},"indent":[]}}],"position":{"start":{"line":179,"column":46,"offset":5074},"end":{"line":179,"column":103,"offset":5131},"indent":[]}}],"position":{"start":{"line":179,"column":3,"offset":5031},"end":{"line":179,"column":103,"offset":5131},"indent":[]}}],"position":{"start":{"line":179,"column":1,"offset":5029},"end":{"line":179,"column":103,"offset":5131},"indent":[]}}],"position":{"start":{"line":179,"column":1,"offset":5029},"end":{"line":179,"column":103,"offset":5131},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.2.0","position":{"start":{"line":181,"column":5,"offset":5137},"end":{"line":181,"column":10,"offset":5142},"indent":[]}}],"position":{"start":{"line":181,"column":1,"offset":5133},"end":{"line":181,"column":10,"offset":5142},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":183,"column":6,"offset":5149},"end":{"line":183,"column":15,"offset":5158},"indent":[]}}],"position":{"start":{"line":183,"column":1,"offset":5144},"end":{"line":183,"column":15,"offset":5158},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added support for Armbian.","position":{"start":{"line":185,"column":3,"offset":5162},"end":{"line":185,"column":29,"offset":5188},"indent":[]}}],"position":{"start":{"line":185,"column":3,"offset":5162},"end":{"line":185,"column":29,"offset":5188},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":5160},"end":{"line":185,"column":29,"offset":5188},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Raspbian: Async requests causes session corruption. ","position":{"start":{"line":186,"column":3,"offset":5191},"end":{"line":186,"column":55,"offset":5243},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/78","children":[{"type":"text","value":"#78","position":{"start":{"line":186,"column":56,"offset":5244},"end":{"line":186,"column":59,"offset":5247},"indent":[]}}],"position":{"start":{"line":186,"column":55,"offset":5243},"end":{"line":186,"column":106,"offset":5294},"indent":[]}}],"position":{"start":{"line":186,"column":3,"offset":5191},"end":{"line":186,"column":106,"offset":5294},"indent":[]}}],"position":{"start":{"line":186,"column":1,"offset":5189},"end":{"line":186,"column":106,"offset":5294},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":5160},"end":{"line":186,"column":106,"offset":5294},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":188,"column":6,"offset":5301},"end":{"line":188,"column":9,"offset":5304},"indent":[]}}],"position":{"start":{"line":188,"column":1,"offset":5296},"end":{"line":188,"column":9,"offset":5304},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: Issue format instance name. ","position":{"start":{"line":190,"column":3,"offset":5308},"end":{"line":190,"column":36,"offset":5341},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/57","children":[{"type":"text","value":"#57","position":{"start":{"line":190,"column":37,"offset":5342},"end":{"line":190,"column":40,"offset":5345},"indent":[]}}],"position":{"start":{"line":190,"column":36,"offset":5341},"end":{"line":190,"column":87,"offset":5392},"indent":[]}}],"position":{"start":{"line":190,"column":3,"offset":5308},"end":{"line":190,"column":87,"offset":5392},"indent":[]}}],"position":{"start":{"line":190,"column":1,"offset":5306},"end":{"line":190,"column":87,"offset":5392},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Redesign settings page (better UX). ","position":{"start":{"line":191,"column":3,"offset":5395},"end":{"line":191,"column":39,"offset":5431},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/39","children":[{"type":"text","value":"#39","position":{"start":{"line":191,"column":40,"offset":5432},"end":{"line":191,"column":43,"offset":5435},"indent":[]}}],"position":{"start":{"line":191,"column":39,"offset":5431},"end":{"line":191,"column":90,"offset":5482},"indent":[]}}],"position":{"start":{"line":191,"column":3,"offset":5395},"end":{"line":191,"column":90,"offset":5482},"indent":[]}}],"position":{"start":{"line":191,"column":1,"offset":5393},"end":{"line":191,"column":90,"offset":5482},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Possibility to edit password through web interface. ","position":{"start":{"line":192,"column":3,"offset":5485},"end":{"line":192,"column":55,"offset":5537},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/63","children":[{"type":"text","value":"#63","position":{"start":{"line":192,"column":56,"offset":5538},"end":{"line":192,"column":59,"offset":5541},"indent":[]}}],"position":{"start":{"line":192,"column":55,"offset":5537},"end":{"line":192,"column":106,"offset":5588},"indent":[]}}],"position":{"start":{"line":192,"column":3,"offset":5485},"end":{"line":192,"column":106,"offset":5588},"indent":[]}}],"position":{"start":{"line":192,"column":1,"offset":5483},"end":{"line":192,"column":106,"offset":5588},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for viewing videos.","position":{"start":{"line":193,"column":3,"offset":5591},"end":{"line":193,"column":30,"offset":5618},"indent":[]}}],"position":{"start":{"line":193,"column":3,"offset":5591},"end":{"line":193,"column":30,"offset":5618},"indent":[]}}],"position":{"start":{"line":193,"column":1,"offset":5589},"end":{"line":193,"column":30,"offset":5618},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Update radius of heatmap.","position":{"start":{"line":194,"column":3,"offset":5621},"end":{"line":194,"column":28,"offset":5646},"indent":[]}}],"position":{"start":{"line":194,"column":3,"offset":5621},"end":{"line":194,"column":28,"offset":5646},"indent":[]}}],"position":{"start":{"line":194,"column":1,"offset":5619},"end":{"line":194,"column":28,"offset":5646},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"PHP7 support. ","position":{"start":{"line":195,"column":3,"offset":5649},"end":{"line":195,"column":17,"offset":5663},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/60","children":[{"type":"text","value":"#60","position":{"start":{"line":195,"column":18,"offset":5664},"end":{"line":195,"column":21,"offset":5667},"indent":[]}}],"position":{"start":{"line":195,"column":17,"offset":5663},"end":{"line":195,"column":68,"offset":5714},"indent":[]}}],"position":{"start":{"line":195,"column":3,"offset":5649},"end":{"line":195,"column":68,"offset":5714},"indent":[]}}],"position":{"start":{"line":195,"column":1,"offset":5647},"end":{"line":195,"column":68,"offset":5714},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Welcome/installation page. ","position":{"start":{"line":196,"column":3,"offset":5717},"end":{"line":196,"column":30,"offset":5744},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/60","children":[{"type":"text","value":"#60","position":{"start":{"line":196,"column":31,"offset":5745},"end":{"line":196,"column":34,"offset":5748},"indent":[]}}],"position":{"start":{"line":196,"column":30,"offset":5744},"end":{"line":196,"column":81,"offset":5795},"indent":[]}}],"position":{"start":{"line":196,"column":3,"offset":5717},"end":{"line":196,"column":81,"offset":5795},"indent":[]}}],"position":{"start":{"line":196,"column":1,"offset":5715},"end":{"line":196,"column":81,"offset":5795},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Translation updated. ","position":{"start":{"line":197,"column":3,"offset":5798},"end":{"line":197,"column":24,"offset":5819},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/74","children":[{"type":"text","value":"#74","position":{"start":{"line":197,"column":25,"offset":5820},"end":{"line":197,"column":28,"offset":5823},"indent":[]}}],"position":{"start":{"line":197,"column":24,"offset":5819},"end":{"line":197,"column":75,"offset":5870},"indent":[]}}],"position":{"start":{"line":197,"column":3,"offset":5798},"end":{"line":197,"column":75,"offset":5870},"indent":[]}}],"position":{"start":{"line":197,"column":1,"offset":5796},"end":{"line":197,"column":75,"offset":5870},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Privacy mode. ","position":{"start":{"line":198,"column":3,"offset":5873},"end":{"line":198,"column":17,"offset":5887},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/54","children":[{"type":"text","value":"#54","position":{"start":{"line":198,"column":18,"offset":5888},"end":{"line":198,"column":21,"offset":5891},"indent":[]}}],"position":{"start":{"line":198,"column":17,"offset":5887},"end":{"line":198,"column":68,"offset":5938},"indent":[]}}],"position":{"start":{"line":198,"column":3,"offset":5873},"end":{"line":198,"column":68,"offset":5938},"indent":[]}}],"position":{"start":{"line":198,"column":1,"offset":5871},"end":{"line":198,"column":68,"offset":5938},"indent":[]}}],"position":{"start":{"line":190,"column":1,"offset":5306},"end":{"line":198,"column":68,"offset":5938},"indent":[1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":200,"column":6,"offset":5945},"end":{"line":200,"column":15,"offset":5954},"indent":[]}}],"position":{"start":{"line":200,"column":1,"offset":5940},"end":{"line":200,"column":15,"offset":5954},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Output as video file. ","position":{"start":{"line":202,"column":3,"offset":5958},"end":{"line":202,"column":25,"offset":5980},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/60","children":[{"type":"text","value":"#60","position":{"start":{"line":202,"column":26,"offset":5981},"end":{"line":202,"column":29,"offset":5984},"indent":[]}}],"position":{"start":{"line":202,"column":25,"offset":5980},"end":{"line":202,"column":82,"offset":6037},"indent":[]}}],"position":{"start":{"line":202,"column":3,"offset":5958},"end":{"line":202,"column":82,"offset":6037},"indent":[]}}],"position":{"start":{"line":202,"column":1,"offset":5956},"end":{"line":202,"column":82,"offset":6037},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: System hangs when a wrong IP camera url was defined. ","position":{"start":{"line":203,"column":3,"offset":6040},"end":{"line":203,"column":61,"offset":6098},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/48","children":[{"type":"text","value":"#48","position":{"start":{"line":203,"column":62,"offset":6099},"end":{"line":203,"column":65,"offset":6102},"indent":[]}}],"position":{"start":{"line":203,"column":61,"offset":6098},"end":{"line":203,"column":118,"offset":6155},"indent":[]}}],"position":{"start":{"line":203,"column":3,"offset":6040},"end":{"line":203,"column":118,"offset":6155},"indent":[]}}],"position":{"start":{"line":203,"column":1,"offset":6038},"end":{"line":203,"column":118,"offset":6155},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Run arbitrary script/program. ","position":{"start":{"line":204,"column":3,"offset":6158},"end":{"line":204,"column":33,"offset":6188},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/31","children":[{"type":"text","value":"#31","position":{"start":{"line":204,"column":34,"offset":6189},"end":{"line":204,"column":37,"offset":6192},"indent":[]}}],"position":{"start":{"line":204,"column":33,"offset":6188},"end":{"line":204,"column":90,"offset":6245},"indent":[]}}],"position":{"start":{"line":204,"column":3,"offset":6158},"end":{"line":204,"column":90,"offset":6245},"indent":[]}}],"position":{"start":{"line":204,"column":1,"offset":6156},"end":{"line":204,"column":90,"offset":6245},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: Weird colors from RPi Camera. ","position":{"start":{"line":205,"column":3,"offset":6248},"end":{"line":205,"column":38,"offset":6283},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/64","children":[{"type":"text","value":"#64","position":{"start":{"line":205,"column":39,"offset":6284},"end":{"line":205,"column":42,"offset":6287},"indent":[]}}],"position":{"start":{"line":205,"column":38,"offset":6283},"end":{"line":205,"column":95,"offset":6340},"indent":[]}}],"position":{"start":{"line":205,"column":3,"offset":6248},"end":{"line":205,"column":95,"offset":6340},"indent":[]}}],"position":{"start":{"line":205,"column":1,"offset":6246},"end":{"line":205,"column":95,"offset":6340},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgrade to OpenCV 3.2.0.","position":{"start":{"line":206,"column":3,"offset":6343},"end":{"line":206,"column":27,"offset":6367},"indent":[]}}],"position":{"start":{"line":206,"column":3,"offset":6343},"end":{"line":206,"column":27,"offset":6367},"indent":[]}}],"position":{"start":{"line":206,"column":1,"offset":6341},"end":{"line":206,"column":27,"offset":6367},"indent":[]}}],"position":{"start":{"line":202,"column":1,"offset":5956},"end":{"line":206,"column":27,"offset":6367},"indent":[1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.1.0","position":{"start":{"line":208,"column":5,"offset":6373},"end":{"line":208,"column":10,"offset":6378},"indent":[]}}],"position":{"start":{"line":208,"column":1,"offset":6369},"end":{"line":208,"column":10,"offset":6378},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":210,"column":6,"offset":6385},"end":{"line":210,"column":9,"offset":6388},"indent":[]}}],"position":{"start":{"line":210,"column":1,"offset":6380},"end":{"line":210,"column":9,"offset":6388},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added PhotoSwipe for image overview (easier to browse through images). ","position":{"start":{"line":212,"column":3,"offset":6392},"end":{"line":212,"column":74,"offset":6463},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/45","children":[{"type":"text","value":"#45","position":{"start":{"line":212,"column":75,"offset":6464},"end":{"line":212,"column":78,"offset":6467},"indent":[]}}],"position":{"start":{"line":212,"column":74,"offset":6463},"end":{"line":212,"column":125,"offset":6514},"indent":[]}}],"position":{"start":{"line":212,"column":3,"offset":6392},"end":{"line":212,"column":125,"offset":6514},"indent":[]}}],"position":{"start":{"line":212,"column":1,"offset":6390},"end":{"line":212,"column":125,"offset":6514},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added reboot and shutdown commands. ","position":{"start":{"line":213,"column":3,"offset":6517},"end":{"line":213,"column":39,"offset":6553},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/46","children":[{"type":"text","value":"#46","position":{"start":{"line":213,"column":40,"offset":6554},"end":{"line":213,"column":43,"offset":6557},"indent":[]}}],"position":{"start":{"line":213,"column":39,"offset":6553},"end":{"line":213,"column":90,"offset":6604},"indent":[]}}],"position":{"start":{"line":213,"column":3,"offset":6517},"end":{"line":213,"column":90,"offset":6604},"indent":[]}}],"position":{"start":{"line":213,"column":1,"offset":6515},"end":{"line":213,"column":90,"offset":6604},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added logging view to system page. ","position":{"start":{"line":214,"column":3,"offset":6607},"end":{"line":214,"column":38,"offset":6642},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/33","children":[{"type":"text","value":"#33","position":{"start":{"line":214,"column":39,"offset":6643},"end":{"line":214,"column":42,"offset":6646},"indent":[]}}],"position":{"start":{"line":214,"column":38,"offset":6642},"end":{"line":214,"column":89,"offset":6693},"indent":[]}}],"position":{"start":{"line":214,"column":3,"offset":6607},"end":{"line":214,"column":89,"offset":6693},"indent":[]}}],"position":{"start":{"line":214,"column":1,"offset":6605},"end":{"line":214,"column":89,"offset":6693},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added labels to check if machinery is running.","position":{"start":{"line":215,"column":3,"offset":6696},"end":{"line":215,"column":49,"offset":6742},"indent":[]}}],"position":{"start":{"line":215,"column":3,"offset":6696},"end":{"line":215,"column":49,"offset":6742},"indent":[]}}],"position":{"start":{"line":215,"column":1,"offset":6694},"end":{"line":215,"column":49,"offset":6742},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added error handling if web interface isn’t working properly.","position":{"start":{"line":216,"column":3,"offset":6745},"end":{"line":216,"column":64,"offset":6806},"indent":[]}}],"position":{"start":{"line":216,"column":3,"offset":6745},"end":{"line":216,"column":64,"offset":6806},"indent":[]}}],"position":{"start":{"line":216,"column":1,"offset":6743},"end":{"line":216,"column":64,"offset":6806},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed Heatmap.js fail to load by ad-blocker. ","position":{"start":{"line":217,"column":3,"offset":6809},"end":{"line":217,"column":48,"offset":6854},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/42","children":[{"type":"text","value":"#42","position":{"start":{"line":217,"column":49,"offset":6855},"end":{"line":217,"column":52,"offset":6858},"indent":[]}}],"position":{"start":{"line":217,"column":48,"offset":6854},"end":{"line":217,"column":99,"offset":6905},"indent":[]}}],"position":{"start":{"line":217,"column":3,"offset":6809},"end":{"line":217,"column":99,"offset":6905},"indent":[]}}],"position":{"start":{"line":217,"column":1,"offset":6807},"end":{"line":217,"column":99,"offset":6905},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Show additional information on the dashboard (streaming is opening or not) there is no data available.","position":{"start":{"line":218,"column":3,"offset":6908},"end":{"line":218,"column":105,"offset":7010},"indent":[]}}],"position":{"start":{"line":218,"column":3,"offset":6908},"end":{"line":218,"column":105,"offset":7010},"indent":[]}}],"position":{"start":{"line":218,"column":1,"offset":6906},"end":{"line":218,"column":105,"offset":7010},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Settings page is now visible on mobile (+ changed icon).","position":{"start":{"line":219,"column":3,"offset":7013},"end":{"line":219,"column":59,"offset":7069},"indent":[]}}],"position":{"start":{"line":219,"column":3,"offset":7013},"end":{"line":219,"column":59,"offset":7069},"indent":[]}}],"position":{"start":{"line":219,"column":1,"offset":7011},"end":{"line":219,"column":59,"offset":7069},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed sorting of news articles.","position":{"start":{"line":220,"column":3,"offset":7072},"end":{"line":220,"column":34,"offset":7103},"indent":[]}}],"position":{"start":{"line":220,"column":3,"offset":7072},"end":{"line":220,"column":34,"offset":7103},"indent":[]}}],"position":{"start":{"line":220,"column":1,"offset":7070},"end":{"line":220,"column":34,"offset":7103},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Removed links to assets in the cloud (.css files).","position":{"start":{"line":221,"column":3,"offset":7106},"end":{"line":221,"column":53,"offset":7156},"indent":[]}}],"position":{"start":{"line":221,"column":3,"offset":7106},"end":{"line":221,"column":53,"offset":7156},"indent":[]}}],"position":{"start":{"line":221,"column":1,"offset":7104},"end":{"line":221,"column":53,"offset":7156},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Design: improved layout of login page, async loading of image view.","position":{"start":{"line":222,"column":3,"offset":7159},"end":{"line":222,"column":70,"offset":7226},"indent":[]}}],"position":{"start":{"line":222,"column":3,"offset":7159},"end":{"line":222,"column":70,"offset":7226},"indent":[]}}],"position":{"start":{"line":222,"column":1,"offset":7157},"end":{"line":222,"column":70,"offset":7226},"indent":[]}}],"position":{"start":{"line":212,"column":1,"offset":6390},"end":{"line":222,"column":70,"offset":7226},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":224,"column":6,"offset":7233},"end":{"line":224,"column":15,"offset":7242},"indent":[]}}],"position":{"start":{"line":224,"column":1,"offset":7228},"end":{"line":224,"column":15,"offset":7242},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added configurable streaming port and quality. ","position":{"start":{"line":226,"column":3,"offset":7246},"end":{"line":226,"column":50,"offset":7293},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/41","children":[{"type":"text","value":"#41","position":{"start":{"line":226,"column":51,"offset":7294},"end":{"line":226,"column":54,"offset":7297},"indent":[]}}],"position":{"start":{"line":226,"column":50,"offset":7293},"end":{"line":226,"column":107,"offset":7350},"indent":[]}}],"position":{"start":{"line":226,"column":3,"offset":7246},"end":{"line":226,"column":107,"offset":7350},"indent":[]}}],"position":{"start":{"line":226,"column":1,"offset":7244},"end":{"line":226,"column":107,"offset":7350},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added new algorithm: Background subtraction.","position":{"start":{"line":227,"column":3,"offset":7353},"end":{"line":227,"column":47,"offset":7397},"indent":[]}}],"position":{"start":{"line":227,"column":3,"offset":7353},"end":{"line":227,"column":47,"offset":7397},"indent":[]}}],"position":{"start":{"line":227,"column":1,"offset":7351},"end":{"line":227,"column":47,"offset":7397},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added new heuristic: Counter (for object/people counting). ","position":{"start":{"line":228,"column":3,"offset":7400},"end":{"line":228,"column":62,"offset":7459},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/42","children":[{"type":"text","value":"#42","position":{"start":{"line":228,"column":63,"offset":7460},"end":{"line":228,"column":66,"offset":7463},"indent":[]}}],"position":{"start":{"line":228,"column":62,"offset":7459},"end":{"line":228,"column":119,"offset":7516},"indent":[]}}],"position":{"start":{"line":228,"column":3,"offset":7400},"end":{"line":228,"column":119,"offset":7516},"indent":[]}}],"position":{"start":{"line":228,"column":1,"offset":7398},"end":{"line":228,"column":119,"offset":7516},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added video capture, which can be used for debugging purposes (replay a video fragment).","position":{"start":{"line":229,"column":3,"offset":7519},"end":{"line":229,"column":91,"offset":7607},"indent":[]}}],"position":{"start":{"line":229,"column":3,"offset":7519},"end":{"line":229,"column":91,"offset":7607},"indent":[]}}],"position":{"start":{"line":229,"column":1,"offset":7517},"end":{"line":229,"column":91,"offset":7607},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"It’s now possible to mark the images with a timestamp. ","position":{"start":{"line":230,"column":3,"offset":7610},"end":{"line":230,"column":58,"offset":7665},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/36","children":[{"type":"text","value":"#36","position":{"start":{"line":230,"column":59,"offset":7666},"end":{"line":230,"column":62,"offset":7669},"indent":[]}}],"position":{"start":{"line":230,"column":58,"offset":7665},"end":{"line":230,"column":115,"offset":7722},"indent":[]}}],"position":{"start":{"line":230,"column":3,"offset":7610},"end":{"line":230,"column":115,"offset":7722},"indent":[]}}],"position":{"start":{"line":230,"column":1,"offset":7608},"end":{"line":230,"column":115,"offset":7722},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed blocking streaming socket. ","position":{"start":{"line":231,"column":3,"offset":7725},"end":{"line":231,"column":36,"offset":7758},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/39","children":[{"type":"text","value":"#39","position":{"start":{"line":231,"column":37,"offset":7759},"end":{"line":231,"column":40,"offset":7762},"indent":[]}}],"position":{"start":{"line":231,"column":36,"offset":7758},"end":{"line":231,"column":93,"offset":7815},"indent":[]}}],"position":{"start":{"line":231,"column":3,"offset":7725},"end":{"line":231,"column":93,"offset":7815},"indent":[]}}],"position":{"start":{"line":231,"column":1,"offset":7723},"end":{"line":231,"column":93,"offset":7815},"indent":[]}}],"position":{"start":{"line":226,"column":1,"offset":7244},"end":{"line":231,"column":93,"offset":7815},"indent":[1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":233,"column":6,"offset":7822},"end":{"line":233,"column":15,"offset":7831},"indent":[]}}],"position":{"start":{"line":233,"column":1,"offset":7817},"end":{"line":233,"column":15,"offset":7831},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fix removal images if disk is almost full (wrong path was defined).","position":{"start":{"line":235,"column":3,"offset":7835},"end":{"line":235,"column":70,"offset":7902},"indent":[]}}],"position":{"start":{"line":235,"column":3,"offset":7835},"end":{"line":235,"column":70,"offset":7902},"indent":[]}}],"position":{"start":{"line":235,"column":1,"offset":7833},"end":{"line":235,"column":70,"offset":7902},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi Camera module v2.1. ","position":{"start":{"line":236,"column":3,"offset":7905},"end":{"line":236,"column":52,"offset":7954},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/3","children":[{"type":"text","value":"#3","position":{"start":{"line":236,"column":53,"offset":7955},"end":{"line":236,"column":55,"offset":7957},"indent":[]}}],"position":{"start":{"line":236,"column":52,"offset":7954},"end":{"line":236,"column":102,"offset":8004},"indent":[]}}],"position":{"start":{"line":236,"column":3,"offset":7905},"end":{"line":236,"column":102,"offset":8004},"indent":[]}}],"position":{"start":{"line":236,"column":1,"offset":7903},"end":{"line":236,"column":102,"offset":8004},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi Zero; updated kernel to latest Raspbian. ","position":{"start":{"line":237,"column":3,"offset":8007},"end":{"line":237,"column":73,"offset":8077},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/3","children":[{"type":"text","value":"#3","position":{"start":{"line":237,"column":74,"offset":8078},"end":{"line":237,"column":76,"offset":8080},"indent":[]}}],"position":{"start":{"line":237,"column":73,"offset":8077},"end":{"line":237,"column":123,"offset":8127},"indent":[]}}],"position":{"start":{"line":237,"column":3,"offset":8007},"end":{"line":237,"column":123,"offset":8127},"indent":[]}}],"position":{"start":{"line":237,"column":1,"offset":8005},"end":{"line":237,"column":123,"offset":8127},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"KiOS GUI installer.","position":{"start":{"line":238,"column":3,"offset":8130},"end":{"line":238,"column":22,"offset":8149},"indent":[]}}],"position":{"start":{"line":238,"column":3,"offset":8130},"end":{"line":238,"column":22,"offset":8149},"indent":[]}}],"position":{"start":{"line":238,"column":1,"offset":8128},"end":{"line":238,"column":22,"offset":8149},"indent":[]}}],"position":{"start":{"line":235,"column":1,"offset":7833},"end":{"line":238,"column":22,"offset":8149},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.0.0","position":{"start":{"line":240,"column":5,"offset":8155},"end":{"line":240,"column":10,"offset":8160},"indent":[]}}],"position":{"start":{"line":240,"column":1,"offset":8151},"end":{"line":240,"column":10,"offset":8160},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":242,"column":6,"offset":8167},"end":{"line":242,"column":9,"offset":8170},"indent":[]}}],"position":{"start":{"line":242,"column":1,"offset":8162},"end":{"line":242,"column":9,"offset":8170},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add simple ON/OFF toggle. ","position":{"start":{"line":244,"column":3,"offset":8174},"end":{"line":244,"column":29,"offset":8200},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/24","children":[{"type":"text","value":"#24","position":{"start":{"line":244,"column":30,"offset":8201},"end":{"line":244,"column":33,"offset":8204},"indent":[]}}],"position":{"start":{"line":244,"column":29,"offset":8200},"end":{"line":244,"column":80,"offset":8251},"indent":[]}}],"position":{"start":{"line":244,"column":3,"offset":8174},"end":{"line":244,"column":80,"offset":8251},"indent":[]}}],"position":{"start":{"line":244,"column":1,"offset":8172},"end":{"line":244,"column":80,"offset":8251},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added update strategy when using KiOS. ","position":{"start":{"line":245,"column":3,"offset":8254},"end":{"line":245,"column":42,"offset":8293},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/23","children":[{"type":"text","value":"#23","position":{"start":{"line":245,"column":43,"offset":8294},"end":{"line":245,"column":46,"offset":8297},"indent":[]}}],"position":{"start":{"line":245,"column":42,"offset":8293},"end":{"line":245,"column":93,"offset":8344},"indent":[]}}],"position":{"start":{"line":245,"column":3,"offset":8254},"end":{"line":245,"column":93,"offset":8344},"indent":[]}}],"position":{"start":{"line":245,"column":1,"offset":8252},"end":{"line":245,"column":93,"offset":8344},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"A system page which shows system information. ","position":{"start":{"line":246,"column":3,"offset":8347},"end":{"line":246,"column":49,"offset":8393},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/20","children":[{"type":"text","value":"#20","position":{"start":{"line":246,"column":50,"offset":8394},"end":{"line":246,"column":53,"offset":8397},"indent":[]}}],"position":{"start":{"line":246,"column":49,"offset":8393},"end":{"line":246,"column":100,"offset":8444},"indent":[]}}],"position":{"start":{"line":246,"column":3,"offset":8347},"end":{"line":246,"column":100,"offset":8444},"indent":[]}}],"position":{"start":{"line":246,"column":1,"offset":8345},"end":{"line":246,"column":100,"offset":8444},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Heatmap on dashboard page ","position":{"start":{"line":247,"column":3,"offset":8447},"end":{"line":247,"column":29,"offset":8473},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/19","children":[{"type":"text","value":"#19","position":{"start":{"line":247,"column":30,"offset":8474},"end":{"line":247,"column":33,"offset":8477},"indent":[]}}],"position":{"start":{"line":247,"column":29,"offset":8473},"end":{"line":247,"column":80,"offset":8524},"indent":[]}}],"position":{"start":{"line":247,"column":3,"offset":8447},"end":{"line":247,"column":80,"offset":8524},"indent":[]}}],"position":{"start":{"line":247,"column":1,"offset":8445},"end":{"line":247,"column":80,"offset":8524},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added live stream view on the dashboard page ","position":{"start":{"line":248,"column":3,"offset":8527},"end":{"line":248,"column":48,"offset":8572},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/2","children":[{"type":"text","value":"#2","position":{"start":{"line":248,"column":49,"offset":8573},"end":{"line":248,"column":51,"offset":8575},"indent":[]}}],"position":{"start":{"line":248,"column":48,"offset":8572},"end":{"line":248,"column":97,"offset":8621},"indent":[]}}],"position":{"start":{"line":248,"column":3,"offset":8527},"end":{"line":248,"column":97,"offset":8621},"indent":[]}}],"position":{"start":{"line":248,"column":1,"offset":8525},"end":{"line":248,"column":97,"offset":8621},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed bug cloud syncing ","position":{"start":{"line":249,"column":3,"offset":8624},"end":{"line":249,"column":27,"offset":8648},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/16","children":[{"type":"text","value":"#16","position":{"start":{"line":249,"column":28,"offset":8649},"end":{"line":249,"column":31,"offset":8652},"indent":[]}}],"position":{"start":{"line":249,"column":27,"offset":8648},"end":{"line":249,"column":78,"offset":8699},"indent":[]}}],"position":{"start":{"line":249,"column":3,"offset":8624},"end":{"line":249,"column":78,"offset":8699},"indent":[]}}],"position":{"start":{"line":249,"column":1,"offset":8622},"end":{"line":249,"column":78,"offset":8699},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed broken settings page when space in instane name ","position":{"start":{"line":250,"column":3,"offset":8702},"end":{"line":250,"column":57,"offset":8756},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/16","children":[{"type":"text","value":"#16","position":{"start":{"line":250,"column":58,"offset":8757},"end":{"line":250,"column":61,"offset":8760},"indent":[]}}],"position":{"start":{"line":250,"column":57,"offset":8756},"end":{"line":250,"column":108,"offset":8807},"indent":[]}}],"position":{"start":{"line":250,"column":3,"offset":8702},"end":{"line":250,"column":108,"offset":8807},"indent":[]}}],"position":{"start":{"line":250,"column":1,"offset":8700},"end":{"line":250,"column":108,"offset":8807},"indent":[]}}],"position":{"start":{"line":244,"column":1,"offset":8172},"end":{"line":250,"column":108,"offset":8807},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":252,"column":6,"offset":8814},"end":{"line":252,"column":15,"offset":8823},"indent":[]}}],"position":{"start":{"line":252,"column":1,"offset":8809},"end":{"line":252,"column":15,"offset":8823},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"RTSP support for IP-camera's. ","position":{"start":{"line":254,"column":3,"offset":8827},"end":{"line":254,"column":33,"offset":8857},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/21","children":[{"type":"text","value":"#21","position":{"start":{"line":254,"column":34,"offset":8858},"end":{"line":254,"column":37,"offset":8861},"indent":[]}}],"position":{"start":{"line":254,"column":33,"offset":8857},"end":{"line":254,"column":90,"offset":8914},"indent":[]}}],"position":{"start":{"line":254,"column":3,"offset":8827},"end":{"line":254,"column":90,"offset":8914},"indent":[]}}],"position":{"start":{"line":254,"column":1,"offset":8825},"end":{"line":254,"column":90,"offset":8914},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Verbose logging. ","position":{"start":{"line":255,"column":3,"offset":8917},"end":{"line":255,"column":20,"offset":8934},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/35","children":[{"type":"text","value":"#35","position":{"start":{"line":255,"column":21,"offset":8935},"end":{"line":255,"column":24,"offset":8938},"indent":[]}}],"position":{"start":{"line":255,"column":20,"offset":8934},"end":{"line":255,"column":77,"offset":8991},"indent":[]}}],"position":{"start":{"line":255,"column":3,"offset":8917},"end":{"line":255,"column":77,"offset":8991},"indent":[]}}],"position":{"start":{"line":255,"column":1,"offset":8915},"end":{"line":255,"column":77,"offset":8991},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"IO-devices are executed in a seperate thread. ","position":{"start":{"line":256,"column":3,"offset":8994},"end":{"line":256,"column":49,"offset":9040},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/28","children":[{"type":"text","value":"#28","position":{"start":{"line":256,"column":50,"offset":9041},"end":{"line":256,"column":53,"offset":9044},"indent":[]}}],"position":{"start":{"line":256,"column":49,"offset":9040},"end":{"line":256,"column":106,"offset":9097},"indent":[]}}],"position":{"start":{"line":256,"column":3,"offset":8994},"end":{"line":256,"column":106,"offset":9097},"indent":[]}}],"position":{"start":{"line":256,"column":1,"offset":8992},"end":{"line":256,"column":106,"offset":9097},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Live streaming (MJPEG). ","position":{"start":{"line":257,"column":3,"offset":9100},"end":{"line":257,"column":27,"offset":9124},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/26","children":[{"type":"text","value":"#26","position":{"start":{"line":257,"column":28,"offset":9125},"end":{"line":257,"column":31,"offset":9128},"indent":[]}}],"position":{"start":{"line":257,"column":27,"offset":9124},"end":{"line":257,"column":84,"offset":9181},"indent":[]}}],"position":{"start":{"line":257,"column":3,"offset":9100},"end":{"line":257,"column":84,"offset":9181},"indent":[]}}],"position":{"start":{"line":257,"column":1,"offset":9098},"end":{"line":257,"column":84,"offset":9181},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Execute multiple instances on a machine. ","position":{"start":{"line":258,"column":3,"offset":9184},"end":{"line":258,"column":44,"offset":9225},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/24","children":[{"type":"text","value":"#24","position":{"start":{"line":258,"column":45,"offset":9226},"end":{"line":258,"column":48,"offset":9229},"indent":[]}}],"position":{"start":{"line":258,"column":44,"offset":9225},"end":{"line":258,"column":101,"offset":9282},"indent":[]}}],"position":{"start":{"line":258,"column":3,"offset":9184},"end":{"line":258,"column":101,"offset":9282},"indent":[]}}],"position":{"start":{"line":258,"column":1,"offset":9182},"end":{"line":258,"column":101,"offset":9282},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Override config by arguments. ","position":{"start":{"line":259,"column":3,"offset":9285},"end":{"line":259,"column":33,"offset":9315},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/22","children":[{"type":"text","value":"#22","position":{"start":{"line":259,"column":34,"offset":9316},"end":{"line":259,"column":37,"offset":9319},"indent":[]}}],"position":{"start":{"line":259,"column":33,"offset":9315},"end":{"line":259,"column":90,"offset":9372},"indent":[]}}],"position":{"start":{"line":259,"column":3,"offset":9285},"end":{"line":259,"column":90,"offset":9372},"indent":[]}}],"position":{"start":{"line":259,"column":1,"offset":9283},"end":{"line":259,"column":90,"offset":9372},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Move S3 upload to machinery and remove sync-s3 repository. ","position":{"start":{"line":260,"column":3,"offset":9375},"end":{"line":260,"column":62,"offset":9434},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/16","children":[{"type":"text","value":"#16","position":{"start":{"line":260,"column":63,"offset":9435},"end":{"line":260,"column":66,"offset":9438},"indent":[]}}],"position":{"start":{"line":260,"column":62,"offset":9434},"end":{"line":260,"column":119,"offset":9491},"indent":[]}}],"position":{"start":{"line":260,"column":3,"offset":9375},"end":{"line":260,"column":119,"offset":9491},"indent":[]}}],"position":{"start":{"line":260,"column":1,"offset":9373},"end":{"line":260,"column":119,"offset":9491},"indent":[]}}],"position":{"start":{"line":254,"column":1,"offset":8825},"end":{"line":260,"column":119,"offset":9491},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":262,"column":6,"offset":9498},"end":{"line":262,"column":12,"offset":9504},"indent":[]}}],"position":{"start":{"line":262,"column":1,"offset":9493},"end":{"line":262,"column":12,"offset":9504},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added Docker image (x86_x64) to Docker Hub.","position":{"start":{"line":264,"column":3,"offset":9508},"end":{"line":264,"column":46,"offset":9551},"indent":[]}}],"position":{"start":{"line":264,"column":3,"offset":9508},"end":{"line":264,"column":46,"offset":9551},"indent":[]}}],"position":{"start":{"line":264,"column":1,"offset":9506},"end":{"line":264,"column":46,"offset":9551},"indent":[]}}],"position":{"start":{"line":264,"column":1,"offset":9506},"end":{"line":264,"column":46,"offset":9551},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":266,"column":6,"offset":9558},"end":{"line":266,"column":15,"offset":9567},"indent":[]}}],"position":{"start":{"line":266,"column":1,"offset":9553},"end":{"line":266,"column":15,"offset":9567},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add support for Raspberry Pi 1, 2 and 3. ","position":{"start":{"line":268,"column":3,"offset":9571},"end":{"line":268,"column":44,"offset":9612},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/1","children":[{"type":"text","value":"#1","position":{"start":{"line":268,"column":45,"offset":9613},"end":{"line":268,"column":47,"offset":9615},"indent":[]}}],"position":{"start":{"line":268,"column":44,"offset":9612},"end":{"line":268,"column":94,"offset":9662},"indent":[]}}],"position":{"start":{"line":268,"column":3,"offset":9571},"end":{"line":268,"column":94,"offset":9662},"indent":[]}}],"position":{"start":{"line":268,"column":1,"offset":9569},"end":{"line":268,"column":94,"offset":9662},"indent":[]}}],"position":{"start":{"line":268,"column":1,"offset":9569},"end":{"line":268,"column":94,"offset":9662},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.1.0","position":{"start":{"line":270,"column":5,"offset":9668},"end":{"line":270,"column":10,"offset":9673},"indent":[]}}],"position":{"start":{"line":270,"column":1,"offset":9664},"end":{"line":270,"column":10,"offset":9673},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":272,"column":6,"offset":9680},"end":{"line":272,"column":9,"offset":9683},"indent":[]}}],"position":{"start":{"line":272,"column":1,"offset":9675},"end":{"line":272,"column":9,"offset":9683},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support IP camera's with MJPEG stream. ","position":{"start":{"line":274,"column":3,"offset":9687},"end":{"line":274,"column":42,"offset":9726},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/3","children":[{"type":"text","value":"#3","position":{"start":{"line":274,"column":43,"offset":9727},"end":{"line":274,"column":45,"offset":9729},"indent":[]}}],"position":{"start":{"line":274,"column":42,"offset":9726},"end":{"line":274,"column":91,"offset":9775},"indent":[]}}],"position":{"start":{"line":274,"column":3,"offset":9687},"end":{"line":274,"column":91,"offset":9775},"indent":[]}}],"position":{"start":{"line":274,"column":1,"offset":9685},"end":{"line":274,"column":91,"offset":9775},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Introduce new API methods to configure the machinery, using basic auth. ","position":{"start":{"line":275,"column":3,"offset":9778},"end":{"line":275,"column":75,"offset":9850},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/4","children":[{"type":"text","value":"#4","position":{"start":{"line":275,"column":76,"offset":9851},"end":{"line":275,"column":78,"offset":9853},"indent":[]}}],"position":{"start":{"line":275,"column":75,"offset":9850},"end":{"line":275,"column":124,"offset":9899},"indent":[]}}],"position":{"start":{"line":275,"column":3,"offset":9778},"end":{"line":275,"column":124,"offset":9899},"indent":[]}}],"position":{"start":{"line":275,"column":1,"offset":9776},"end":{"line":275,"column":124,"offset":9899},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimization of loading image and dashboard page, completely redesigned the retrieval of images. ","position":{"start":{"line":276,"column":3,"offset":9902},"end":{"line":276,"column":100,"offset":9999},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/5","children":[{"type":"text","value":"#5","position":{"start":{"line":276,"column":101,"offset":10000},"end":{"line":276,"column":103,"offset":10002},"indent":[]}}],"position":{"start":{"line":276,"column":100,"offset":9999},"end":{"line":276,"column":149,"offset":10048},"indent":[]}}],"position":{"start":{"line":276,"column":3,"offset":9902},"end":{"line":276,"column":149,"offset":10048},"indent":[]}}],"position":{"start":{"line":276,"column":1,"offset":9900},"end":{"line":276,"column":149,"offset":10048},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimization of settings page. ","position":{"start":{"line":277,"column":3,"offset":10051},"end":{"line":277,"column":34,"offset":10082},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/5","children":[{"type":"text","value":"#5","position":{"start":{"line":277,"column":35,"offset":10083},"end":{"line":277,"column":37,"offset":10085},"indent":[]}}],"position":{"start":{"line":277,"column":34,"offset":10082},"end":{"line":277,"column":83,"offset":10131},"indent":[]}}],"position":{"start":{"line":277,"column":3,"offset":10051},"end":{"line":277,"column":83,"offset":10131},"indent":[]}}],"position":{"start":{"line":277,"column":1,"offset":10049},"end":{"line":277,"column":83,"offset":10131},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Timebar gradient only works in Chrome. ","position":{"start":{"line":278,"column":3,"offset":10134},"end":{"line":278,"column":42,"offset":10173},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/6","children":[{"type":"text","value":"#6","position":{"start":{"line":278,"column":43,"offset":10174},"end":{"line":278,"column":45,"offset":10176},"indent":[]}}],"position":{"start":{"line":278,"column":42,"offset":10173},"end":{"line":278,"column":91,"offset":10222},"indent":[]}}],"position":{"start":{"line":278,"column":3,"offset":10134},"end":{"line":278,"column":91,"offset":10222},"indent":[]}}],"position":{"start":{"line":278,"column":1,"offset":10132},"end":{"line":278,"column":91,"offset":10222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Minor CSS fixes for responsive layout.","position":{"start":{"line":279,"column":3,"offset":10225},"end":{"line":279,"column":41,"offset":10263},"indent":[]}}],"position":{"start":{"line":279,"column":3,"offset":10225},"end":{"line":279,"column":41,"offset":10263},"indent":[]}}],"position":{"start":{"line":279,"column":1,"offset":10223},"end":{"line":279,"column":41,"offset":10263},"indent":[]}}],"position":{"start":{"line":274,"column":1,"offset":9685},"end":{"line":279,"column":41,"offset":10263},"indent":[1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":281,"column":6,"offset":10270},"end":{"line":281,"column":15,"offset":10279},"indent":[]}}],"position":{"start":{"line":281,"column":1,"offset":10265},"end":{"line":281,"column":15,"offset":10279},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Flip/rotate option for capture devices. ","position":{"start":{"line":283,"column":3,"offset":10283},"end":{"line":283,"column":43,"offset":10323},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/1","children":[{"type":"text","value":"#5","position":{"start":{"line":283,"column":44,"offset":10324},"end":{"line":283,"column":46,"offset":10326},"indent":[]}}],"position":{"start":{"line":283,"column":43,"offset":10323},"end":{"line":283,"column":98,"offset":10378},"indent":[]}}],"position":{"start":{"line":283,"column":3,"offset":10283},"end":{"line":283,"column":98,"offset":10378},"indent":[]}}],"position":{"start":{"line":283,"column":1,"offset":10281},"end":{"line":283,"column":98,"offset":10378},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support IP camera's with MJPEG stream. ","position":{"start":{"line":284,"column":3,"offset":10381},"end":{"line":284,"column":42,"offset":10420},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/4","children":[{"type":"text","value":"#4","position":{"start":{"line":284,"column":43,"offset":10421},"end":{"line":284,"column":45,"offset":10423},"indent":[]}}],"position":{"start":{"line":284,"column":42,"offset":10420},"end":{"line":284,"column":97,"offset":10475},"indent":[]}}],"position":{"start":{"line":284,"column":3,"offset":10381},"end":{"line":284,"column":97,"offset":10475},"indent":[]}}],"position":{"start":{"line":284,"column":1,"offset":10379},"end":{"line":284,"column":97,"offset":10475},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Introduced webhook io device. ","position":{"start":{"line":285,"column":3,"offset":10478},"end":{"line":285,"column":33,"offset":10508},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/5","children":[{"type":"text","value":"#5","position":{"start":{"line":285,"column":34,"offset":10509},"end":{"line":285,"column":36,"offset":10511},"indent":[]}}],"position":{"start":{"line":285,"column":33,"offset":10508},"end":{"line":285,"column":88,"offset":10563},"indent":[]}}],"position":{"start":{"line":285,"column":3,"offset":10478},"end":{"line":285,"column":88,"offset":10563},"indent":[]}}],"position":{"start":{"line":285,"column":1,"offset":10476},"end":{"line":285,"column":88,"offset":10563},"indent":[]}}],"position":{"start":{"line":283,"column":1,"offset":10281},"end":{"line":285,"column":88,"offset":10563},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Cloud","position":{"start":{"line":287,"column":6,"offset":10570},"end":{"line":287,"column":11,"offset":10575},"indent":[]}}],"position":{"start":{"line":287,"column":1,"offset":10565},"end":{"line":287,"column":11,"offset":10575},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed problem when syncing a huge amount of images. ","position":{"start":{"line":289,"column":3,"offset":10579},"end":{"line":289,"column":55,"offset":10631},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/sync-s3/issues/1","children":[{"type":"text","value":"#1","position":{"start":{"line":289,"column":56,"offset":10632},"end":{"line":289,"column":58,"offset":10634},"indent":[]}}],"position":{"start":{"line":289,"column":55,"offset":10631},"end":{"line":289,"column":108,"offset":10684},"indent":[]}}],"position":{"start":{"line":289,"column":3,"offset":10579},"end":{"line":289,"column":108,"offset":10684},"indent":[]}}],"position":{"start":{"line":289,"column":1,"offset":10577},"end":{"line":289,"column":108,"offset":10684},"indent":[]}}],"position":{"start":{"line":289,"column":1,"offset":10577},"end":{"line":289,"column":108,"offset":10684},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.3","position":{"start":{"line":291,"column":5,"offset":10690},"end":{"line":291,"column":10,"offset":10695},"indent":[]}}],"position":{"start":{"line":291,"column":1,"offset":10686},"end":{"line":291,"column":10,"offset":10695},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":293,"column":6,"offset":10702},"end":{"line":293,"column":9,"offset":10705},"indent":[]}}],"position":{"start":{"line":293,"column":1,"offset":10697},"end":{"line":293,"column":9,"offset":10705},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimize performance, new datastructure has been implemented.","position":{"start":{"line":295,"column":3,"offset":10709},"end":{"line":295,"column":64,"offset":10770},"indent":[]}}],"position":{"start":{"line":295,"column":3,"offset":10709},"end":{"line":295,"column":64,"offset":10770},"indent":[]}}],"position":{"start":{"line":295,"column":1,"offset":10707},"end":{"line":295,"column":64,"offset":10770},"indent":[]}}],"position":{"start":{"line":295,"column":1,"offset":10707},"end":{"line":295,"column":64,"offset":10770},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":297,"column":6,"offset":10777},"end":{"line":297,"column":15,"offset":10786},"indent":[]}}],"position":{"start":{"line":297,"column":1,"offset":10772},"end":{"line":297,"column":15,"offset":10786},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Memory optimization.","position":{"start":{"line":299,"column":3,"offset":10790},"end":{"line":299,"column":23,"offset":10810},"indent":[]}}],"position":{"start":{"line":299,"column":3,"offset":10790},"end":{"line":299,"column":23,"offset":10810},"indent":[]}}],"position":{"start":{"line":299,"column":1,"offset":10788},"end":{"line":299,"column":23,"offset":10810},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Removal of images older than 3 days have been removed.","position":{"start":{"line":300,"column":3,"offset":10813},"end":{"line":300,"column":57,"offset":10867},"indent":[]}}],"position":{"start":{"line":300,"column":3,"offset":10813},"end":{"line":300,"column":57,"offset":10867},"indent":[]}}],"position":{"start":{"line":300,"column":1,"offset":10811},"end":{"line":300,"column":57,"offset":10867},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Start machinery automatically (delay has been removed).","position":{"start":{"line":301,"column":3,"offset":10870},"end":{"line":301,"column":58,"offset":10925},"indent":[]}}],"position":{"start":{"line":301,"column":3,"offset":10870},"end":{"line":301,"column":58,"offset":10925},"indent":[]}}],"position":{"start":{"line":301,"column":1,"offset":10868},"end":{"line":301,"column":58,"offset":10925},"indent":[]}}],"position":{"start":{"line":299,"column":1,"offset":10788},"end":{"line":301,"column":58,"offset":10925},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Cloud","position":{"start":{"line":303,"column":6,"offset":10932},"end":{"line":303,"column":11,"offset":10937},"indent":[]}}],"position":{"start":{"line":303,"column":1,"offset":10927},"end":{"line":303,"column":11,"offset":10937},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved file exist problem.","position":{"start":{"line":305,"column":3,"offset":10941},"end":{"line":305,"column":31,"offset":10969},"indent":[]}}],"position":{"start":{"line":305,"column":3,"offset":10941},"end":{"line":305,"column":31,"offset":10969},"indent":[]}}],"position":{"start":{"line":305,"column":1,"offset":10939},"end":{"line":305,"column":31,"offset":10969},"indent":[]}}],"position":{"start":{"line":305,"column":1,"offset":10939},"end":{"line":305,"column":31,"offset":10969},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.2","position":{"start":{"line":307,"column":5,"offset":10975},"end":{"line":307,"column":10,"offset":10980},"indent":[]}}],"position":{"start":{"line":307,"column":1,"offset":10971},"end":{"line":307,"column":10,"offset":10980},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":309,"column":6,"offset":10987},"end":{"line":309,"column":9,"offset":10990},"indent":[]}}],"position":{"start":{"line":309,"column":1,"offset":10982},"end":{"line":309,"column":9,"offset":10990},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Timezone on settings page is also used for the webinterface.","position":{"start":{"line":311,"column":3,"offset":10994},"end":{"line":311,"column":63,"offset":11054},"indent":[]}}],"position":{"start":{"line":311,"column":3,"offset":10994},"end":{"line":311,"column":63,"offset":11054},"indent":[]}}],"position":{"start":{"line":311,"column":1,"offset":10992},"end":{"line":311,"column":63,"offset":11054},"indent":[]}}],"position":{"start":{"line":311,"column":1,"offset":10992},"end":{"line":311,"column":63,"offset":11054},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":313,"column":6,"offset":11061},"end":{"line":313,"column":15,"offset":11070},"indent":[]}}],"position":{"start":{"line":313,"column":1,"offset":11056},"end":{"line":313,"column":15,"offset":11070},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added extra timezones to timezone.xml.","position":{"start":{"line":315,"column":3,"offset":11074},"end":{"line":315,"column":41,"offset":11112},"indent":[]}}],"position":{"start":{"line":315,"column":3,"offset":11074},"end":{"line":315,"column":41,"offset":11112},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":11072},"end":{"line":315,"column":41,"offset":11112},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":11072},"end":{"line":315,"column":41,"offset":11112},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.1","position":{"start":{"line":317,"column":5,"offset":11118},"end":{"line":317,"column":10,"offset":11123},"indent":[]}}],"position":{"start":{"line":317,"column":1,"offset":11114},"end":{"line":317,"column":10,"offset":11123},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":319,"column":6,"offset":11130},"end":{"line":319,"column":9,"offset":11133},"indent":[]}}],"position":{"start":{"line":319,"column":1,"offset":11125},"end":{"line":319,"column":9,"offset":11133},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Improved error handling (date search).","position":{"start":{"line":321,"column":3,"offset":11137},"end":{"line":321,"column":41,"offset":11175},"indent":[]}}],"position":{"start":{"line":321,"column":3,"offset":11137},"end":{"line":321,"column":41,"offset":11175},"indent":[]}}],"position":{"start":{"line":321,"column":1,"offset":11135},"end":{"line":321,"column":41,"offset":11175},"indent":[]}}],"position":{"start":{"line":321,"column":1,"offset":11135},"end":{"line":321,"column":41,"offset":11175},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":323,"column":6,"offset":11182},"end":{"line":323,"column":15,"offset":11191},"indent":[]}}],"position":{"start":{"line":323,"column":1,"offset":11177},"end":{"line":323,"column":15,"offset":11191},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Improved memory cleanup.","position":{"start":{"line":325,"column":3,"offset":11195},"end":{"line":325,"column":27,"offset":11219},"indent":[]}}],"position":{"start":{"line":325,"column":3,"offset":11195},"end":{"line":325,"column":27,"offset":11219},"indent":[]}}],"position":{"start":{"line":325,"column":1,"offset":11193},"end":{"line":325,"column":27,"offset":11219},"indent":[]}}],"position":{"start":{"line":325,"column":1,"offset":11193},"end":{"line":325,"column":27,"offset":11219},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.0","position":{"start":{"line":327,"column":5,"offset":11225},"end":{"line":327,"column":10,"offset":11230},"indent":[]}}],"position":{"start":{"line":327,"column":1,"offset":11221},"end":{"line":327,"column":10,"offset":11230},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"First commit of Kerberos.io","position":{"start":{"line":329,"column":6,"offset":11237},"end":{"line":329,"column":33,"offset":11264},"indent":[]}}],"position":{"start":{"line":329,"column":1,"offset":11232},"end":{"line":329,"column":33,"offset":11264},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Camera support: ","position":{"start":{"line":331,"column":3,"offset":11268},"end":{"line":331,"column":19,"offset":11284},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"USBCamera","position":{"start":{"line":331,"column":21,"offset":11286},"end":{"line":331,"column":30,"offset":11295},"indent":[]}}],"position":{"start":{"line":331,"column":19,"offset":11284},"end":{"line":331,"column":32,"offset":11297},"indent":[]}},{"type":"text","value":" (V4L), ","position":{"start":{"line":331,"column":32,"offset":11297},"end":{"line":331,"column":40,"offset":11305},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Raspberry Pi camera module","position":{"start":{"line":331,"column":42,"offset":11307},"end":{"line":331,"column":68,"offset":11333},"indent":[]}}],"position":{"start":{"line":331,"column":40,"offset":11305},"end":{"line":331,"column":70,"offset":11335},"indent":[]}},{"type":"text","value":" (MMAL).","position":{"start":{"line":331,"column":70,"offset":11335},"end":{"line":331,"column":78,"offset":11343},"indent":[]}}],"position":{"start":{"line":331,"column":3,"offset":11268},"end":{"line":331,"column":78,"offset":11343},"indent":[]}}],"position":{"start":{"line":331,"column":1,"offset":11266},"end":{"line":331,"column":78,"offset":11343},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Conditions: ","position":{"start":{"line":332,"column":3,"offset":11346},"end":{"line":332,"column":15,"offset":11358},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Enabled","position":{"start":{"line":332,"column":17,"offset":11360},"end":{"line":332,"column":24,"offset":11367},"indent":[]}}],"position":{"start":{"line":332,"column":15,"offset":11358},"end":{"line":332,"column":26,"offset":11369},"indent":[]}},{"type":"text","value":" (turn on/off Kerberos) and active ","position":{"start":{"line":332,"column":26,"offset":11369},"end":{"line":332,"column":61,"offset":11404},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Time","position":{"start":{"line":332,"column":63,"offset":11406},"end":{"line":332,"column":67,"offset":11410},"indent":[]}}],"position":{"start":{"line":332,"column":61,"offset":11404},"end":{"line":332,"column":69,"offset":11412},"indent":[]}},{"type":"text","value":" per day.","position":{"start":{"line":332,"column":69,"offset":11412},"end":{"line":332,"column":78,"offset":11421},"indent":[]}}],"position":{"start":{"line":332,"column":3,"offset":11346},"end":{"line":332,"column":78,"offset":11421},"indent":[]}}],"position":{"start":{"line":332,"column":1,"offset":11344},"end":{"line":332,"column":78,"offset":11421},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Algorithms: ","position":{"start":{"line":333,"column":3,"offset":11424},"end":{"line":333,"column":15,"offset":11436},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Differential Images","position":{"start":{"line":333,"column":17,"offset":11438},"end":{"line":333,"column":36,"offset":11457},"indent":[]}}],"position":{"start":{"line":333,"column":15,"offset":11436},"end":{"line":333,"column":38,"offset":11459},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":333,"column":38,"offset":11459},"end":{"line":333,"column":39,"offset":11460},"indent":[]}}],"position":{"start":{"line":333,"column":3,"offset":11424},"end":{"line":333,"column":39,"offset":11460},"indent":[]}}],"position":{"start":{"line":333,"column":1,"offset":11422},"end":{"line":333,"column":39,"offset":11460},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Heuristics: ","position":{"start":{"line":334,"column":3,"offset":11463},"end":{"line":334,"column":15,"offset":11475},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Sequence","position":{"start":{"line":334,"column":17,"offset":11477},"end":{"line":334,"column":25,"offset":11485},"indent":[]}}],"position":{"start":{"line":334,"column":15,"offset":11475},"end":{"line":334,"column":27,"offset":11487},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":334,"column":27,"offset":11487},"end":{"line":334,"column":28,"offset":11488},"indent":[]}}],"position":{"start":{"line":334,"column":3,"offset":11463},"end":{"line":334,"column":28,"offset":11488},"indent":[]}}],"position":{"start":{"line":334,"column":1,"offset":11461},"end":{"line":334,"column":28,"offset":11488},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Expositors: Select a ","position":{"start":{"line":335,"column":3,"offset":11491},"end":{"line":335,"column":24,"offset":11512},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Hull","position":{"start":{"line":335,"column":26,"offset":11514},"end":{"line":335,"column":30,"offset":11518},"indent":[]}}],"position":{"start":{"line":335,"column":24,"offset":11512},"end":{"line":335,"column":32,"offset":11520},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":335,"column":32,"offset":11520},"end":{"line":335,"column":36,"offset":11524},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Rectangle","position":{"start":{"line":335,"column":38,"offset":11526},"end":{"line":335,"column":47,"offset":11535},"indent":[]}}],"position":{"start":{"line":335,"column":36,"offset":11524},"end":{"line":335,"column":49,"offset":11537},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":335,"column":49,"offset":11537},"end":{"line":335,"column":50,"offset":11538},"indent":[]}}],"position":{"start":{"line":335,"column":3,"offset":11491},"end":{"line":335,"column":50,"offset":11538},"indent":[]}}],"position":{"start":{"line":335,"column":1,"offset":11489},"end":{"line":335,"column":50,"offset":11538},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Outputs: Write image to ","position":{"start":{"line":336,"column":3,"offset":11541},"end":{"line":336,"column":27,"offset":11565},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Disk","position":{"start":{"line":336,"column":29,"offset":11567},"end":{"line":336,"column":33,"offset":11571},"indent":[]}}],"position":{"start":{"line":336,"column":27,"offset":11565},"end":{"line":336,"column":35,"offset":11573},"indent":[]}},{"type":"text","value":", trigger an ","position":{"start":{"line":336,"column":35,"offset":11573},"end":{"line":336,"column":48,"offset":11586},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GPIO","position":{"start":{"line":336,"column":50,"offset":11588},"end":{"line":336,"column":54,"offset":11592},"indent":[]}}],"position":{"start":{"line":336,"column":48,"offset":11586},"end":{"line":336,"column":56,"offset":11594},"indent":[]}},{"type":"text","value":" output pin and send a ","position":{"start":{"line":336,"column":56,"offset":11594},"end":{"line":336,"column":79,"offset":11617},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"TCP/IP packet","position":{"start":{"line":336,"column":81,"offset":11619},"end":{"line":336,"column":94,"offset":11632},"indent":[]}}],"position":{"start":{"line":336,"column":79,"offset":11617},"end":{"line":336,"column":96,"offset":11634},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":336,"column":96,"offset":11634},"end":{"line":336,"column":97,"offset":11635},"indent":[]}}],"position":{"start":{"line":336,"column":3,"offset":11541},"end":{"line":336,"column":97,"offset":11635},"indent":[]}}],"position":{"start":{"line":336,"column":1,"offset":11539},"end":{"line":336,"column":97,"offset":11635},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Cloud: send your images to the ","position":{"start":{"line":337,"column":3,"offset":11638},"end":{"line":337,"column":34,"offset":11669},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Kerberos.io cloud aplication","position":{"start":{"line":337,"column":36,"offset":11671},"end":{"line":337,"column":64,"offset":11699},"indent":[]}}],"position":{"start":{"line":337,"column":34,"offset":11669},"end":{"line":337,"column":66,"offset":11701},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":337,"column":66,"offset":11701},"end":{"line":337,"column":67,"offset":11702},"indent":[]}}],"position":{"start":{"line":337,"column":3,"offset":11638},"end":{"line":337,"column":67,"offset":11702},"indent":[]}}],"position":{"start":{"line":337,"column":1,"offset":11636},"end":{"line":337,"column":67,"offset":11702},"indent":[]}}],"position":{"start":{"line":331,"column":1,"offset":11266},"end":{"line":337,"column":67,"offset":11702},"indent":[1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":340,"column":1,"offset":11705},"end":{"line":340,"column":31,"offset":11735},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":340,"column":31,"offset":11735}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Release notes`}

\n

{`2.8.0`}

\n

{`Aligned machinery, web and KiOS versions. Too many people were confused by the versioning.`}

\n

{`Web`}

\n
    \n
  • {`Videos displayed on canvas were blocked in latest browsers.`}
  • \n
  • {`Disabled reboot and shutdown.`}
  • \n
  • {`Disabled upgrade process, use fwupdate shell command instead.`}
  • \n
\n

{`KiOS`}

\n
    \n
  • {`Major upgrade, solved many different problems (list to long); not possible to upgrade from 2.7.0 to 2.8.0.`}
  • \n
  • {`Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).`}
  • \n
  • {`Support for the Raspberry Pi 4.`}
  • \n
\n

{`2.7.2`}

\n

{`Machinery`}

\n
    \n
  • {`To optimise the cloud experience we've added a proxy.kerberos.io machine in between.`}
  • \n
  • {`We've changed the S3 storage scheme (class:ONEZONE_IA).`}
  • \n
\n

{`2.7.1`}

\n

{`Machinery`}

\n
    \n
  • {`Resolved deadlock with livestreaming while restarting machinery.`}
  • \n
  • {`Revert logging library; enabled log rotating.`}
  • \n
\n

{`KiOS`}

\n
    \n
  • {`Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).`}
  • \n
  • {`Resolved issue with WIFI on Raspberry Pi 3B+`}
  • \n
\n

{`2.7.0`}

\n

{`Web`}

\n
    \n
  • {`Unique session cookie, which allows to open multiple web interfaces (e.g. when using docker).`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added live streaming feature for app.kerberos.io`}
  • \n
  • {`Upgraded logging library: log file can be max 5MB, and will rotate.`}
  • \n
  • {`Better logging for cloud uploads (failed information).`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`No longer need docker-compose, we merged the web and machinery containers to `}{`a single container`}{`.`}
  • \n
\n

{`KiOS`}

\n
    \n
  • {`Updated firmware to latest Raspbian.`}
  • \n
  • {`Support for the Raspberry Pi 3B+.`}
  • \n
\n

{`2.6.1`}

\n

{`Web`}

\n
    \n
  • {`Solved issue with persisting login configuration. `}{`#111`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added Pushbullet. `}{`#139`}
  • \n
  • {`Cloud upload was not longer working (hotfix also in 2.6.0).`}
  • \n
\n

{`2.6.0`}

\n

{`Web`}

\n
    \n
  • {`Add a cloud connection verification method. `}{`#112`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Add background color timestamp. `}{`#128`}
  • \n
  • {`Send instanceId in AWS header when uploading to cloud (necessary for new cloud app).`}
  • \n
  • {`Better support for Chinese IP cameras.`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`Bug: Autoremove old images/video within Docker Containers. `}{`#104`}
  • \n
\n

{`2.5.0`}

\n

{`Web`}

\n
    \n
  • {`Added Chinese and Italian language.`}
  • \n
  • {`Resolved issue with INSTALLED=true.`}
  • \n
  • {`Make latest_sequence available with basic auth. `}{`#99`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Provide an IO service for publishing events to MQTT. `}{`#89`}
  • \n
  • {`Optimize recording with H264_OMX. `}{`#83`}
  • \n
  • {`Implement throttler for Io detections. `}{`#96`}
  • \n
  • {`SSL version 1.0.0 is no longer accessible in Raspbian. `}{`#109`}
  • \n
\n

{`2.4.2`}

\n

{`Web`}

\n
    \n
  • {`Typo in french translation, causes the web interface crash.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Resolved major bug in livestream: memory leak in stream class. `}{`#94`}
  • \n
  • {`Capture health verification: check if the chosen capture device is still grabbing (and didn't stalled).`}
  • \n
  • {`Extra logging when recording with raspberry pi camera.`}
  • \n
  • {`Make sure the cloud upload is functioning properly, after an upload it's verified if the files really exist in the cloud.`}
  • \n
\n

{`2.4.1`}

\n

{`Web`}

\n
    \n
  • {`Show warning when system is disabled. `}{`#88`}{`.`}
  • \n
  • {`Hull selector in basic view not always working.`}
  • \n
\n

{`2.4.0`}

\n

{`Ecosystem`}

\n
    \n
  • {`Enable/Disable force network mode.`}
  • \n
  • {`Enable/Disable auto removal media.`}
  • \n
\n

{`Web`}

\n
    \n
  • {`Upgrade from Laravel 4.2 to Laravel 5.4 `}{`#70`}{`.`}
  • \n
  • {`Fix bug with heatmap radius slider `}{`#84`}{`.`}
  • \n
  • {`Design tweaks toggle button (remove outline).`}
  • \n
  • {`Disabled possibility to timestamp video when using hardware acceleration.`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`Fix SSL support `}{`#4`}{`.`}
  • \n
  • {`Auto removal if disk is full.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`OpenMAX IL hardware encoding for Raspberry Pi camera. `}{`#83`}
      \n
    • {`Optimized live streaming.`}
    • \n
    • {`Optimized h264 recording.`}
    • \n
  • \n
  • {`Basic authentication for live streaming (username and password). `}{`#80`}
  • \n
\n

{`2.3.1`}

\n

{`Machinery`}

\n
    \n
  • {`Update for kerberos.cloud: pushing content-type.`}
  • \n
  • {`Change default configurations.`}
  • \n
\n

{`2.3.0`}

\n

{`Ecosystem`}

\n
    \n
  • {`Support for Raspberry Pi Zero W. `}{`#8`}
  • \n
\n

{`2.2.1`}

\n

{`Ecosystem`}

\n
    \n
  • {`Upgraded FFmpeg and libx264 on KiOS.`}
  • \n
\n

{`Web`}

\n
    \n
  • {`Add Bulgarian translation. `}{`#81`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Bug: IoVideo crashes due to a memory leak. `}{`#70`}
  • \n
\n

{`2.2.0`}

\n

{`Ecosystem`}

\n
    \n
  • {`Added support for Armbian.`}
  • \n
  • {`Raspbian: Async requests causes session corruption. `}{`#78`}
  • \n
\n

{`Web`}

\n
    \n
  • {`Bug: Issue format instance name. `}{`#57`}
  • \n
  • {`Redesign settings page (better UX). `}{`#39`}
  • \n
  • {`Possibility to edit password through web interface. `}{`#63`}
  • \n
  • {`Support for viewing videos.`}
  • \n
  • {`Update radius of heatmap.`}
  • \n
  • {`PHP7 support. `}{`#60`}
  • \n
  • {`Welcome/installation page. `}{`#60`}
  • \n
  • {`Translation updated. `}{`#74`}
  • \n
  • {`Privacy mode. `}{`#54`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Output as video file. `}{`#60`}
  • \n
  • {`Bug: System hangs when a wrong IP camera url was defined. `}{`#48`}
  • \n
  • {`Run arbitrary script/program. `}{`#31`}
  • \n
  • {`Bug: Weird colors from RPi Camera. `}{`#64`}
  • \n
  • {`Upgrade to OpenCV 3.2.0.`}
  • \n
\n

{`2.1.0`}

\n

{`Web`}

\n
    \n
  • {`Added PhotoSwipe for image overview (easier to browse through images). `}{`#45`}
  • \n
  • {`Added reboot and shutdown commands. `}{`#46`}
  • \n
  • {`Added logging view to system page. `}{`#33`}
  • \n
  • {`Added labels to check if machinery is running.`}
  • \n
  • {`Added error handling if web interface isn’t working properly.`}
  • \n
  • {`Fixed Heatmap.js fail to load by ad-blocker. `}{`#42`}
  • \n
  • {`Show additional information on the dashboard (streaming is opening or not) there is no data available.`}
  • \n
  • {`Settings page is now visible on mobile (+ changed icon).`}
  • \n
  • {`Fixed sorting of news articles.`}
  • \n
  • {`Removed links to assets in the cloud (.css files).`}
  • \n
  • {`Design: improved layout of login page, async loading of image view.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added configurable streaming port and quality. `}{`#41`}
  • \n
  • {`Added new algorithm: Background subtraction.`}
  • \n
  • {`Added new heuristic: Counter (for object/people counting). `}{`#42`}
  • \n
  • {`Added video capture, which can be used for debugging purposes (replay a video fragment).`}
  • \n
  • {`It’s now possible to mark the images with a timestamp. `}{`#36`}
  • \n
  • {`Fixed blocking streaming socket. `}{`#39`}
  • \n
\n

{`Ecosystem`}

\n
    \n
  • {`Fix removal images if disk is almost full (wrong path was defined).`}
  • \n
  • {`Support for the Raspberry Pi Camera module v2.1. `}{`#3`}
  • \n
  • {`Support for the Raspberry Pi Zero; updated kernel to latest Raspbian. `}{`#3`}
  • \n
  • {`KiOS GUI installer.`}
  • \n
\n

{`2.0.0`}

\n

{`Web`}

\n
    \n
  • {`Add simple ON/OFF toggle. `}{`#24`}
  • \n
  • {`Added update strategy when using KiOS. `}{`#23`}
  • \n
  • {`A system page which shows system information. `}{`#20`}
  • \n
  • {`Heatmap on dashboard page `}{`#19`}
  • \n
  • {`Added live stream view on the dashboard page `}{`#2`}
  • \n
  • {`Fixed bug cloud syncing `}{`#16`}
  • \n
  • {`Fixed broken settings page when space in instane name `}{`#16`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`RTSP support for IP-camera's. `}{`#21`}
  • \n
  • {`Verbose logging. `}{`#35`}
  • \n
  • {`IO-devices are executed in a seperate thread. `}{`#28`}
  • \n
  • {`Live streaming (MJPEG). `}{`#26`}
  • \n
  • {`Execute multiple instances on a machine. `}{`#24`}
  • \n
  • {`Override config by arguments. `}{`#22`}
  • \n
  • {`Move S3 upload to machinery and remove sync-s3 repository. `}{`#16`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`Added Docker image (x86_x64) to Docker Hub.`}
  • \n
\n

{`Ecosystem`}

\n
    \n
  • {`Add support for Raspberry Pi 1, 2 and 3. `}{`#1`}
  • \n
\n

{`1.1.0`}

\n

{`Web`}

\n
    \n
  • {`Support IP camera's with MJPEG stream. `}{`#3`}
  • \n
  • {`Introduce new API methods to configure the machinery, using basic auth. `}{`#4`}
  • \n
  • {`Optimization of loading image and dashboard page, completely redesigned the retrieval of images. `}{`#5`}
  • \n
  • {`Optimization of settings page. `}{`#5`}
  • \n
  • {`Timebar gradient only works in Chrome. `}{`#6`}
  • \n
  • {`Minor CSS fixes for responsive layout.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Flip/rotate option for capture devices. `}{`#5`}
  • \n
  • {`Support IP camera's with MJPEG stream. `}{`#4`}
  • \n
  • {`Introduced webhook io device. `}{`#5`}
  • \n
\n

{`Cloud`}

\n
    \n
  • {`Fixed problem when syncing a huge amount of images. `}{`#1`}
  • \n
\n

{`1.0.3`}

\n

{`Web`}

\n
    \n
  • {`Optimize performance, new datastructure has been implemented.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Memory optimization.`}
  • \n
  • {`Removal of images older than 3 days have been removed.`}
  • \n
  • {`Start machinery automatically (delay has been removed).`}
  • \n
\n

{`Cloud`}

\n
    \n
  • {`Resolved file exist problem.`}
  • \n
\n

{`1.0.2`}

\n

{`Web`}

\n
    \n
  • {`Timezone on settings page is also used for the webinterface.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added extra timezones to timezone.xml.`}
  • \n
\n

{`1.0.1`}

\n

{`Web`}

\n
    \n
  • {`Improved error handling (date search).`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Improved memory cleanup.`}
  • \n
\n

{`1.0.0`}

\n

{`First commit of Kerberos.io`}

\n
    \n
  • {`Camera support: `}{`USBCamera`}{` (V4L), `}{`Raspberry Pi camera module`}{` (MMAL).`}
  • \n
  • {`Conditions: `}{`Enabled`}{` (turn on/off Kerberos) and active `}{`Time`}{` per day.`}
  • \n
  • {`Algorithms: `}{`Differential Images`}{`.`}
  • \n
  • {`Heuristics: `}{`Sequence`}{`.`}
  • \n
  • {`Expositors: Select a `}{`Hull`}{` or `}{`Rectangle`}{`.`}
  • \n
  • {`Outputs: Write image to `}{`Disk`}{`, trigger an `}{`GPIO`}{` output pin and send a `}{`TCP/IP packet`}{`.`}
  • \n
  • {`Cloud: send your images to the `}{`Kerberos.io cloud aplication`}{`.`}
  • \n
\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1b2fa7b8dd587cee5688797218a2b13e.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1b2fa7b8dd587cee5688797218a2b13e.json deleted file mode 100644 index a69a04a..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1b2fa7b8dd587cee5688797218a2b13e.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838684387000,"key":"gatsby-plugin-mdx-entire-payload-47a1bbca062ac4f5abb43001c9b7b921-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).","position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Cloud or on premise","position":{"start":{"line":26,"column":4,"offset":1715},"end":{"line":26,"column":23,"offset":1734},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1712},"end":{"line":26,"column":23,"offset":1734},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster.","position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":111,"offset":1846},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":111,"offset":1846},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":31,"column":1,"offset":1849},"end":{"line":31,"column":31,"offset":1879},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":31,"column":31,"offset":1879}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n

{`Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).`}

\n

{`Cloud or on premise`}

\n

{`You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1b34818badd20190b279e5392eacf15f.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1b34818badd20190b279e5392eacf15f.json new file mode 100644 index 0000000..fe98010 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1b34818badd20190b279e5392eacf15f.json @@ -0,0 +1 @@ +{"expireTime":9007200838767269000,"key":"gatsby-plugin-mdx-entire-payload-d459347ef0e2cc8690c02789901b2db9-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":22,"column":1,"offset":730},"end":{"line":22,"column":31,"offset":760},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":22,"column":31,"offset":760}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1de87cc11700ceabeff98abb299f5fa9.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1de87cc11700ceabeff98abb299f5fa9.json new file mode 100644 index 0000000..3b6e37b --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1de87cc11700ceabeff98abb299f5fa9.json @@ -0,0 +1 @@ +{"expireTime":9007200838783594000,"key":"gatsby-plugin-mdx-entire-payload-65e835366539fd92d257173d6c266169-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":73,"column":1,"offset":2191},"end":{"line":84,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":86,"column":4,"offset":2497},"end":{"line":86,"column":11,"offset":2504},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2494},"end":{"line":86,"column":11,"offset":2504},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":88,"column":4,"offset":2509},"end":{"line":88,"column":11,"offset":2516},"indent":[]}}],"position":{"start":{"line":88,"column":2,"offset":2507},"end":{"line":88,"column":13,"offset":2518},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":44,"offset":2549},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.","position":{"start":{"line":88,"column":44,"offset":2549},"end":{"line":88,"column":204,"offset":2709},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":204,"offset":2709},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":90,"column":1,"offset":2711},"end":{"line":90,"column":72,"offset":2782},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":92,"column":1,"offset":2784},"end":{"line":92,"column":22,"offset":2805},"indent":[]}}],"position":{"start":{"line":92,"column":1,"offset":2784},"end":{"line":92,"column":22,"offset":2805},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":94,"column":1,"offset":2807},"end":{"line":99,"column":22,"offset":2931},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":100,"column":4,"offset":2935},"end":{"line":100,"column":11,"offset":2942},"indent":[]}}],"position":{"start":{"line":100,"column":1,"offset":2932},"end":{"line":100,"column":11,"offset":2942},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database.","position":{"start":{"line":102,"column":1,"offset":2944},"end":{"line":103,"column":44,"offset":3121},"indent":[1]}}],"position":{"start":{"line":102,"column":1,"offset":2944},"end":{"line":103,"column":44,"offset":3121},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":105,"column":1,"offset":3123},"end":{"line":105,"column":78,"offset":3200},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kerberos factory","position":{"start":{"line":107,"column":4,"offset":3205},"end":{"line":107,"column":20,"offset":3221},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":3202},"end":{"line":107,"column":20,"offset":3221},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":109,"column":1,"offset":3223},"end":{"line":109,"column":47,"offset":3269},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":112,"column":1,"offset":3272},"end":{"line":112,"column":31,"offset":3302},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":112,"column":31,"offset":3302}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Kerberos factory`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1e6cf19ef007466bf1d062600aa36d7a.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1e6cf19ef007466bf1d062600aa36d7a.json new file mode 100644 index 0000000..c31f600 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-1e6cf19ef007466bf1d062600aa36d7a.json @@ -0,0 +1 @@ +{"expireTime":9007200838836185000,"key":"gatsby-plugin-mdx-entire-payload-a46bf0ecfe9234d6ffab8952a0daaace-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":115,"column":1,"offset":3500},"end":{"line":115,"column":8,"offset":3507},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":117,"column":4,"offset":3512},"end":{"line":117,"column":11,"offset":3519},"indent":[]}}],"position":{"start":{"line":117,"column":1,"offset":3509},"end":{"line":117,"column":11,"offset":3519},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":119,"column":1,"offset":3521},"end":{"line":119,"column":74,"offset":3594},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":119,"column":76,"offset":3596},"end":{"line":119,"column":83,"offset":3603},"indent":[]}}],"position":{"start":{"line":119,"column":74,"offset":3594},"end":{"line":119,"column":85,"offset":3605},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":119,"column":85,"offset":3605},"end":{"line":122,"column":76,"offset":3986},"indent":[1,1,1]}}],"position":{"start":{"line":119,"column":1,"offset":3521},"end":{"line":122,"column":76,"offset":3986},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":124,"column":1,"offset":3988},"end":{"line":124,"column":47,"offset":4034},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":126,"column":1,"offset":4036},"end":{"line":126,"column":26,"offset":4061},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":4036},"end":{"line":126,"column":26,"offset":4061},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":128,"column":1,"offset":4063},"end":{"line":128,"column":25,"offset":4087},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":130,"column":3,"offset":4091},"end":{"line":130,"column":25,"offset":4113},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":4089},"end":{"line":130,"column":25,"offset":4113},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":132,"column":1,"offset":4115},"end":{"line":132,"column":94,"offset":4208},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":4115},"end":{"line":132,"column":94,"offset":4208},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":134,"column":5,"offset":4214},"end":{"line":134,"column":12,"offset":4221},"indent":[]}}],"position":{"start":{"line":134,"column":5,"offset":4214},"end":{"line":134,"column":12,"offset":4221},"indent":[]}}],"position":{"start":{"line":134,"column":1,"offset":4210},"end":{"line":134,"column":12,"offset":4221},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":135,"column":5,"offset":4226},"end":{"line":135,"column":12,"offset":4233},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4226},"end":{"line":135,"column":12,"offset":4233},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4222},"end":{"line":135,"column":12,"offset":4233},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":136,"column":5,"offset":4238},"end":{"line":136,"column":12,"offset":4245},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4238},"end":{"line":136,"column":12,"offset":4245},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4234},"end":{"line":136,"column":12,"offset":4245},"indent":[]}}],"position":{"start":{"line":134,"column":1,"offset":4210},"end":{"line":136,"column":12,"offset":4245},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":138,"column":1,"offset":4247},"end":{"line":138,"column":26,"offset":4272},"indent":[]}}],"position":{"start":{"line":138,"column":1,"offset":4247},"end":{"line":138,"column":26,"offset":4272},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":140,"column":1,"offset":4274},"end":{"line":144,"column":73,"offset":4586},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":146,"column":4,"offset":4591},"end":{"line":146,"column":21,"offset":4608},"indent":[]}}],"position":{"start":{"line":146,"column":1,"offset":4588},"end":{"line":146,"column":21,"offset":4608},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS.","position":{"start":{"line":148,"column":1,"offset":4610},"end":{"line":148,"column":108,"offset":4717},"indent":[]}}],"position":{"start":{"line":148,"column":1,"offset":4610},"end":{"line":148,"column":108,"offset":4717},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":" $ kubectl get svc\n NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n factory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\n kubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\n mongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\n--> traefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h\n traefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":150,"column":1,"offset":4719},"end":{"line":156,"column":109,"offset":5396},"indent":[1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":159,"column":1,"offset":5399},"end":{"line":159,"column":31,"offset":5429},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":159,"column":31,"offset":5429}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS.`}

\n
{`    $ kubectl get svc`}{`\n`}{`    NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`    factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`    kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`    mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`--> traefik              LoadBalancer   10.0.10.97    34.66.138.141   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`    traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-222cf10403a2c451bc05ea0af53da581.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-222cf10403a2c451bc05ea0af53da581.json new file mode 100644 index 0000000..134ad22 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-222cf10403a2c451bc05ea0af53da581.json @@ -0,0 +1 @@ +{"expireTime":9007200838824390000,"key":"gatsby-plugin-mdx-entire-payload-7978a41f60d47798291df00395177217-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily.\nInstead of writing yaml files yourself, you use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":59,"offset":1655},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":61,"offset":1657},"end":{"line":54,"column":67,"offset":1663},"indent":[]}}],"position":{"start":{"line":54,"column":59,"offset":1655},"end":{"line":54,"column":69,"offset":1665},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure\nwith configuration files.","position":{"start":{"line":54,"column":69,"offset":1665},"end":{"line":55,"column":26,"offset":1737},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":26,"offset":1737},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1739},"end":{"line":57,"column":73,"offset":1811},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1739},"end":{"line":57,"column":73,"offset":1811},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1813},"end":{"line":65,"column":24,"offset":1918},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1924},"end":{"line":67,"column":18,"offset":1937},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1920},"end":{"line":67,"column":18,"offset":1937},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":1939},"end":{"line":70,"column":55,"offset":2095},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":1939},"end":{"line":70,"column":55,"offset":2095},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2097},"end":{"line":74,"column":39,"offset":2255},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2257},"end":{"line":76,"column":31,"offset":2287},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2257},"end":{"line":76,"column":31,"offset":2287},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2289},"end":{"line":89,"column":19,"offset":2590},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2595},"end":{"line":91,"column":11,"offset":2602},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2592},"end":{"line":91,"column":11,"offset":2602},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2607},"end":{"line":93,"column":11,"offset":2614},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2605},"end":{"line":93,"column":13,"offset":2616},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2604},"end":{"line":93,"column":44,"offset":2647},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.","position":{"start":{"line":93,"column":44,"offset":2647},"end":{"line":94,"column":103,"offset":2807},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2604},"end":{"line":94,"column":103,"offset":2807},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2809},"end":{"line":96,"column":72,"offset":2880},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2882},"end":{"line":98,"column":22,"offset":2903},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2882},"end":{"line":98,"column":22,"offset":2903},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":2905},"end":{"line":105,"column":22,"offset":3029},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3033},"end":{"line":106,"column":11,"offset":3040},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3030},"end":{"line":106,"column":11,"offset":3040},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3042},"end":{"line":109,"column":117,"offset":3292},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3042},"end":{"line":109,"column":117,"offset":3292},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3294},"end":{"line":111,"column":78,"offset":3371},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kerberos factory","position":{"start":{"line":113,"column":4,"offset":3376},"end":{"line":113,"column":20,"offset":3392},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3373},"end":{"line":113,"column":20,"offset":3392},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":115,"column":1,"offset":3394},"end":{"line":115,"column":74,"offset":3467},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":115,"column":76,"offset":3469},"end":{"line":115,"column":83,"offset":3476},"indent":[]}}],"position":{"start":{"line":115,"column":74,"offset":3467},"end":{"line":115,"column":85,"offset":3478},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating","position":{"start":{"line":115,"column":85,"offset":3478},"end":{"line":115,"column":128,"offset":3521},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":3394},"end":{"line":115,"column":128,"offset":3521},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":117,"column":1,"offset":3523},"end":{"line":117,"column":47,"offset":3569},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":120,"column":1,"offset":3572},"end":{"line":120,"column":31,"offset":3602},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":120,"column":31,"offset":3602}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily.\nInstead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure\nwith configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Kerberos factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2355d47ddd19afb93c3784b35ef0830f.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2355d47ddd19afb93c3784b35ef0830f.json deleted file mode 100644 index 91e4c9e..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2355d47ddd19afb93c3784b35ef0830f.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838683696000,"key":"gatsby-plugin-mdx-entire-payload-3617e7ecefd8f65b1ad270d300f0d568-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal). ","position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":224,"offset":1711},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":224,"offset":1711},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":27,"column":1,"offset":1714},"end":{"line":27,"column":31,"offset":1744},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":27,"column":31,"offset":1744}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n

{`Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal). `}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-27c770133657c6ae7a79046105e97dde.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-27c770133657c6ae7a79046105e97dde.json deleted file mode 100644 index f9bfa4b..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-27c770133657c6ae7a79046105e97dde.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838682218000,"key":"gatsby-plugin-mdx-entire-payload-8cfe45dca4bfa5ef8a48ac8af14d45ba-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide the high availability and fail over requirements customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape vertically.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":237,"offset":1312},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":237,"offset":1312},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":23,"column":1,"offset":1315},"end":{"line":23,"column":31,"offset":1345},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":23,"column":31,"offset":1345}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide the high availability and fail over requirements customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape vertically.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2c3e7c147574c13c84efaf4cab6f081a.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2c3e7c147574c13c84efaf4cab6f081a.json deleted file mode 100644 index d1fed56..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2c3e7c147574c13c84efaf4cab6f081a.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838525465000,"key":"gatsby-plugin-mdx-entire-payload-fc151a965aaab2fe0920bf696d3eca9e-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but is not scalable of you want to monitor dozens.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":13,"column":138,"offset":547},"indent":[]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":13,"column":138,"offset":547},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":16,"column":1,"offset":550},"end":{"line":16,"column":31,"offset":580},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":16,"column":31,"offset":580}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but is not scalable of you want to monitor dozens.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2d04824b64919519831046dd3ff6ca94.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2d04824b64919519831046dd3ff6ca94.json new file mode 100644 index 0000000..d1f9b38 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2d04824b64919519831046dd3ff6ca94.json @@ -0,0 +1 @@ +{"expireTime":9007200838837127000,"key":"gatsby-plugin-mdx-entire-payload-071ca29a1f93cfb9aed143d340bf4a65-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":107,"column":4,"offset":3144},"end":{"line":107,"column":11,"offset":3151},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":3141},"end":{"line":107,"column":11,"offset":3151},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}}],"position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":112,"column":1,"offset":3398},"end":{"line":112,"column":78,"offset":3475},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":116,"column":1,"offset":3501},"end":{"line":116,"column":8,"offset":3508},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":118,"column":4,"offset":3513},"end":{"line":118,"column":11,"offset":3520},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3510},"end":{"line":118,"column":11,"offset":3520},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":120,"column":74,"offset":3595},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":120,"column":76,"offset":3597},"end":{"line":120,"column":83,"offset":3604},"indent":[]}}],"position":{"start":{"line":120,"column":74,"offset":3595},"end":{"line":120,"column":85,"offset":3606},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":120,"column":85,"offset":3606},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}}],"position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":125,"column":1,"offset":3989},"end":{"line":125,"column":47,"offset":4035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}}],"position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":129,"column":1,"offset":4064},"end":{"line":129,"column":25,"offset":4088},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":131,"column":3,"offset":4092},"end":{"line":131,"column":25,"offset":4114},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":4090},"end":{"line":131,"column":25,"offset":4114},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":135,"column":12,"offset":4222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4223},"end":{"line":136,"column":12,"offset":4234},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4235},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":137,"column":12,"offset":4246},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":141,"column":1,"offset":4275},"end":{"line":145,"column":73,"offset":4587},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":147,"column":4,"offset":4592},"end":{"line":147,"column":21,"offset":4609},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4589},"end":{"line":147,"column":21,"offset":4609},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure your DNS server. Look for the\nTraefik service, and copy its External IP.","position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":43,"offset":4786},"indent":[1]}}],"position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":43,"offset":4786},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":" $ kubectl get svc\n NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n factory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\n kubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\n mongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\n--> traefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h\n traefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":152,"column":1,"offset":4788},"end":{"line":158,"column":109,"offset":5465},"indent":[1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Add this External IP to your DNS server, so it will resolve your domains:","position":{"start":{"line":160,"column":1,"offset":5467},"end":{"line":160,"column":74,"offset":5540},"indent":[]}}],"position":{"start":{"line":160,"column":1,"offset":5467},"end":{"line":160,"column":74,"offset":5540},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"traefik.domain.com (change to your domain)","position":{"start":{"line":162,"column":5,"offset":5546},"end":{"line":162,"column":47,"offset":5588},"indent":[]}}],"position":{"start":{"line":162,"column":5,"offset":5546},"end":{"line":162,"column":47,"offset":5588},"indent":[]}}],"position":{"start":{"line":162,"column":1,"offset":5542},"end":{"line":162,"column":47,"offset":5588},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"factory.domain.com (change to your domain).","position":{"start":{"line":163,"column":5,"offset":5593},"end":{"line":163,"column":48,"offset":5636},"indent":[]}}],"position":{"start":{"line":163,"column":5,"offset":5593},"end":{"line":163,"column":48,"offset":5636},"indent":[]}}],"position":{"start":{"line":163,"column":1,"offset":5589},"end":{"line":163,"column":48,"offset":5636},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"api.factory.domain.com (change to your domain).","position":{"start":{"line":164,"column":5,"offset":5641},"end":{"line":164,"column":52,"offset":5688},"indent":[]}}],"position":{"start":{"line":164,"column":5,"offset":5641},"end":{"line":164,"column":52,"offset":5688},"indent":[]}}],"position":{"start":{"line":164,"column":1,"offset":5637},"end":{"line":164,"column":52,"offset":5688},"indent":[]}}],"position":{"start":{"line":162,"column":1,"offset":5542},"end":{"line":164,"column":52,"offset":5688},"indent":[1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Access the system","position":{"start":{"line":166,"column":4,"offset":5693},"end":{"line":166,"column":21,"offset":5710},"indent":[]}}],"position":{"start":{"line":166,"column":1,"offset":5690},"end":{"line":166,"column":21,"offset":5710},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating\nto the Factory domain in your browser you will see the Factory web page showing up.","position":{"start":{"line":168,"column":1,"offset":5712},"end":{"line":169,"column":84,"offset":5924},"indent":[1]}}],"position":{"start":{"line":168,"column":1,"offset":5712},"end":{"line":169,"column":84,"offset":5924},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":172,"column":1,"offset":5927},"end":{"line":172,"column":31,"offset":5957},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":172,"column":31,"offset":5957}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure your DNS server. Look for the\nTraefik service, and copy its External IP.`}

\n
{`    $ kubectl get svc`}{`\n`}{`    NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`    factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`    kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`    mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`--> traefik              LoadBalancer   10.0.10.97    34.66.138.141   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`    traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n

{`Add this External IP to your DNS server, so it will resolve your domains:`}

\n
    \n
  • {`traefik.domain.com (change to your domain)`}
  • \n
  • {`factory.domain.com (change to your domain).`}
  • \n
  • {`api.factory.domain.com (change to your domain).`}
  • \n
\n

{`Access the system`}

\n

{`Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating\nto the Factory domain in your browser you will see the Factory web page showing up.`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2fed2abfd80ae15f7308d9585346d442.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2fed2abfd80ae15f7308d9585346d442.json new file mode 100644 index 0000000..65d0bd1 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-2fed2abfd80ae15f7308d9585346d442.json @@ -0,0 +1 @@ +{"expireTime":9007200838824970000,"key":"gatsby-plugin-mdx-entire-payload-3de301756eaebe14f1cf2693820fcc2c-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":113,"column":4,"offset":3479},"end":{"line":113,"column":11,"offset":3486},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":11,"offset":3486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":115,"column":1,"offset":3488},"end":{"line":115,"column":74,"offset":3561},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":115,"column":76,"offset":3563},"end":{"line":115,"column":83,"offset":3570},"indent":[]}}],"position":{"start":{"line":115,"column":74,"offset":3561},"end":{"line":115,"column":85,"offset":3572},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":115,"column":85,"offset":3572},"end":{"line":118,"column":76,"offset":3953},"indent":[1,1,1]}}],"position":{"start":{"line":115,"column":1,"offset":3488},"end":{"line":118,"column":76,"offset":3953},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":120,"column":1,"offset":3955},"end":{"line":120,"column":47,"offset":4001},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":123,"column":1,"offset":4004},"end":{"line":123,"column":31,"offset":4034},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":123,"column":31,"offset":4034}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3661d5b14a4927f7dcfd5504c55dde67.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3661d5b14a4927f7dcfd5504c55dde67.json index 8a7b4ca..2e28257 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3661d5b14a4927f7dcfd5504c55dde67.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3661d5b14a4927f7dcfd5504c55dde67.json @@ -1 +1 @@ -{"expireTime":9007200838510937000,"key":"gatsby-plugin-mdx-entire-payload-2bfee1ee9aa0ee686355d988eea0fb44-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source comes with different installation flavours. So you might think, why? The reason is simple, depending on the use case one option is better than another. A short list of recommendations:","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":207,"offset":441},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":207,"offset":441},"indent":[]}},{"type":"list","ordered":true,"start":1,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"/opensource/installation#kios","children":[{"type":"text","value":"KiOS","position":{"start":{"line":14,"column":5,"offset":447},"end":{"line":14,"column":9,"offset":451},"indent":[]}}],"position":{"start":{"line":14,"column":4,"offset":446},"end":{"line":14,"column":41,"offset":483},"indent":[]}},{"type":"text","value":": You have a Raspberry Pi, and you only want to run a Kerberos agent on it.","position":{"start":{"line":14,"column":41,"offset":483},"end":{"line":14,"column":116,"offset":558},"indent":[]}}],"position":{"start":{"line":14,"column":4,"offset":446},"end":{"line":14,"column":116,"offset":558},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":443},"end":{"line":14,"column":116,"offset":558},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"/opensource/installation#raspbian","children":[{"type":"text","value":"Raspbian","position":{"start":{"line":15,"column":5,"offset":563},"end":{"line":15,"column":13,"offset":571},"indent":[]}}],"position":{"start":{"line":15,"column":4,"offset":562},"end":{"line":15,"column":49,"offset":607},"indent":[]}},{"type":"text","value":": You have a Raspberry Pi, but you want other services running next to the Kerberos agent.","position":{"start":{"line":15,"column":49,"offset":607},"end":{"line":15,"column":139,"offset":697},"indent":[]}}],"position":{"start":{"line":15,"column":4,"offset":562},"end":{"line":15,"column":139,"offset":697},"indent":[]}}],"position":{"start":{"line":15,"column":1,"offset":559},"end":{"line":15,"column":139,"offset":697},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"/opensource/installation#docker","children":[{"type":"text","value":"Docker","position":{"start":{"line":16,"column":5,"offset":702},"end":{"line":16,"column":11,"offset":708},"indent":[]}}],"position":{"start":{"line":16,"column":4,"offset":701},"end":{"line":16,"column":45,"offset":742},"indent":[]}},{"type":"text","value":": You have a lot of IP cameras, and/or don't want to mess with dependencies.","position":{"start":{"line":16,"column":45,"offset":742},"end":{"line":16,"column":121,"offset":818},"indent":[]}}],"position":{"start":{"line":16,"column":4,"offset":701},"end":{"line":16,"column":121,"offset":818},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":698},"end":{"line":16,"column":121,"offset":818},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"/opensource/installation#generic","children":[{"type":"text","value":"Generic","position":{"start":{"line":17,"column":5,"offset":823},"end":{"line":17,"column":12,"offset":830},"indent":[]}}],"position":{"start":{"line":17,"column":4,"offset":822},"end":{"line":17,"column":47,"offset":865},"indent":[]}},{"type":"text","value":": You want to develop/extend Kerberos with your own features, or you want to run a Kerberos agent on a not supported OS/architecure.","position":{"start":{"line":17,"column":47,"offset":865},"end":{"line":17,"column":179,"offset":997},"indent":[]}}],"position":{"start":{"line":17,"column":4,"offset":822},"end":{"line":17,"column":179,"offset":997},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":819},"end":{"line":17,"column":179,"offset":997},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":443},"end":{"line":17,"column":179,"offset":997},"indent":[1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":19,"column":4,"offset":1002},"end":{"line":19,"column":8,"offset":1006},"indent":[]}}],"position":{"start":{"line":19,"column":1,"offset":999},"end":{"line":19,"column":8,"offset":1006},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"KiOS (Kerberos Operating System) is our custom linux OS, which runs the Kerberos agent out-of-the-box (read plug-and-play). It's an OS designed for the Raspberry Pi (all version are supported), which you can flash to an SD card.","position":{"start":{"line":21,"column":1,"offset":1008},"end":{"line":21,"column":229,"offset":1236},"indent":[]}}],"position":{"start":{"line":21,"column":1,"offset":1008},"end":{"line":21,"column":229,"offset":1236},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It can be installed using our own installer, which comes with a nice interface that handles the flashing and network configuration for you, or you can handle the flashing yourself by using Etcher.","position":{"start":{"line":23,"column":1,"offset":1238},"end":{"line":23,"column":197,"offset":1434},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":1238},"end":{"line":23,"column":197,"offset":1434},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Github","position":{"start":{"line":25,"column":5,"offset":1440},"end":{"line":25,"column":11,"offset":1446},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":1436},"end":{"line":25,"column":11,"offset":1446},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"KiOS is compiled using Buildroot, the project can be found on ","position":{"start":{"line":27,"column":1,"offset":1448},"end":{"line":27,"column":63,"offset":1510},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios","children":[{"type":"text","value":"following Github repo","position":{"start":{"line":27,"column":64,"offset":1511},"end":{"line":27,"column":85,"offset":1532},"indent":[]}}],"position":{"start":{"line":27,"column":63,"offset":1510},"end":{"line":27,"column":123,"offset":1570},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":27,"column":123,"offset":1570},"end":{"line":27,"column":124,"offset":1571},"indent":[]}}],"position":{"start":{"line":27,"column":1,"offset":1448},"end":{"line":27,"column":124,"offset":1571},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Kerberos installer","position":{"start":{"line":29,"column":5,"offset":1577},"end":{"line":29,"column":23,"offset":1595},"indent":[]}}],"position":{"start":{"line":29,"column":1,"offset":1573},"end":{"line":29,"column":23,"offset":1595},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Installing the Kerberos agent to your Raspberry Pi, has never been so easy. By using our cross-platform installer, you can run a fully configured video surveillance system within 3 minutes. Indeed, we also think that's awesome!","position":{"start":{"line":31,"column":1,"offset":1597},"end":{"line":31,"column":228,"offset":1824},"indent":[]}}],"position":{"start":{"line":31,"column":1,"offset":1597},"end":{"line":31,"column":228,"offset":1824},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kios-install.gif","alt":"access kerberos installer","position":{"start":{"line":33,"column":1,"offset":1826},"end":{"line":33,"column":67,"offset":1892},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":1826},"end":{"line":33,"column":67,"offset":1892},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Download the correct installer for your OS below:","position":{"start":{"line":35,"column":1,"offset":1894},"end":{"line":35,"column":50,"offset":1943},"indent":[]}}],"position":{"start":{"line":35,"column":1,"offset":1894},"end":{"line":35,"column":50,"offset":1943},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://github.com/kerberos-io/etcher/releases","children":[{"type":"text","value":"https://github.com/kerberos-io/etcher/releases","position":{"start":{"line":37,"column":3,"offset":1947},"end":{"line":37,"column":49,"offset":1993},"indent":[]}}],"position":{"start":{"line":37,"column":3,"offset":1947},"end":{"line":37,"column":49,"offset":1993},"indent":[]}}],"position":{"start":{"line":37,"column":3,"offset":1947},"end":{"line":37,"column":49,"offset":1993},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":1945},"end":{"line":37,"column":49,"offset":1993},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Etcher","position":{"start":{"line":39,"column":5,"offset":1999},"end":{"line":39,"column":11,"offset":2005},"indent":[]}}],"position":{"start":{"line":39,"column":1,"offset":1995},"end":{"line":39,"column":11,"offset":2005},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you love Etcher, or the Kerberos installer is not working as expected, you can also flash the Kerberos agent to your SD card manually. It goes as following:","position":{"start":{"line":41,"column":1,"offset":2007},"end":{"line":41,"column":160,"offset":2166},"indent":[]}}],"position":{"start":{"line":41,"column":1,"offset":2007},"end":{"line":41,"column":160,"offset":2166},"indent":[]}},{"type":"list","ordered":true,"start":1,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Download ","position":{"start":{"line":43,"column":4,"offset":2171},"end":{"line":43,"column":13,"offset":2180},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/releases","children":[{"type":"text","value":"the KiOS image","position":{"start":{"line":43,"column":14,"offset":2181},"end":{"line":43,"column":28,"offset":2195},"indent":[]}}],"position":{"start":{"line":43,"column":13,"offset":2180},"end":{"line":43,"column":75,"offset":2242},"indent":[]}},{"type":"text","value":",","position":{"start":{"line":43,"column":75,"offset":2242},"end":{"line":43,"column":76,"offset":2243},"indent":[]}}],"position":{"start":{"line":43,"column":4,"offset":2171},"end":{"line":43,"column":76,"offset":2243},"indent":[]}}],"position":{"start":{"line":43,"column":1,"offset":2168},"end":{"line":43,"column":76,"offset":2243},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"flash it to your SD card with Etcher,","position":{"start":{"line":44,"column":4,"offset":2247},"end":{"line":44,"column":41,"offset":2284},"indent":[]}}],"position":{"start":{"line":44,"column":4,"offset":2247},"end":{"line":44,"column":41,"offset":2284},"indent":[]}}],"position":{"start":{"line":44,"column":1,"offset":2244},"end":{"line":44,"column":41,"offset":2284},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"and edit some configuration files at the boot directory.","position":{"start":{"line":45,"column":4,"offset":2288},"end":{"line":45,"column":60,"offset":2344},"indent":[]}}],"position":{"start":{"line":45,"column":4,"offset":2288},"end":{"line":45,"column":60,"offset":2344},"indent":[]}}],"position":{"start":{"line":45,"column":1,"offset":2285},"end":{"line":45,"column":60,"offset":2344},"indent":[]}}],"position":{"start":{"line":43,"column":1,"offset":2168},"end":{"line":45,"column":60,"offset":2344},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://www.balena.io/etcher/","children":[{"type":"image","title":null,"url":"../../public/images/etcher-install.png","alt":"use etcher for kios","position":{"start":{"line":47,"column":2,"offset":2347},"end":{"line":47,"column":64,"offset":2409},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":2346},"end":{"line":47,"column":96,"offset":2441},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":2346},"end":{"line":47,"column":96,"offset":2441},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you have download the KiOS image (make sure you downloaded the right image) and flashed it to an SD card, put it back into your working station. Navigate to the SD card and creating following files.","position":{"start":{"line":49,"column":1,"offset":2443},"end":{"line":49,"column":204,"offset":2646},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":2443},"end":{"line":49,"column":204,"offset":2646},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Connecting to WiFi","position":{"start":{"line":51,"column":6,"offset":2653},"end":{"line":51,"column":24,"offset":2671},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":2648},"end":{"line":51,"column":24,"offset":2671},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to connect your Raspberry Pi to a WiFi connection, you will need to create a file ","position":{"start":{"line":53,"column":1,"offset":2673},"end":{"line":53,"column":95,"offset":2767},"indent":[]}},{"type":"inlineCode","value":"wireless.conf","position":{"start":{"line":53,"column":95,"offset":2767},"end":{"line":53,"column":110,"offset":2782},"indent":[]}},{"type":"text","value":" on your SD card, with following contents. Change the SSID and password properties to your own WiFi credentials.","position":{"start":{"line":53,"column":110,"offset":2782},"end":{"line":53,"column":222,"offset":2894},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":2673},"end":{"line":53,"column":222,"offset":2894},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"update_config=1\nctrl_interface=/var/run/wpa_supplicant\nnetwork={\n scan_ssid=1\n ssid=\"\"\n psk=\"\"\n}","position":{"start":{"line":55,"column":1,"offset":2896},"end":{"line":63,"column":4,"offset":3005},"indent":[1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Setup a static IP-address","position":{"start":{"line":65,"column":6,"offset":3012},"end":{"line":65,"column":31,"offset":3037},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":3007},"end":{"line":65,"column":31,"offset":3037},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to assign a static ip-address to your Raspberry Pi, create a file ","position":{"start":{"line":67,"column":1,"offset":3039},"end":{"line":67,"column":79,"offset":3117},"indent":[]}},{"type":"inlineCode","value":"static_ip.conf","position":{"start":{"line":67,"column":79,"offset":3117},"end":{"line":67,"column":95,"offset":3133},"indent":[]}},{"type":"text","value":" on your SD card, with following contents:","position":{"start":{"line":67,"column":95,"offset":3133},"end":{"line":67,"column":137,"offset":3175},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":3039},"end":{"line":67,"column":137,"offset":3175},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"#####################################################################\n# Enter the IP-address you want to have, followed by the subnet mask\n# e.g. 192.168.0.10/24\nstatic_ip=\"\"\n#####################################################################\n# Enter the Gateway and DNS, this will be your router in most cases\n# e.g. 192.168.0.1\nstatic_gw=\"\"\nstatic_dns=\"\"","position":{"start":{"line":69,"column":1,"offset":3177},"end":{"line":79,"column":4,"offset":3545},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Power on the Raspberry Pi","position":{"start":{"line":81,"column":5,"offset":3551},"end":{"line":81,"column":30,"offset":3576},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":3547},"end":{"line":81,"column":30,"offset":3576},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you've finished the installation using either the KiOS installer or Etcher, you can put the SD card into your Raspberry Pi and turn it on. Please note that the first time you boot KiOS it can take about 2 mins before the system is operational. When KiOS is ready you can open your favorite browser and type in the IP address of your Raspberry Pi. This will open the Kerberos agent's front-end, which you can access with the username: root and password: root.","position":{"start":{"line":83,"column":1,"offset":3578},"end":{"line":83,"column":464,"offset":4041},"indent":[]}}],"position":{"start":{"line":83,"column":1,"offset":3578},"end":{"line":83,"column":464,"offset":4041},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/access.png","alt":"access kerberos interface","position":{"start":{"line":85,"column":1,"offset":4043},"end":{"line":85,"column":61,"offset":4103},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":4043},"end":{"line":85,"column":61,"offset":4103},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Access the Raspberry Pi","position":{"start":{"line":87,"column":5,"offset":4109},"end":{"line":87,"column":28,"offset":4132},"indent":[]}}],"position":{"start":{"line":87,"column":1,"offset":4105},"end":{"line":87,"column":28,"offset":4132},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can access the KiOS system with attaching your Raspberry Pi to a HDMI monitor or by using ","position":{"start":{"line":89,"column":1,"offset":4134},"end":{"line":89,"column":95,"offset":4228},"indent":[]}},{"type":"inlineCode","value":"ssh","position":{"start":{"line":89,"column":95,"offset":4228},"end":{"line":89,"column":100,"offset":4233},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":89,"column":100,"offset":4233},"end":{"line":89,"column":101,"offset":4234},"indent":[]}}],"position":{"start":{"line":89,"column":1,"offset":4134},"end":{"line":89,"column":101,"offset":4234},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"Cedrics-Mac-mini:build cedricverst$ ssh root@192.168.0.12\nWelcome to kios-79e30bbb!\n[root@kios-79e30bbb ~]#","position":{"start":{"line":91,"column":1,"offset":4236},"end":{"line":95,"column":4,"offset":4353},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Note that by default no root password is set, you can define a password in the ","position":{"start":{"line":97,"column":1,"offset":4355},"end":{"line":97,"column":80,"offset":4434},"indent":[]}},{"type":"inlineCode","value":"/data/etc/kios.conf","position":{"start":{"line":97,"column":80,"offset":4434},"end":{"line":97,"column":101,"offset":4455},"indent":[]}},{"type":"text","value":" file. Once you added a password, make sure to reboot the OS.","position":{"start":{"line":97,"column":101,"offset":4455},"end":{"line":97,"column":162,"offset":4516},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":4355},"end":{"line":97,"column":162,"offset":4516},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"[root@kios-79e30bbb ~]# nano /data/etc/kios.conf\n[root@kios-79e30bbb ~]# reboot","position":{"start":{"line":99,"column":1,"offset":4518},"end":{"line":102,"column":4,"offset":4607},"indent":[1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Raspbian","position":{"start":{"line":104,"column":4,"offset":4612},"end":{"line":104,"column":12,"offset":4620},"indent":[]}}],"position":{"start":{"line":104,"column":1,"offset":4609},"end":{"line":104,"column":12,"offset":4620},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you have already an OS (e.g. Raspbian Buster) flashed to your Raspberry Pi, then it makes sense to install the Kerberos agent on top of your existing OS. There are two ways to achieve this:","position":{"start":{"line":106,"column":1,"offset":4622},"end":{"line":106,"column":193,"offset":4814},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":4622},"end":{"line":106,"column":193,"offset":4814},"indent":[]}},{"type":"list","ordered":true,"start":1,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Install the Kerberos agent using Docker (more info below),","position":{"start":{"line":108,"column":4,"offset":4819},"end":{"line":108,"column":62,"offset":4877},"indent":[]}}],"position":{"start":{"line":108,"column":4,"offset":4819},"end":{"line":108,"column":62,"offset":4877},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":4816},"end":{"line":108,"column":62,"offset":4877},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"or you can install the Kerberos agent manually (machinery + web).","position":{"start":{"line":109,"column":4,"offset":4881},"end":{"line":109,"column":69,"offset":4946},"indent":[]}}],"position":{"start":{"line":109,"column":4,"offset":4881},"end":{"line":109,"column":69,"offset":4946},"indent":[]}}],"position":{"start":{"line":109,"column":1,"offset":4878},"end":{"line":109,"column":69,"offset":4946},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":4816},"end":{"line":109,"column":69,"offset":4946},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"This section will focus on option 2, and will show you how to install the Kerberos agent manually.","position":{"start":{"line":111,"column":1,"offset":4948},"end":{"line":111,"column":99,"offset":5046},"indent":[]}}],"position":{"start":{"line":111,"column":1,"offset":4948},"end":{"line":111,"column":99,"offset":5046},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Update OS","position":{"start":{"line":113,"column":5,"offset":5052},"end":{"line":113,"column":14,"offset":5061},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":5048},"end":{"line":113,"column":14,"offset":5061},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Let's start with updating the OS, and installing a couple of packages.","position":{"start":{"line":115,"column":1,"offset":5063},"end":{"line":115,"column":71,"offset":5133},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":5063},"end":{"line":115,"column":71,"offset":5133},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"We have tested the Raspbian installation on ","position":{"start":{"line":117,"column":3,"offset":5137},"end":{"line":117,"column":47,"offset":5181},"indent":[]}},{"type":"inlineCode","value":"Raspbian GNU/Linux 10 (buster)","position":{"start":{"line":117,"column":47,"offset":5181},"end":{"line":117,"column":79,"offset":5213},"indent":[]}},{"type":"text","value":". It might be that if you have a different version of Raspbian, you will need to install additional/different packages.","position":{"start":{"line":117,"column":79,"offset":5213},"end":{"line":117,"column":198,"offset":5332},"indent":[]}}],"position":{"start":{"line":117,"column":3,"offset":5137},"end":{"line":117,"column":198,"offset":5332},"indent":[]}}],"position":{"start":{"line":117,"column":1,"offset":5135},"end":{"line":117,"column":198,"offset":5332},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo apt-get update && sudo apt-get install -y ffmpeg","position":{"start":{"line":119,"column":1,"offset":5334},"end":{"line":121,"column":4,"offset":5397},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":123,"column":5,"offset":5403},"end":{"line":123,"column":14,"offset":5412},"indent":[]}}],"position":{"start":{"line":123,"column":1,"offset":5399},"end":{"line":123,"column":14,"offset":5412},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Download the debian file from the machinery repository.","position":{"start":{"line":125,"column":1,"offset":5414},"end":{"line":125,"column":56,"offset":5469},"indent":[]}}],"position":{"start":{"line":125,"column":1,"offset":5414},"end":{"line":125,"column":56,"offset":5469},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/releases","children":[{"type":"text","value":"https://github.com/kerberos-io/machinery/releases","position":{"start":{"line":126,"column":3,"offset":5472},"end":{"line":126,"column":52,"offset":5521},"indent":[]}}],"position":{"start":{"line":126,"column":3,"offset":5472},"end":{"line":126,"column":52,"offset":5521},"indent":[]}}],"position":{"start":{"line":126,"column":3,"offset":5472},"end":{"line":126,"column":52,"offset":5521},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":5470},"end":{"line":126,"column":52,"offset":5521},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A ","position":{"start":{"line":128,"column":1,"offset":5523},"end":{"line":128,"column":3,"offset":5525},"indent":[]}},{"type":"inlineCode","value":".deb","position":{"start":{"line":128,"column":3,"offset":5525},"end":{"line":128,"column":9,"offset":5531},"indent":[]}},{"type":"text","value":" file is available for every version of the Raspberry Pi. For example if you are using a Raspberry Pi 4 for version 2.8.0, execute following command. You can change the version and Raspberry Pi board to your needs.","position":{"start":{"line":128,"column":9,"offset":5531},"end":{"line":128,"column":223,"offset":5745},"indent":[]}}],"position":{"start":{"line":128,"column":1,"offset":5523},"end":{"line":128,"column":223,"offset":5745},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Please make sure you pick the right board (rpi, rpi2, rpi3 or rpi4), and choose the version you want (e.g. 2.8.0). Replace below url, with your preferences.","position":{"start":{"line":130,"column":3,"offset":5749},"end":{"line":130,"column":159,"offset":5905},"indent":[]}}],"position":{"start":{"line":130,"column":3,"offset":5749},"end":{"line":130,"column":159,"offset":5905},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":5747},"end":{"line":130,"column":159,"offset":5905},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"wget https://github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-machinery-kerberosio-armhf-2.8.0.deb\nsudo dpkg -i rpi4-machinery-kerberosio-armhf-2.8.0.deb","position":{"start":{"line":132,"column":1,"offset":5907},"end":{"line":135,"column":4,"offset":6084},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Download the x265 library (version 160) from the machinery repository, as Raspbian Buster 10 only ships with version 165. Make sure you select the right board.","position":{"start":{"line":137,"column":1,"offset":6086},"end":{"line":137,"column":160,"offset":6245},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":6086},"end":{"line":137,"column":160,"offset":6245},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"inlineCode","value":"v2.8.0/rpi4-libx265.so.160","position":{"start":{"line":139,"column":3,"offset":6249},"end":{"line":139,"column":31,"offset":6277},"indent":[]}},{"type":"text","value":" this will download the libx265 shared library for the Raspberry Pi 4.","position":{"start":{"line":139,"column":31,"offset":6277},"end":{"line":139,"column":101,"offset":6347},"indent":[]}}],"position":{"start":{"line":139,"column":3,"offset":6249},"end":{"line":139,"column":101,"offset":6347},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":6247},"end":{"line":139,"column":101,"offset":6347},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"wget https://github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-libx265.so.160\nsudo mv rpi4-libx265.so.160 /usr/lib/arm-linux-gnueabihf/libx265.so.160","position":{"start":{"line":141,"column":1,"offset":6349},"end":{"line":144,"column":4,"offset":6521},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Same applies for the libx264 library, download the right shared library.","position":{"start":{"line":146,"column":1,"offset":6523},"end":{"line":146,"column":73,"offset":6595},"indent":[]}}],"position":{"start":{"line":146,"column":1,"offset":6523},"end":{"line":146,"column":73,"offset":6595},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"inlineCode","value":"v2.8.0/rpi4-libx264.so.148","position":{"start":{"line":149,"column":3,"offset":6600},"end":{"line":149,"column":31,"offset":6628},"indent":[]}},{"type":"text","value":" this will download the libx264 shared library for the Raspberry Pi 4.","position":{"start":{"line":149,"column":31,"offset":6628},"end":{"line":149,"column":101,"offset":6698},"indent":[]}}],"position":{"start":{"line":149,"column":3,"offset":6600},"end":{"line":149,"column":101,"offset":6698},"indent":[]}}],"position":{"start":{"line":149,"column":1,"offset":6598},"end":{"line":149,"column":101,"offset":6698},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"wget https://github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-libx264.so.148\nsudo mv rpi4-libx264.so.148 /usr/lib/arm-linux-gnueabihf/libx264.so.148","position":{"start":{"line":151,"column":1,"offset":6700},"end":{"line":154,"column":4,"offset":6872},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"If you wish to use the Raspberry Pi Camera Module, make sure ","position":{"start":{"line":156,"column":1,"offset":6874},"end":{"line":156,"column":62,"offset":6935},"indent":[]}},{"type":"link","title":null,"url":"https://www.raspberrypi.org/documentation/configuration/camera.md","children":[{"type":"text","value":"to enable it","position":{"start":{"line":156,"column":63,"offset":6936},"end":{"line":156,"column":75,"offset":6948},"indent":[]}}],"position":{"start":{"line":156,"column":62,"offset":6935},"end":{"line":156,"column":143,"offset":7016},"indent":[]}},{"type":"text","value":" using ","position":{"start":{"line":156,"column":143,"offset":7016},"end":{"line":156,"column":150,"offset":7023},"indent":[]}},{"type":"inlineCode","value":"sudo raspi-config","position":{"start":{"line":156,"column":150,"offset":7023},"end":{"line":156,"column":169,"offset":7042},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":156,"column":169,"offset":7042},"end":{"line":156,"column":170,"offset":7043},"indent":[]}}],"position":{"start":{"line":156,"column":1,"offset":6874},"end":{"line":156,"column":170,"offset":7043},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo raspi-config","position":{"start":{"line":158,"column":1,"offset":7045},"end":{"line":160,"column":4,"offset":7072},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Enable machinery to start on boot, and start the service.","position":{"start":{"line":162,"column":1,"offset":7074},"end":{"line":162,"column":58,"offset":7131},"indent":[]}}],"position":{"start":{"line":162,"column":1,"offset":7074},"end":{"line":162,"column":58,"offset":7131},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"sudo systemctl enable kerberosio\nsudo service kerberosio start","position":{"start":{"line":164,"column":1,"offset":7133},"end":{"line":167,"column":4,"offset":7203},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Web","position":{"start":{"line":169,"column":5,"offset":7209},"end":{"line":169,"column":8,"offset":7212},"indent":[]}}],"position":{"start":{"line":169,"column":1,"offset":7205},"end":{"line":169,"column":8,"offset":7212},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before you can run the web interface, you'll need to download and configure a webserver. We recommend to use Nginx, as it is a light-weight and fast webserver. The web interface is written in PHP, so we also need to download PHP and some packages. Update the packages and kernel.","position":{"start":{"line":171,"column":1,"offset":7214},"end":{"line":171,"column":280,"offset":7493},"indent":[]}}],"position":{"start":{"line":171,"column":1,"offset":7214},"end":{"line":171,"column":280,"offset":7493},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Install Nginx and PHP (+extensions).","position":{"start":{"line":173,"column":1,"offset":7495},"end":{"line":173,"column":37,"offset":7531},"indent":[]}}],"position":{"start":{"line":173,"column":1,"offset":7495},"end":{"line":173,"column":37,"offset":7531},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo apt-get install -y nginx php7.1 php7.1-curl php7.1-gd php7.1-fpm php7.1-cli php7.1-opcache php7.1-mbstring php7.1-xml php7.1-zip php7.1-mcrypt php7.1-readline","position":{"start":{"line":175,"column":1,"offset":7533},"end":{"line":177,"column":4,"offset":7706},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Creating a Nginx config.","position":{"start":{"line":179,"column":1,"offset":7708},"end":{"line":179,"column":25,"offset":7732},"indent":[]}}],"position":{"start":{"line":179,"column":1,"offset":7708},"end":{"line":179,"column":25,"offset":7732},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo rm -f /etc/nginx/sites-enabled/default\nsudo nano /etc/nginx/sites-enabled/kerberosio.conf","position":{"start":{"line":181,"column":1,"offset":7734},"end":{"line":184,"column":4,"offset":7838},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Copy and paste following config file; this file tells nginx where the web will be installed and that it requires PHP.","position":{"start":{"line":186,"column":1,"offset":7840},"end":{"line":186,"column":118,"offset":7957},"indent":[]}}],"position":{"start":{"line":186,"column":1,"offset":7840},"end":{"line":186,"column":118,"offset":7957},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"server\n{\n listen 80 default_server;\n listen [::]:80 default_server;\n root /var/www/web/public;\n server_name kerberos.rpi;\n index index.php index.html index.htm;\n location /\n {\n autoindex on;\n try_files $uri $uri/ /index.php?$query_string;\n }\n location ~ \\.php$\n {\n fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n}","position":{"start":{"line":188,"column":1,"offset":7959},"end":{"line":208,"column":4,"offset":8466},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Restart nginx","position":{"start":{"line":210,"column":1,"offset":8468},"end":{"line":210,"column":14,"offset":8481},"indent":[]}}],"position":{"start":{"line":210,"column":1,"offset":8468},"end":{"line":210,"column":14,"offset":8481},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo service nginx restart","position":{"start":{"line":212,"column":1,"offset":8483},"end":{"line":214,"column":4,"offset":8519},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Now we have installed all the dependencies, we can download the web interface source code.","position":{"start":{"line":216,"column":1,"offset":8521},"end":{"line":216,"column":91,"offset":8611},"indent":[]}}],"position":{"start":{"line":216,"column":1,"offset":8521},"end":{"line":216,"column":91,"offset":8611},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo mkdir -p /var/www/web && sudo chown www-data:www-data /var/www/web\ncd /var/www/web\nsudo -u www-data wget https://github.com/kerberos-io/web/releases/download/v2.8.0/web.tar.gz\nsudo -u www-data tar xvf web.tar.gz .\nsudo chown www-data -R storage bootstrap/cache config/kerberos.php\nsudo chmod -R 775 storage bootstrap/cache\nsudo chmod 0600 config/kerberos.php","position":{"start":{"line":218,"column":1,"offset":8613},"end":{"line":226,"column":4,"offset":8986},"indent":[1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Once everything is setup correctly, you should be able to browse towards the ip-address of your Raspberry Pi and see the Kerberos web interface.","position":{"start":{"line":228,"column":1,"offset":8988},"end":{"line":228,"column":145,"offset":9132},"indent":[]}}],"position":{"start":{"line":228,"column":1,"offset":8988},"end":{"line":228,"column":145,"offset":9132},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Auto removal","position":{"start":{"line":230,"column":5,"offset":9138},"end":{"line":230,"column":17,"offset":9150},"indent":[]}}],"position":{"start":{"line":230,"column":1,"offset":9134},"end":{"line":230,"column":17,"offset":9150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By default images or videos aren't removed automatically. This means that the Kerberos agent will keep writing to disk, even if there is no more space available on your SD card. When your SD card is full you'll be experiencing strange errors: a corrupt web interface, blank images or corrupt videos.","position":{"start":{"line":232,"column":1,"offset":9152},"end":{"line":232,"column":300,"offset":9451},"indent":[]}}],"position":{"start":{"line":232,"column":1,"offset":9152},"end":{"line":232,"column":300,"offset":9451},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To resolve this your should install a simple bash script and initiate a cronjob which continuously poll your filesystem, and start removing media when your disk is getting full.","position":{"start":{"line":234,"column":1,"offset":9453},"end":{"line":234,"column":178,"offset":9630},"indent":[]}}],"position":{"start":{"line":234,"column":1,"offset":9453},"end":{"line":234,"column":178,"offset":9630},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Create a bash script and copy following script.","position":{"start":{"line":236,"column":1,"offset":9632},"end":{"line":236,"column":48,"offset":9679},"indent":[]}}],"position":{"start":{"line":236,"column":1,"offset":9632},"end":{"line":236,"column":48,"offset":9679},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"nano /home/pi/autoremoval.sh","position":{"start":{"line":238,"column":1,"offset":9681},"end":{"line":240,"column":4,"offset":9721},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Copy following script (make sure the partition is correct, this is the default one for a Raspberry Pi).","position":{"start":{"line":242,"column":1,"offset":9723},"end":{"line":242,"column":104,"offset":9826},"indent":[]}}],"position":{"start":{"line":242,"column":1,"offset":9723},"end":{"line":242,"column":104,"offset":9826},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"partition=/dev/root\nimagedir=/etc/opt/kerberosio/capture/\nif [[ $(df -h | grep $partition | head -1 | awk -F' ' '{ print $5/1 }' | tr ['%'] [\"0\"]) -gt 90 ]];\nthen\n echo \"Cleaning disk\"\n find $imagedir -type f | sort | head -n 100 | xargs -r rm -rf;\nfi;","position":{"start":{"line":244,"column":1,"offset":9828},"end":{"line":252,"column":4,"offset":10098},"indent":[1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Make the script executable.","position":{"start":{"line":254,"column":1,"offset":10100},"end":{"line":254,"column":28,"offset":10127},"indent":[]}}],"position":{"start":{"line":254,"column":1,"offset":10100},"end":{"line":254,"column":28,"offset":10127},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"chmod +x /home/pi/autoremoval.sh","position":{"start":{"line":256,"column":1,"offset":10129},"end":{"line":258,"column":4,"offset":10173},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Initiate a cronjob, and select the nano editor.","position":{"start":{"line":260,"column":1,"offset":10175},"end":{"line":260,"column":48,"offset":10222},"indent":[]}}],"position":{"start":{"line":260,"column":1,"offset":10175},"end":{"line":260,"column":48,"offset":10222},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"crontab -e","position":{"start":{"line":262,"column":1,"offset":10224},"end":{"line":264,"column":4,"offset":10246},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Append following line, to execute the autoremoval.sh script every 5min.","position":{"start":{"line":266,"column":1,"offset":10248},"end":{"line":266,"column":72,"offset":10319},"indent":[]}}],"position":{"start":{"line":266,"column":1,"offset":10248},"end":{"line":266,"column":72,"offset":10319},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"*/5 * * * * /bin/bash /home/pi/autoremoval.sh","position":{"start":{"line":268,"column":1,"offset":10321},"end":{"line":270,"column":4,"offset":10378},"indent":[1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Docker","position":{"start":{"line":272,"column":4,"offset":10383},"end":{"line":272,"column":10,"offset":10389},"indent":[]}}],"position":{"start":{"line":272,"column":1,"offset":10380},"end":{"line":272,"column":10,"offset":10389},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A Docker image (x86, ARMv7, ARMv8) is available on the Docker Hub, which contains all the necessary software to setup the Kerberos agent in a matter of seconds. Before you can run this image, make sure you have Docker installed. Afterwards you can use docker, to get the Kerberos agent up and running. All docker images can be found on ","position":{"start":{"line":274,"column":1,"offset":10391},"end":{"line":274,"column":337,"offset":10727},"indent":[]}},{"type":"link","title":null,"url":"https://hub.docker.com/u/kerberos","children":[{"type":"text","value":"the Docker hub","position":{"start":{"line":274,"column":338,"offset":10728},"end":{"line":274,"column":352,"offset":10742},"indent":[]}}],"position":{"start":{"line":274,"column":337,"offset":10727},"end":{"line":274,"column":388,"offset":10778},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":274,"column":388,"offset":10778},"end":{"line":274,"column":389,"offset":10779},"indent":[]}}],"position":{"start":{"line":274,"column":1,"offset":10391},"end":{"line":274,"column":389,"offset":10779},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Prerequisites","position":{"start":{"line":276,"column":5,"offset":10785},"end":{"line":276,"column":18,"offset":10798},"indent":[]}}],"position":{"start":{"line":276,"column":1,"offset":10781},"end":{"line":276,"column":18,"offset":10798},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Docker or Docker Desktop (Linux, OS or Windows)","position":{"start":{"line":278,"column":3,"offset":10802},"end":{"line":278,"column":50,"offset":10849},"indent":[]}}],"position":{"start":{"line":278,"column":3,"offset":10802},"end":{"line":278,"column":50,"offset":10849},"indent":[]}}],"position":{"start":{"line":278,"column":1,"offset":10800},"end":{"line":278,"column":50,"offset":10849},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Github","position":{"start":{"line":280,"column":5,"offset":10855},"end":{"line":280,"column":11,"offset":10861},"indent":[]}}],"position":{"start":{"line":280,"column":1,"offset":10851},"end":{"line":280,"column":11,"offset":10861},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"All technical information, such as Dockerfile, can be found on ","position":{"start":{"line":282,"column":1,"offset":10863},"end":{"line":282,"column":64,"offset":10926},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/docker","children":[{"type":"text","value":"following Github repo","position":{"start":{"line":282,"column":65,"offset":10927},"end":{"line":282,"column":86,"offset":10948},"indent":[]}}],"position":{"start":{"line":282,"column":64,"offset":10926},"end":{"line":282,"column":126,"offset":10988},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":282,"column":126,"offset":10988},"end":{"line":282,"column":127,"offset":10989},"indent":[]}}],"position":{"start":{"line":282,"column":1,"offset":10863},"end":{"line":282,"column":127,"offset":10989},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Download docker image","position":{"start":{"line":284,"column":5,"offset":10995},"end":{"line":284,"column":26,"offset":11016},"indent":[]}}],"position":{"start":{"line":284,"column":1,"offset":10991},"end":{"line":284,"column":26,"offset":11016},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before you are able to run the Kerberos agent inside a container, you will need to pull the docker image from the Docker hub.","position":{"start":{"line":286,"column":1,"offset":11018},"end":{"line":286,"column":126,"offset":11143},"indent":[]}}],"position":{"start":{"line":286,"column":1,"offset":11018},"end":{"line":286,"column":126,"offset":11143},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"docker pull kerberos/kerberos","position":{"start":{"line":288,"column":1,"offset":11145},"end":{"line":290,"column":4,"offset":11184},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"When you pulled succesfully you can run your first Kerberos container as following. This will run Kerberos agent and expose the web interface on port 80, and the livestream on port 8889.","position":{"start":{"line":292,"column":1,"offset":11186},"end":{"line":292,"column":187,"offset":11372},"indent":[]}}],"position":{"start":{"line":292,"column":1,"offset":11186},"end":{"line":292,"column":187,"offset":11372},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"docker run --name camera1 -p 80:80 -p 8889:8889 -d kerberos/kerberos","position":{"start":{"line":294,"column":1,"offset":11374},"end":{"line":296,"column":4,"offset":11452},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"To add more containers, you can change the name parameter and assign another port to expose the web interface and livestream (ports are unique on a OS).","position":{"start":{"line":298,"column":1,"offset":11454},"end":{"line":298,"column":153,"offset":11606},"indent":[]}}],"position":{"start":{"line":298,"column":1,"offset":11454},"end":{"line":298,"column":153,"offset":11606},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"docker run --name camera2 -p 81:80 -p 8890:8889 -d kerberos/kerberos\ndocker run --name camera3 -p 82:80 -p 8891:8889 -d kerberos/kerberos","position":{"start":{"line":300,"column":1,"offset":11608},"end":{"line":303,"column":4,"offset":11755},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"When the containers are created, you can open your browser and browse to your different containers.","position":{"start":{"line":305,"column":1,"offset":11757},"end":{"line":305,"column":100,"offset":11856},"indent":[]}}],"position":{"start":{"line":305,"column":1,"offset":11757},"end":{"line":305,"column":100,"offset":11856},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"http://localhost:80\nhttp://localhost:81\nhttp://localhost:82","position":{"start":{"line":306,"column":1,"offset":11857},"end":{"line":310,"column":4,"offset":11926},"indent":[1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Volumes","position":{"start":{"line":312,"column":5,"offset":11932},"end":{"line":312,"column":12,"offset":11939},"indent":[]}}],"position":{"start":{"line":312,"column":1,"offset":11928},"end":{"line":312,"column":12,"offset":11939},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can assign volumes to the Kerberos container to for example","position":{"start":{"line":314,"column":1,"offset":11941},"end":{"line":314,"column":64,"offset":12004},"indent":[]}}],"position":{"start":{"line":314,"column":1,"offset":11941},"end":{"line":314,"column":64,"offset":12004},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"preload configuration,","position":{"start":{"line":315,"column":3,"offset":12007},"end":{"line":315,"column":25,"offset":12029},"indent":[]}}],"position":{"start":{"line":315,"column":3,"offset":12007},"end":{"line":315,"column":25,"offset":12029},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":12005},"end":{"line":315,"column":25,"offset":12029},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"or centralise the images/videos on your working station.","position":{"start":{"line":316,"column":3,"offset":12032},"end":{"line":316,"column":59,"offset":12088},"indent":[]}}],"position":{"start":{"line":316,"column":3,"offset":12032},"end":{"line":316,"column":59,"offset":12088},"indent":[]}}],"position":{"start":{"line":316,"column":1,"offset":12030},"end":{"line":316,"column":59,"offset":12088},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":12005},"end":{"line":316,"column":59,"offset":12088},"indent":[1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Generic","position":{"start":{"line":318,"column":4,"offset":12093},"end":{"line":318,"column":11,"offset":12100},"indent":[]}}],"position":{"start":{"line":318,"column":1,"offset":12090},"end":{"line":318,"column":11,"offset":12100},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to install the Kerberos agent from source on your working station or server, either for development or running the software, this is the preferred installation procedure. We are assuming that you use a Linux OS, when using Mac OSX the installation is slightly different.","position":{"start":{"line":320,"column":1,"offset":12102},"end":{"line":320,"column":283,"offset":12384},"indent":[]}}],"position":{"start":{"line":320,"column":1,"offset":12102},"end":{"line":320,"column":283,"offset":12384},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"This was tested on a Ubuntu VM (18.04.3 (LTS) x64).","position":{"start":{"line":322,"column":3,"offset":12388},"end":{"line":322,"column":54,"offset":12439},"indent":[]}}],"position":{"start":{"line":322,"column":3,"offset":12388},"end":{"line":322,"column":54,"offset":12439},"indent":[]}}],"position":{"start":{"line":322,"column":1,"offset":12386},"end":{"line":322,"column":54,"offset":12439},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":324,"column":5,"offset":12445},"end":{"line":324,"column":14,"offset":12454},"indent":[]}}],"position":{"start":{"line":324,"column":1,"offset":12441},"end":{"line":324,"column":14,"offset":12454},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Update the packages and kernel, and install some development tools.","position":{"start":{"line":326,"column":1,"offset":12456},"end":{"line":326,"column":68,"offset":12523},"indent":[]}}],"position":{"start":{"line":326,"column":1,"offset":12456},"end":{"line":326,"column":68,"offset":12523},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo apt-get -y update\nsudo apt-get install -y git cmake subversion dh-autoreconf libcurl4-openssl-dev yasm libx264-dev pkg-config libssl-dev","position":{"start":{"line":328,"column":1,"offset":12525},"end":{"line":331,"column":4,"offset":12676},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Install the FFmpeg library with x264 support.","position":{"start":{"line":333,"column":1,"offset":12678},"end":{"line":333,"column":46,"offset":12723},"indent":[]}}],"position":{"start":{"line":333,"column":1,"offset":12678},"end":{"line":333,"column":46,"offset":12723},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"It's recommended to install FFmpeg 3.1. Later versions might give issues at compilation or run time.","position":{"start":{"line":335,"column":3,"offset":12727},"end":{"line":335,"column":103,"offset":12827},"indent":[]}}],"position":{"start":{"line":335,"column":3,"offset":12727},"end":{"line":335,"column":103,"offset":12827},"indent":[]}}],"position":{"start":{"line":335,"column":1,"offset":12725},"end":{"line":335,"column":103,"offset":12827},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"git clone https://github.com/FFmpeg/FFmpeg ffmpeg\ncd ffmpeg && git checkout remotes/origin/release/3.1\n./configure --enable-gpl --enable-libx264 --enable-shared --prefix=/usr\nmake && sudo make install","position":{"start":{"line":337,"column":1,"offset":12829},"end":{"line":342,"column":4,"offset":13039},"indent":[1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Go to your home directory, or any place your prefer and pull the machinery from Github. Afterwards create a build directory and start the compilation.","position":{"start":{"line":344,"column":1,"offset":13041},"end":{"line":344,"column":151,"offset":13191},"indent":[]}}],"position":{"start":{"line":344,"column":1,"offset":13041},"end":{"line":344,"column":151,"offset":13191},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"You can change the ","position":{"start":{"line":346,"column":3,"offset":13195},"end":{"line":346,"column":22,"offset":13214},"indent":[]}},{"type":"inlineCode","value":"-j","position":{"start":{"line":346,"column":22,"offset":13214},"end":{"line":346,"column":26,"offset":13218},"indent":[]}},{"type":"text","value":" attribute of ","position":{"start":{"line":346,"column":26,"offset":13218},"end":{"line":346,"column":40,"offset":13232},"indent":[]}},{"type":"inlineCode","value":"make -j8","position":{"start":{"line":346,"column":40,"offset":13232},"end":{"line":346,"column":50,"offset":13242},"indent":[]}},{"type":"text","value":"to the number of cores of your compilation host.","position":{"start":{"line":346,"column":50,"offset":13242},"end":{"line":346,"column":98,"offset":13290},"indent":[]}}],"position":{"start":{"line":346,"column":3,"offset":13195},"end":{"line":346,"column":98,"offset":13290},"indent":[]}}],"position":{"start":{"line":346,"column":1,"offset":13193},"end":{"line":346,"column":98,"offset":13290},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"cd && git clone https://github.com/kerberos-io/machinery\ncd machinery && mkdir build && cd build\ncmake .. && make -j8 && make check && sudo make install","position":{"start":{"line":348,"column":1,"offset":13292},"end":{"line":352,"column":4,"offset":13454},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"After the machinery is build and installed succesfully, you can enable ","position":{"start":{"line":354,"column":1,"offset":13456},"end":{"line":354,"column":72,"offset":13527},"indent":[]}},{"type":"inlineCode","value":"kerberosio","position":{"start":{"line":354,"column":72,"offset":13527},"end":{"line":354,"column":84,"offset":13539},"indent":[]}},{"type":"text","value":" to start on boot.","position":{"start":{"line":354,"column":84,"offset":13539},"end":{"line":354,"column":102,"offset":13557},"indent":[]}}],"position":{"start":{"line":354,"column":1,"offset":13456},"end":{"line":354,"column":102,"offset":13557},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo systemctl enable kerberosio\nsudo systemctl start kerberosio","position":{"start":{"line":356,"column":1,"offset":13559},"end":{"line":359,"column":4,"offset":13633},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Web","position":{"start":{"line":361,"column":5,"offset":13639},"end":{"line":361,"column":8,"offset":13642},"indent":[]}}],"position":{"start":{"line":361,"column":1,"offset":13635},"end":{"line":361,"column":8,"offset":13642},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to install the web, you'll need to have a webserver (e.g. Nginx) and PHP running with some extensions. You'll also need NodeJS and npm installed, to install Bower.","position":{"start":{"line":363,"column":1,"offset":13644},"end":{"line":363,"column":176,"offset":13819},"indent":[]}}],"position":{"start":{"line":363,"column":1,"offset":13644},"end":{"line":363,"column":176,"offset":13819},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"cd ~\ncurl -sL https://deb.nodesource.com/setup_10.x | sudo bash -\nsudo apt-add-repository -y ppa:ondrej/php\nsudo apt-get -y update\nsudo apt-get install -y git php7.1-cli php7.1-gd php7.1-mcrypt php7.1-curl php7.1-mbstring php7.1-dom php7.1-zip php7.1-fpm nodejs\nsudo npm -g install bower","position":{"start":{"line":365,"column":1,"offset":13821},"end":{"line":372,"column":4,"offset":14118},"indent":[1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Next we'll need to install Nginx, and create a config file.","position":{"start":{"line":374,"column":1,"offset":14120},"end":{"line":374,"column":60,"offset":14179},"indent":[]}}],"position":{"start":{"line":374,"column":1,"offset":14120},"end":{"line":374,"column":60,"offset":14179},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo apt-get -y install nginx\nsudo rm -f /etc/nginx/sites-enabled/default\nsudo nano /etc/nginx/sites-enabled/default","position":{"start":{"line":376,"column":1,"offset":14181},"end":{"line":380,"column":4,"offset":14307},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Assign Nginx to our web interface (which we will soon create).","position":{"start":{"line":382,"column":1,"offset":14309},"end":{"line":382,"column":63,"offset":14371},"indent":[]}}],"position":{"start":{"line":382,"column":1,"offset":14309},"end":{"line":382,"column":63,"offset":14371},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"server\n{\n listen 80 default_server;\n listen [::]:80 default_server;\n root /var/www/web/public;\n server_name kerberos.rpi;\n index index.php index.html index.htm;\n location /\n {\n autoindex on;\n try_files $uri $uri/ /index.php?$query_string;\n }\n location ~ \\.php$\n {\n fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n}","position":{"start":{"line":384,"column":1,"offset":14373},"end":{"line":404,"column":4,"offset":14880},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Now we have all the dependencies installed we can clone the web repository to our working station.","position":{"start":{"line":406,"column":1,"offset":14882},"end":{"line":406,"column":99,"offset":14980},"indent":[]}}],"position":{"start":{"line":406,"column":1,"offset":14882},"end":{"line":406,"column":99,"offset":14980},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"mkdir -p /var/www\ncd /var/www && sudo git clone https://github.com/kerberos-io/web && cd web","position":{"start":{"line":408,"column":1,"offset":14982},"end":{"line":411,"column":4,"offset":15084},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Install the PHP dependency manager, ","position":{"start":{"line":413,"column":1,"offset":15086},"end":{"line":413,"column":37,"offset":15122},"indent":[]}},{"type":"inlineCode","value":"composer","position":{"start":{"line":413,"column":37,"offset":15122},"end":{"line":413,"column":47,"offset":15132},"indent":[]}},{"type":"text","value":", the install all the needed dependencies.","position":{"start":{"line":413,"column":47,"offset":15132},"end":{"line":413,"column":89,"offset":15174},"indent":[]}}],"position":{"start":{"line":413,"column":1,"offset":15086},"end":{"line":413,"column":89,"offset":15174},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"curl -sS https://getcomposer.org/installer | sudo php\nsudo mv composer.phar /usr/bin/composer\nsudo composer install","position":{"start":{"line":415,"column":1,"offset":15176},"end":{"line":419,"column":4,"offset":15301},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Change some permissions, to make sure we can write logging and caching files.","position":{"start":{"line":421,"column":1,"offset":15303},"end":{"line":421,"column":78,"offset":15380},"indent":[]}}],"position":{"start":{"line":421,"column":1,"offset":15303},"end":{"line":421,"column":78,"offset":15380},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo chmod -R 777 storage\nsudo chmod -R 777 bootstrap/cache\nsudo chmod 777 config/kerberos.php","position":{"start":{"line":423,"column":1,"offset":15382},"end":{"line":427,"column":4,"offset":15486},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"We will need to install a couple of more JavaScript libraries using bower.","position":{"start":{"line":429,"column":1,"offset":15488},"end":{"line":429,"column":75,"offset":15562},"indent":[]}}],"position":{"start":{"line":429,"column":1,"offset":15488},"end":{"line":429,"column":75,"offset":15562},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"cd public\nsudo bower --allow-root install\nservice nginx restart","position":{"start":{"line":431,"column":1,"offset":15564},"end":{"line":435,"column":4,"offset":15637},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Once everything is setup correctly, you should be able to browse towards the ip-address of your Raspberry Pi and see the Kerberos web interface.","position":{"start":{"line":437,"column":1,"offset":15639},"end":{"line":437,"column":145,"offset":15783},"indent":[]}}],"position":{"start":{"line":437,"column":1,"offset":15639},"end":{"line":437,"column":145,"offset":15783},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Auto removal","position":{"start":{"line":439,"column":5,"offset":15789},"end":{"line":439,"column":17,"offset":15801},"indent":[]}}],"position":{"start":{"line":439,"column":1,"offset":15785},"end":{"line":439,"column":17,"offset":15801},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By default images or videos aren't removed automatically. This means that the Kerberos agent will keep writing to disk, even if there is no more space available on your SD card. When your SD card is full you'll be experiencing strange errors: a corrupt web interface, blank images or corrupt videos.","position":{"start":{"line":441,"column":1,"offset":15803},"end":{"line":441,"column":300,"offset":16102},"indent":[]}}],"position":{"start":{"line":441,"column":1,"offset":15803},"end":{"line":441,"column":300,"offset":16102},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To resolve this your should install a simple bash script and initiate a cronjob which continuously poll your filesystem, and start removing media when your disk is getting full.","position":{"start":{"line":443,"column":1,"offset":16104},"end":{"line":443,"column":178,"offset":16281},"indent":[]}}],"position":{"start":{"line":443,"column":1,"offset":16104},"end":{"line":443,"column":178,"offset":16281},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Create a bash script and copy following script.","position":{"start":{"line":445,"column":1,"offset":16283},"end":{"line":445,"column":48,"offset":16330},"indent":[]}}],"position":{"start":{"line":445,"column":1,"offset":16283},"end":{"line":445,"column":48,"offset":16330},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"nano /home/[user]/autoremoval.sh","position":{"start":{"line":447,"column":1,"offset":16332},"end":{"line":449,"column":4,"offset":16376},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Copy following script (make sure the partition is correct, this is the default one for a Raspberry Pi).","position":{"start":{"line":451,"column":1,"offset":16378},"end":{"line":451,"column":104,"offset":16481},"indent":[]}}],"position":{"start":{"line":451,"column":1,"offset":16378},"end":{"line":451,"column":104,"offset":16481},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"partition=/dev/root\nimagedir=/etc/opt/kerberosio/capture/\nif [[ $(df -h | grep $partition | head -1 | awk -F' ' '{ print $5/1 }' | tr ['%'] [\"0\"]) -gt 90 ]];\nthen\n echo \"Cleaning disk\"\n find $imagedir -type f | sort | head -n 100 | xargs -r rm -rf;\nfi;","position":{"start":{"line":453,"column":1,"offset":16483},"end":{"line":461,"column":4,"offset":16753},"indent":[1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Make the script executable.","position":{"start":{"line":463,"column":1,"offset":16755},"end":{"line":463,"column":28,"offset":16782},"indent":[]}}],"position":{"start":{"line":463,"column":1,"offset":16755},"end":{"line":463,"column":28,"offset":16782},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"chmod +x /home/[user]/autoremoval.sh","position":{"start":{"line":465,"column":1,"offset":16784},"end":{"line":467,"column":4,"offset":16832},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Initiate a cronjob, and select the nano editor.","position":{"start":{"line":469,"column":1,"offset":16834},"end":{"line":469,"column":48,"offset":16881},"indent":[]}}],"position":{"start":{"line":469,"column":1,"offset":16834},"end":{"line":469,"column":48,"offset":16881},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"crontab -e","position":{"start":{"line":471,"column":1,"offset":16883},"end":{"line":473,"column":4,"offset":16905},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Append following line, to execute the autoremoval.sh script every 5min.","position":{"start":{"line":475,"column":1,"offset":16907},"end":{"line":475,"column":72,"offset":16978},"indent":[]}}],"position":{"start":{"line":475,"column":1,"offset":16907},"end":{"line":475,"column":72,"offset":16978},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"*/5 * * * * /bin/bash /home/[user]/autoremoval.sh","position":{"start":{"line":477,"column":1,"offset":16980},"end":{"line":479,"column":4,"offset":17041},"indent":[1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":482,"column":1,"offset":17044},"end":{"line":482,"column":31,"offset":17074},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":482,"column":31,"offset":17074}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Installation`}

\n

{`Kerberos Open Source comes with different installation flavours. So you might think, why? The reason is simple, depending on the use case one option is better than another. A short list of recommendations:`}

\n
    \n
  1. {`KiOS`}{`: You have a Raspberry Pi, and you only want to run a Kerberos agent on it.`}
  2. \n
  3. {`Raspbian`}{`: You have a Raspberry Pi, but you want other services running next to the Kerberos agent.`}
  4. \n
  5. {`Docker`}{`: You have a lot of IP cameras, and/or don't want to mess with dependencies.`}
  6. \n
  7. {`Generic`}{`: You want to develop/extend Kerberos with your own features, or you want to run a Kerberos agent on a not supported OS/architecure.`}
  8. \n
\n

{`KiOS`}

\n

{`KiOS (Kerberos Operating System) is our custom linux OS, which runs the Kerberos agent out-of-the-box (read plug-and-play). It's an OS designed for the Raspberry Pi (all version are supported), which you can flash to an SD card.`}

\n

{`It can be installed using our own installer, which comes with a nice interface that handles the flashing and network configuration for you, or you can handle the flashing yourself by using Etcher.`}

\n

{`Github`}

\n

{`KiOS is compiled using Buildroot, the project can be found on `}{`following Github repo`}{`.`}

\n

{`Kerberos installer`}

\n

{`Installing the Kerberos agent to your Raspberry Pi, has never been so easy. By using our cross-platform installer, you can run a fully configured video surveillance system within 3 minutes. Indeed, we also think that's awesome!`}

\n

\"access

\n

{`Download the correct installer for your OS below:`}

\n
\n

{`https://github.com/kerberos-io/etcher/releases`}

\n
\n

{`Etcher`}

\n

{`If you love Etcher, or the Kerberos installer is not working as expected, you can also flash the Kerberos agent to your SD card manually. It goes as following:`}

\n
    \n
  1. {`Download `}{`the KiOS image`}{`,`}
  2. \n
  3. {`flash it to your SD card with Etcher,`}
  4. \n
  5. {`and edit some configuration files at the boot directory.`}
  6. \n
\n

\"use

\n

{`Once you have download the KiOS image (make sure you downloaded the right image) and flashed it to an SD card, put it back into your working station. Navigate to the SD card and creating following files.`}

\n

{`Connecting to WiFi`}

\n

{`If you want to connect your Raspberry Pi to a WiFi connection, you will need to create a file `}{`wireless.conf`}{` on your SD card, with following contents. Change the SSID and password properties to your own WiFi credentials.`}

\n
{`update_config`}{`=`}{`1`}{`\n`}{`ctrl_interface`}{`=/`}{`var`}{`/`}{`run`}{`/wpa_supplicant`}{`\n`}{`network`}{`={`}{`\n`}{`  `}{`scan_ssid`}{`=`}{`1`}{`\n`}{`  `}{`ssid`}{`=`}{`\"\"`}{`\n`}{`  `}{`psk`}{`=`}{`\"\"`}{`\n`}{`}`}
\n

{`Setup a static IP-address`}

\n

{`If you want to assign a static ip-address to your Raspberry Pi, create a file `}{`static_ip.conf`}{` on your SD card, with following contents:`}

\n
{`#####################################################################`}{`\n`}{`# `}{`Enter`}{` `}{`the`}{` `}{`IP`}{`-`}{`address`}{` `}{`you`}{` `}{`want`}{` `}{`to`}{` `}{`have`}{`, `}{`followed`}{` `}{`by`}{` `}{`the`}{` `}{`subnet`}{` `}{`mask`}{`\n`}{`# `}{`e`}{`.`}{`g`}{`. `}{`192.168`}{`.`}{`0.10`}{`/`}{`24`}{`\n`}{`static_ip`}{`=`}{`\"\"`}{`\n`}{`#####################################################################`}{`\n`}{`# `}{`Enter`}{` `}{`the`}{` `}{`Gateway`}{` `}{`and`}{` `}{`DNS`}{`, `}{`this`}{` `}{`will`}{` `}{`be`}{` `}{`your`}{` `}{`router`}{` `}{`in`}{` `}{`most`}{` `}{`cases`}{`\n`}{`# `}{`e`}{`.`}{`g`}{`. `}{`192.168`}{`.`}{`0.1`}{`\n`}{`static_gw`}{`=`}{`\"\"`}{`\n`}{`static_dns`}{`=`}{`\"\"`}
\n

{`Power on the Raspberry Pi`}

\n

{`Once you've finished the installation using either the KiOS installer or Etcher, you can put the SD card into your Raspberry Pi and turn it on. Please note that the first time you boot KiOS it can take about 2 mins before the system is operational. When KiOS is ready you can open your favorite browser and type in the IP address of your Raspberry Pi. This will open the Kerberos agent's front-end, which you can access with the username: root and password: root.`}

\n

\"access

\n

{`Access the Raspberry Pi`}

\n

{`You can access the KiOS system with attaching your Raspberry Pi to a HDMI monitor or by using `}{`ssh`}{`.`}

\n
{`Cedrics`}{`-`}{`Mac`}{`-mini:`}{`build`}{` `}{`cedricverst$`}{` `}{`ssh`}{` `}{`root`}{`@`}{`192.168`}{`.`}{`0.12`}{`\n`}{`Welcome`}{` `}{`to`}{` `}{`kios`}{`-79`}{`e30bbb`}{`!`}{`\n`}{`[`}{`root`}{`@`}{`kios`}{`-79`}{`e30bbb`}{` ~]#`}
\n

{`Note that by default no root password is set, you can define a password in the `}{`/data/etc/kios.conf`}{` file. Once you added a password, make sure to reboot the OS.`}

\n
{`[`}{`root`}{`@`}{`kios`}{`-79`}{`e30bbb`}{` ~]# `}{`nano`}{` /`}{`data`}{`/`}{`etc`}{`/`}{`kios`}{`.`}{`conf`}{`\n`}{`[`}{`root`}{`@`}{`kios`}{`-79`}{`e30bbb`}{` ~]# `}{`reboot`}
\n

{`Raspbian`}

\n

{`If you have already an OS (e.g. Raspbian Buster) flashed to your Raspberry Pi, then it makes sense to install the Kerberos agent on top of your existing OS. There are two ways to achieve this:`}

\n
    \n
  1. {`Install the Kerberos agent using Docker (more info below),`}
  2. \n
  3. {`or you can install the Kerberos agent manually (machinery + web).`}
  4. \n
\n

{`This section will focus on option 2, and will show you how to install the Kerberos agent manually.`}

\n

{`Update OS`}

\n

{`Let's start with updating the OS, and installing a couple of packages.`}

\n
\n

{`We have tested the Raspbian installation on `}{`Raspbian GNU/Linux 10 (buster)`}{`. It might be that if you have a different version of Raspbian, you will need to install additional/different packages.`}

\n
\n
{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`update`}{` && `}{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`install`}{` -`}{`y`}{` `}{`ffmpeg`}
\n

{`Machinery`}

\n

{`Download the debian file from the machinery repository.`}

\n
\n

{`https://github.com/kerberos-io/machinery/releases`}

\n
\n

{`A `}{`.deb`}{` file is available for every version of the Raspberry Pi. For example if you are using a Raspberry Pi 4 for version 2.8.0, execute following command. You can change the version and Raspberry Pi board to your needs.`}

\n
\n

{`Please make sure you pick the right board (rpi, rpi2, rpi3 or rpi4), and choose the version you want (e.g. 2.8.0). Replace below url, with your preferences.`}

\n
\n
{`wget`}{` https:`}{`//github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-machinery-kerberosio-armhf-2.8.0.deb`}{`\n`}{`sudo`}{` `}{`dpkg`}{` -`}{`i`}{` `}{`rpi4`}{`-`}{`machinery`}{`-`}{`kerberosio`}{`-`}{`armhf`}{`-`}{`2.8`}{`.0.`}{`deb`}
\n

{`Download the x265 library (version 160) from the machinery repository, as Raspbian Buster 10 only ships with version 165. Make sure you select the right board.`}

\n
\n

{`v2.8.0/rpi4-libx265.so.160`}{` this will download the libx265 shared library for the Raspberry Pi 4.`}

\n
\n
{`wget`}{` https:`}{`//github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-libx265.so.160`}{`\n`}{`sudo`}{` `}{`mv`}{` `}{`rpi4`}{`-`}{`libx265`}{`.`}{`so`}{`.`}{`160`}{` /`}{`usr`}{`/`}{`lib`}{`/`}{`arm`}{`-`}{`linux`}{`-`}{`gnueabihf`}{`/`}{`libx265`}{`.`}{`so`}{`.`}{`160`}
\n

{`Same applies for the libx264 library, download the right shared library.`}

\n
\n

{`v2.8.0/rpi4-libx264.so.148`}{` this will download the libx264 shared library for the Raspberry Pi 4.`}

\n
\n
{`wget`}{` https:`}{`//github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-libx264.so.148`}{`\n`}{`sudo`}{` `}{`mv`}{` `}{`rpi4`}{`-`}{`libx264`}{`.`}{`so`}{`.`}{`148`}{` /`}{`usr`}{`/`}{`lib`}{`/`}{`arm`}{`-`}{`linux`}{`-`}{`gnueabihf`}{`/`}{`libx264`}{`.`}{`so`}{`.`}{`148`}
\n

{`If you wish to use the Raspberry Pi Camera Module, make sure `}{`to enable it`}{` using `}{`sudo raspi-config`}{`.`}

\n
{`sudo`}{` `}{`raspi`}{`-`}{`config`}
\n

{`Enable machinery to start on boot, and start the service.`}

\n
{`sudo systemctl enable kerberosio`}{`\n`}{`sudo service kerberosio start`}
\n

{`Web`}

\n

{`Before you can run the web interface, you'll need to download and configure a webserver. We recommend to use Nginx, as it is a light-weight and fast webserver. The web interface is written in PHP, so we also need to download PHP and some packages. Update the packages and kernel.`}

\n

{`Install Nginx and PHP (+extensions).`}

\n
{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`install`}{` -`}{`y`}{` `}{`nginx`}{` `}{`php7`}{`.`}{`1`}{` `}{`php7`}{`.`}{`1`}{`-`}{`curl`}{` `}{`php7`}{`.`}{`1`}{`-`}{`gd`}{` `}{`php7`}{`.`}{`1`}{`-`}{`fpm`}{` `}{`php7`}{`.`}{`1`}{`-`}{`cli`}{` `}{`php7`}{`.`}{`1`}{`-`}{`opcache`}{` `}{`php7`}{`.`}{`1`}{`-`}{`mbstring`}{` `}{`php7`}{`.`}{`1`}{`-`}{`xml`}{` `}{`php7`}{`.`}{`1`}{`-`}{`zip`}{` `}{`php7`}{`.`}{`1`}{`-`}{`mcrypt`}{` `}{`php7`}{`.`}{`1`}{`-`}{`readline`}
\n

{`Creating a Nginx config.`}

\n
{`sudo`}{` `}{`rm`}{` -`}{`f`}{` /`}{`etc`}{`/`}{`nginx`}{`/`}{`sites`}{`-`}{`enabled`}{`/`}{`default`}{`\n`}{`sudo`}{` `}{`nano`}{` /`}{`etc`}{`/`}{`nginx`}{`/`}{`sites`}{`-`}{`enabled`}{`/`}{`kerberosio`}{`.`}{`conf`}
\n

{`Copy and paste following config file; this file tells nginx where the web will be installed and that it requires PHP.`}

\n
{`server`}{`\n`}{`{`}{`\n`}{`    `}{`listen`}{` `}{`80`}{` `}{`default_server`}{`;`}{`\n`}{`    `}{`listen`}{` [::]:`}{`80`}{` `}{`default_server`}{`;`}{`\n`}{`    `}{`root`}{` /`}{`var`}{`/`}{`www`}{`/web/public;`}{`\n`}{`    `}{`server_name`}{` `}{`kerberos`}{`.`}{`rpi`}{`;`}{`\n`}{`    `}{`index`}{` `}{`index`}{`.`}{`php`}{` `}{`index`}{`.`}{`html`}{` `}{`index`}{`.`}{`htm`}{`;`}{`\n`}{`    `}{`location`}{` /`}{`\n`}{`    {`}{`\n`}{`            `}{`autoindex`}{` `}{`on`}{`;`}{`\n`}{`            `}{`try_files`}{` `}{`$uri`}{` `}{`$uri`}{`/ /`}{`index`}{`.`}{`php`}{`?`}{`$query_string`}{`;`}{`\n`}{`    }`}{`\n`}{`    `}{`location`}{` ~ \\\\.`}{`php$`}{`\n`}{`    {`}{`\n`}{`            fastcgi_pass `}{`unix:`}{`/`}{`var`}{`/`}{`run`}{`/`}{`php`}{`/`}{`php7`}{`.`}{`1`}{`-`}{`fpm`}{`.`}{`sock`}{`;`}{`\n`}{`            `}{`fastcgi_param`}{` `}{`SCRIPT_FILENAME`}{` `}{`$document_root$fastcgi_script_name`}{`;`}{`\n`}{`            `}{`include`}{` `}{`fastcgi_params`}{`;`}{`\n`}{`    }`}{`\n`}{`}`}
\n

{`Restart nginx`}

\n
{`sudo`}{` `}{`service`}{` `}{`nginx`}{` `}{`restart`}
\n

{`Now we have installed all the dependencies, we can download the web interface source code.`}

\n
{`sudo`}{` `}{`mkdir`}{` -`}{`p`}{` /`}{`var`}{`/`}{`www`}{`/web && sudo chown www-data:`}{`www`}{`-`}{`data`}{` /`}{`var`}{`/`}{`www`}{`/`}{`web`}{`\n`}{`cd`}{` /`}{`var`}{`/`}{`www`}{`/web`}{`\n`}{`sudo`}{` -`}{`u`}{` `}{`www`}{`-`}{`data`}{` `}{`wget`}{` https:`}{`//github.com/kerberos-io/web/releases/download/v2.8.0/web.tar.gz`}{`\n`}{`sudo`}{` -`}{`u`}{` `}{`www`}{`-`}{`data`}{` `}{`tar`}{` `}{`xvf`}{` `}{`web`}{`.`}{`tar`}{`.`}{`gz`}{` .`}{`\n`}{`sudo`}{` `}{`chown`}{` `}{`www`}{`-`}{`data`}{` -`}{`R`}{` `}{`storage`}{` `}{`bootstrap`}{`/`}{`cache`}{` `}{`config`}{`/`}{`kerberos`}{`.`}{`php`}{`\n`}{`sudo`}{` `}{`chmod`}{` -`}{`R`}{` `}{`775`}{` `}{`storage`}{` `}{`bootstrap`}{`/`}{`cache`}{`\n`}{`sudo`}{` `}{`chmod`}{` `}{`0600`}{` `}{`config`}{`/`}{`kerberos`}{`.`}{`php`}
\n

{`Once everything is setup correctly, you should be able to browse towards the ip-address of your Raspberry Pi and see the Kerberos web interface.`}

\n

{`Auto removal`}

\n

{`By default images or videos aren't removed automatically. This means that the Kerberos agent will keep writing to disk, even if there is no more space available on your SD card. When your SD card is full you'll be experiencing strange errors: a corrupt web interface, blank images or corrupt videos.`}

\n

{`To resolve this your should install a simple bash script and initiate a cronjob which continuously poll your filesystem, and start removing media when your disk is getting full.`}

\n

{`Create a bash script and copy following script.`}

\n
{`nano /home/pi/autoremoval.sh`}
\n

{`Copy following script (make sure the partition is correct, this is the default one for a Raspberry Pi).`}

\n
{`partition=/dev/root`}{`\n`}{`imagedir=/etc/opt/kerberosio/capture/`}{`\n`}{`if`}{` [[ `}{`$(df -h `}{`|`}{` grep `}{`$partition`}{` `}{`|`}{` head -1 `}{`|`}{` awk -F' ' '{ print $5/1 }' `}{`|`}{` tr ['%'] [\"0\"])`}{` -gt 90 ]];`}{`\n`}{`then`}{`\n`}{`    `}{`echo`}{` `}{`\"Cleaning disk\"`}{`\n`}{`    find `}{`$imagedir`}{` -type f | sort | head -n 100 | xargs -r rm -rf;`}{`\n`}{`fi`}{`;`}
\n

{`Make the script executable.`}

\n
{`chmod +x /home/pi/autoremoval.sh`}
\n

{`Initiate a cronjob, and select the nano editor.`}

\n
{`crontab -e`}
\n

{`Append following line, to execute the autoremoval.sh script every 5min.`}

\n
{`*/5 * * * * /bin/bash /home/pi/autoremoval.sh`}
\n

{`Docker`}

\n

{`A Docker image (x86, ARMv7, ARMv8) is available on the Docker Hub, which contains all the necessary software to setup the Kerberos agent in a matter of seconds. Before you can run this image, make sure you have Docker installed. Afterwards you can use docker, to get the Kerberos agent up and running. All docker images can be found on `}{`the Docker hub`}{`.`}

\n

{`Prerequisites`}

\n
\n

{`Docker or Docker Desktop (Linux, OS or Windows)`}

\n
\n

{`Github`}

\n

{`All technical information, such as Dockerfile, can be found on `}{`following Github repo`}{`.`}

\n

{`Download docker image`}

\n

{`Before you are able to run the Kerberos agent inside a container, you will need to pull the docker image from the Docker hub.`}

\n
{`docker`}{` `}{`pull`}{` `}{`kerberos`}{`/`}{`kerberos`}
\n

{`When you pulled succesfully you can run your first Kerberos container as following. This will run Kerberos agent and expose the web interface on port 80, and the livestream on port 8889.`}

\n
{`docker`}{` `}{`run`}{` --`}{`name`}{` `}{`camera1`}{` -`}{`p`}{` `}{`80`}{`:`}{`80`}{` -`}{`p`}{` `}{`8889`}{`:`}{`8889`}{` -`}{`d`}{` `}{`kerberos`}{`/`}{`kerberos`}
\n

{`To add more containers, you can change the name parameter and assign another port to expose the web interface and livestream (ports are unique on a OS).`}

\n
{`docker`}{` `}{`run`}{` --`}{`name`}{` `}{`camera2`}{` -`}{`p`}{` `}{`81`}{`:`}{`80`}{` -`}{`p`}{` `}{`8890`}{`:`}{`8889`}{` -`}{`d`}{` `}{`kerberos`}{`/`}{`kerberos`}{`\n`}{`docker`}{` `}{`run`}{` --`}{`name`}{` `}{`camera3`}{` -`}{`p`}{` `}{`82`}{`:`}{`80`}{` -`}{`p`}{` `}{`8891`}{`:`}{`8889`}{` -`}{`d`}{` `}{`kerberos`}{`/`}{`kerberos`}
\n

{`When the containers are created, you can open your browser and browse to your different containers.`}

\n
{`http:`}{`//localhost:80`}{`\n`}{`http:`}{`//localhost:81`}{`\n`}{`http:`}{`//localhost:82`}
\n

{`Volumes`}

\n

{`You can assign volumes to the Kerberos container to for example`}

\n
    \n
  • {`preload configuration,`}
  • \n
  • {`or centralise the images/videos on your working station.`}
  • \n
\n

{`Generic`}

\n

{`If you want to install the Kerberos agent from source on your working station or server, either for development or running the software, this is the preferred installation procedure. We are assuming that you use a Linux OS, when using Mac OSX the installation is slightly different.`}

\n
\n

{`This was tested on a Ubuntu VM (18.04.3 (LTS) x64).`}

\n
\n

{`Machinery`}

\n

{`Update the packages and kernel, and install some development tools.`}

\n
{`sudo`}{` `}{`apt`}{`-`}{`get`}{` -`}{`y`}{` `}{`update`}{`\n`}{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`install`}{` -`}{`y`}{` `}{`git`}{` `}{`cmake`}{` `}{`subversion`}{` `}{`dh`}{`-`}{`autoreconf`}{` `}{`libcurl4`}{`-`}{`openssl`}{`-`}{`dev`}{` `}{`yasm`}{` `}{`libx264`}{`-`}{`dev`}{` `}{`pkg`}{`-`}{`config`}{` `}{`libssl`}{`-`}{`dev`}
\n

{`Install the FFmpeg library with x264 support.`}

\n
\n

{`It's recommended to install FFmpeg 3.1. Later versions might give issues at compilation or run time.`}

\n
\n
{`git`}{` `}{`clone`}{` https:`}{`//github.com/FFmpeg/FFmpeg ffmpeg`}{`\n`}{`cd`}{` `}{`ffmpeg`}{` && `}{`git`}{` `}{`checkout`}{` `}{`remotes`}{`/`}{`origin`}{`/`}{`release`}{`/`}{`3.1`}{`\n`}{`./`}{`configure`}{` --`}{`enable`}{`-`}{`gpl`}{` --`}{`enable`}{`-`}{`libx264`}{` --`}{`enable`}{`-`}{`shared`}{` --`}{`prefix`}{`=/`}{`usr`}{`\n`}{`make`}{` && `}{`sudo`}{` `}{`make`}{` `}{`install`}
\n

{`Go to your home directory, or any place your prefer and pull the machinery from Github. Afterwards create a build directory and start the compilation.`}

\n
\n

{`You can change the `}{`-j`}{` attribute of `}{`make -j8`}{`to the number of cores of your compilation host.`}

\n
\n
{`cd`}{` && `}{`git`}{` `}{`clone`}{` https:`}{`//github.com/kerberos-io/machinery`}{`\n`}{`cd`}{` `}{`machinery`}{` && `}{`mkdir`}{` `}{`build`}{` && `}{`cd`}{` `}{`build`}{`\n`}{`cmake`}{` .. && `}{`make`}{` -`}{`j8`}{` && `}{`make`}{` `}{`check`}{` && `}{`sudo`}{` `}{`make`}{` `}{`install`}
\n

{`After the machinery is build and installed succesfully, you can enable `}{`kerberosio`}{` to start on boot.`}

\n
{`sudo`}{` `}{`systemctl`}{` `}{`enable`}{` `}{`kerberosio`}{`\n`}{`sudo`}{` `}{`systemctl`}{` `}{`start`}{` `}{`kerberosio`}
\n

{`Web`}

\n

{`If you want to install the web, you'll need to have a webserver (e.g. Nginx) and PHP running with some extensions. You'll also need NodeJS and npm installed, to install Bower.`}

\n
{`cd`}{` ~`}{`\n`}{`curl`}{` -`}{`sL`}{` https:`}{`//deb.nodesource.com/setup_10.x | sudo bash -`}{`\n`}{`sudo`}{` `}{`apt`}{`-`}{`add`}{`-`}{`repository`}{` -`}{`y`}{` ppa:`}{`ondrej`}{`/`}{`php`}{`\n`}{`sudo`}{` `}{`apt`}{`-`}{`get`}{` -`}{`y`}{` `}{`update`}{`\n`}{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`install`}{` -`}{`y`}{` `}{`git`}{` `}{`php7`}{`.`}{`1`}{`-`}{`cli`}{` `}{`php7`}{`.`}{`1`}{`-`}{`gd`}{` `}{`php7`}{`.`}{`1`}{`-`}{`mcrypt`}{` `}{`php7`}{`.`}{`1`}{`-`}{`curl`}{` `}{`php7`}{`.`}{`1`}{`-`}{`mbstring`}{` `}{`php7`}{`.`}{`1`}{`-`}{`dom`}{` `}{`php7`}{`.`}{`1`}{`-`}{`zip`}{` `}{`php7`}{`.`}{`1`}{`-`}{`fpm`}{` `}{`nodejs`}{`\n`}{`sudo`}{` `}{`npm`}{` -`}{`g`}{` `}{`install`}{` `}{`bower`}
\n

{`Next we'll need to install Nginx, and create a config file.`}

\n
{`sudo`}{` `}{`apt`}{`-`}{`get`}{` -`}{`y`}{` `}{`install`}{` `}{`nginx`}{`\n`}{`sudo`}{` `}{`rm`}{` -`}{`f`}{` /`}{`etc`}{`/`}{`nginx`}{`/`}{`sites`}{`-`}{`enabled`}{`/`}{`default`}{`\n`}{`sudo`}{` `}{`nano`}{` /`}{`etc`}{`/`}{`nginx`}{`/`}{`sites`}{`-`}{`enabled`}{`/`}{`default`}
\n

{`Assign Nginx to our web interface (which we will soon create).`}

\n
{`server`}{`\n`}{`{`}{`\n`}{`    `}{`listen`}{` `}{`80`}{` `}{`default_server`}{`;`}{`\n`}{`    `}{`listen`}{` [::]:`}{`80`}{` `}{`default_server`}{`;`}{`\n`}{`    `}{`root`}{` /`}{`var`}{`/`}{`www`}{`/web/public;`}{`\n`}{`    `}{`server_name`}{` `}{`kerberos`}{`.`}{`rpi`}{`;`}{`\n`}{`    `}{`index`}{` `}{`index`}{`.`}{`php`}{` `}{`index`}{`.`}{`html`}{` `}{`index`}{`.`}{`htm`}{`;`}{`\n`}{`    `}{`location`}{` /`}{`\n`}{`    {`}{`\n`}{`            `}{`autoindex`}{` `}{`on`}{`;`}{`\n`}{`            `}{`try_files`}{` `}{`$uri`}{` `}{`$uri`}{`/ /`}{`index`}{`.`}{`php`}{`?`}{`$query_string`}{`;`}{`\n`}{`    }`}{`\n`}{`    `}{`location`}{` ~ \\\\.`}{`php$`}{`\n`}{`    {`}{`\n`}{`            fastcgi_pass `}{`unix:`}{`/`}{`var`}{`/`}{`run`}{`/`}{`php`}{`/`}{`php7`}{`.`}{`1`}{`-`}{`fpm`}{`.`}{`sock`}{`;`}{`\n`}{`            `}{`fastcgi_param`}{` `}{`SCRIPT_FILENAME`}{` `}{`$document_root$fastcgi_script_name`}{`;`}{`\n`}{`            `}{`include`}{` `}{`fastcgi_params`}{`;`}{`\n`}{`    }`}{`\n`}{`}`}
\n

{`Now we have all the dependencies installed we can clone the web repository to our working station.`}

\n
{`mkdir`}{` -`}{`p`}{` /`}{`var`}{`/`}{`www`}{`\n`}{`cd`}{` /`}{`var`}{`/`}{`www`}{` && sudo git clone https:`}{`//github.com/kerberos-io/web && cd web`}
\n

{`Install the PHP dependency manager, `}{`composer`}{`, the install all the needed dependencies.`}

\n
{`curl`}{` -`}{`sS`}{` https:`}{`//getcomposer.org/installer | sudo php`}{`\n`}{`sudo`}{` `}{`mv`}{` `}{`composer`}{`.`}{`phar`}{` /`}{`usr`}{`/`}{`bin`}{`/`}{`composer`}{`\n`}{`sudo`}{` `}{`composer`}{` `}{`install`}
\n

{`Change some permissions, to make sure we can write logging and caching files.`}

\n
{`sudo`}{` `}{`chmod`}{` -`}{`R`}{` `}{`777`}{` `}{`storage`}{`\n`}{`sudo`}{` `}{`chmod`}{` -`}{`R`}{` `}{`777`}{` `}{`bootstrap`}{`/`}{`cache`}{`\n`}{`sudo`}{` `}{`chmod`}{` `}{`777`}{` `}{`config`}{`/`}{`kerberos`}{`.`}{`php`}
\n

{`We will need to install a couple of more JavaScript libraries using bower.`}

\n
{`cd`}{` `}{`public`}{`\n`}{`sudo`}{` `}{`bower`}{` --`}{`allow`}{`-`}{`root`}{` `}{`install`}{`\n`}{`service`}{` `}{`nginx`}{` `}{`restart`}
\n

{`Once everything is setup correctly, you should be able to browse towards the ip-address of your Raspberry Pi and see the Kerberos web interface.`}

\n

{`Auto removal`}

\n

{`By default images or videos aren't removed automatically. This means that the Kerberos agent will keep writing to disk, even if there is no more space available on your SD card. When your SD card is full you'll be experiencing strange errors: a corrupt web interface, blank images or corrupt videos.`}

\n

{`To resolve this your should install a simple bash script and initiate a cronjob which continuously poll your filesystem, and start removing media when your disk is getting full.`}

\n

{`Create a bash script and copy following script.`}

\n
{`nano /home/[user]/autoremoval.sh`}
\n

{`Copy following script (make sure the partition is correct, this is the default one for a Raspberry Pi).`}

\n
{`partition=/dev/root`}{`\n`}{`imagedir=/etc/opt/kerberosio/capture/`}{`\n`}{`if`}{` [[ `}{`$(df -h `}{`|`}{` grep `}{`$partition`}{` `}{`|`}{` head -1 `}{`|`}{` awk -F' ' '{ print $5/1 }' `}{`|`}{` tr ['%'] [\"0\"])`}{` -gt 90 ]];`}{`\n`}{`then`}{`\n`}{`    `}{`echo`}{` `}{`\"Cleaning disk\"`}{`\n`}{`    find `}{`$imagedir`}{` -type f | sort | head -n 100 | xargs -r rm -rf;`}{`\n`}{`fi`}{`;`}
\n

{`Make the script executable.`}

\n
{`chmod +x /home/[user]/autoremoval.sh`}
\n

{`Initiate a cronjob, and select the nano editor.`}

\n
{`crontab -e`}
\n

{`Append following line, to execute the autoremoval.sh script every 5min.`}

\n
{`*/5 * * * * /bin/bash /home/[user]/autoremoval.sh`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760434000,"key":"gatsby-plugin-mdx-entire-payload-2bfee1ee9aa0ee686355d988eea0fb44-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source comes with different installation flavours. So you might think, why? The reason is simple, depending on the use case one option is better than another. A short list of recommendations:","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":207,"offset":441},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":207,"offset":441},"indent":[]}},{"type":"list","ordered":true,"start":1,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"/opensource/installation#kios","children":[{"type":"text","value":"KiOS","position":{"start":{"line":14,"column":5,"offset":447},"end":{"line":14,"column":9,"offset":451},"indent":[]}}],"position":{"start":{"line":14,"column":4,"offset":446},"end":{"line":14,"column":41,"offset":483},"indent":[]}},{"type":"text","value":": You have a Raspberry Pi, and you only want to run a Kerberos agent on it.","position":{"start":{"line":14,"column":41,"offset":483},"end":{"line":14,"column":116,"offset":558},"indent":[]}}],"position":{"start":{"line":14,"column":4,"offset":446},"end":{"line":14,"column":116,"offset":558},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":443},"end":{"line":14,"column":116,"offset":558},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"/opensource/installation#raspbian","children":[{"type":"text","value":"Raspbian","position":{"start":{"line":15,"column":5,"offset":563},"end":{"line":15,"column":13,"offset":571},"indent":[]}}],"position":{"start":{"line":15,"column":4,"offset":562},"end":{"line":15,"column":49,"offset":607},"indent":[]}},{"type":"text","value":": You have a Raspberry Pi, but you want other services running next to the Kerberos agent.","position":{"start":{"line":15,"column":49,"offset":607},"end":{"line":15,"column":139,"offset":697},"indent":[]}}],"position":{"start":{"line":15,"column":4,"offset":562},"end":{"line":15,"column":139,"offset":697},"indent":[]}}],"position":{"start":{"line":15,"column":1,"offset":559},"end":{"line":15,"column":139,"offset":697},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"/opensource/installation#docker","children":[{"type":"text","value":"Docker","position":{"start":{"line":16,"column":5,"offset":702},"end":{"line":16,"column":11,"offset":708},"indent":[]}}],"position":{"start":{"line":16,"column":4,"offset":701},"end":{"line":16,"column":45,"offset":742},"indent":[]}},{"type":"text","value":": You have a lot of IP cameras, and/or don't want to mess with dependencies.","position":{"start":{"line":16,"column":45,"offset":742},"end":{"line":16,"column":121,"offset":818},"indent":[]}}],"position":{"start":{"line":16,"column":4,"offset":701},"end":{"line":16,"column":121,"offset":818},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":698},"end":{"line":16,"column":121,"offset":818},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"/opensource/installation#generic","children":[{"type":"text","value":"Generic","position":{"start":{"line":17,"column":5,"offset":823},"end":{"line":17,"column":12,"offset":830},"indent":[]}}],"position":{"start":{"line":17,"column":4,"offset":822},"end":{"line":17,"column":47,"offset":865},"indent":[]}},{"type":"text","value":": You want to develop/extend Kerberos with your own features, or you want to run a Kerberos agent on a not supported OS/architecure.","position":{"start":{"line":17,"column":47,"offset":865},"end":{"line":17,"column":179,"offset":997},"indent":[]}}],"position":{"start":{"line":17,"column":4,"offset":822},"end":{"line":17,"column":179,"offset":997},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":819},"end":{"line":17,"column":179,"offset":997},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":443},"end":{"line":17,"column":179,"offset":997},"indent":[1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":19,"column":4,"offset":1002},"end":{"line":19,"column":8,"offset":1006},"indent":[]}}],"position":{"start":{"line":19,"column":1,"offset":999},"end":{"line":19,"column":8,"offset":1006},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"KiOS (Kerberos Operating System) is our custom linux OS, which runs the Kerberos agent out-of-the-box (read plug-and-play). It's an OS designed for the Raspberry Pi (all version are supported), which you can flash to an SD card.","position":{"start":{"line":21,"column":1,"offset":1008},"end":{"line":21,"column":229,"offset":1236},"indent":[]}}],"position":{"start":{"line":21,"column":1,"offset":1008},"end":{"line":21,"column":229,"offset":1236},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It can be installed using our own installer, which comes with a nice interface that handles the flashing and network configuration for you, or you can handle the flashing yourself by using Etcher.","position":{"start":{"line":23,"column":1,"offset":1238},"end":{"line":23,"column":197,"offset":1434},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":1238},"end":{"line":23,"column":197,"offset":1434},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Github","position":{"start":{"line":25,"column":5,"offset":1440},"end":{"line":25,"column":11,"offset":1446},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":1436},"end":{"line":25,"column":11,"offset":1446},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"KiOS is compiled using Buildroot, the project can be found on ","position":{"start":{"line":27,"column":1,"offset":1448},"end":{"line":27,"column":63,"offset":1510},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios","children":[{"type":"text","value":"following Github repo","position":{"start":{"line":27,"column":64,"offset":1511},"end":{"line":27,"column":85,"offset":1532},"indent":[]}}],"position":{"start":{"line":27,"column":63,"offset":1510},"end":{"line":27,"column":123,"offset":1570},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":27,"column":123,"offset":1570},"end":{"line":27,"column":124,"offset":1571},"indent":[]}}],"position":{"start":{"line":27,"column":1,"offset":1448},"end":{"line":27,"column":124,"offset":1571},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Kerberos installer","position":{"start":{"line":29,"column":5,"offset":1577},"end":{"line":29,"column":23,"offset":1595},"indent":[]}}],"position":{"start":{"line":29,"column":1,"offset":1573},"end":{"line":29,"column":23,"offset":1595},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Installing the Kerberos agent to your Raspberry Pi, has never been so easy. By using our cross-platform installer, you can run a fully configured video surveillance system within 3 minutes. Indeed, we also think that's awesome!","position":{"start":{"line":31,"column":1,"offset":1597},"end":{"line":31,"column":228,"offset":1824},"indent":[]}}],"position":{"start":{"line":31,"column":1,"offset":1597},"end":{"line":31,"column":228,"offset":1824},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kios-install.gif","alt":"access kerberos installer","position":{"start":{"line":33,"column":1,"offset":1826},"end":{"line":33,"column":67,"offset":1892},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":1826},"end":{"line":33,"column":67,"offset":1892},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Download the correct installer for your OS below:","position":{"start":{"line":35,"column":1,"offset":1894},"end":{"line":35,"column":50,"offset":1943},"indent":[]}}],"position":{"start":{"line":35,"column":1,"offset":1894},"end":{"line":35,"column":50,"offset":1943},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://github.com/kerberos-io/etcher/releases","children":[{"type":"text","value":"https://github.com/kerberos-io/etcher/releases","position":{"start":{"line":37,"column":3,"offset":1947},"end":{"line":37,"column":49,"offset":1993},"indent":[]}}],"position":{"start":{"line":37,"column":3,"offset":1947},"end":{"line":37,"column":49,"offset":1993},"indent":[]}}],"position":{"start":{"line":37,"column":3,"offset":1947},"end":{"line":37,"column":49,"offset":1993},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":1945},"end":{"line":37,"column":49,"offset":1993},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Etcher","position":{"start":{"line":39,"column":5,"offset":1999},"end":{"line":39,"column":11,"offset":2005},"indent":[]}}],"position":{"start":{"line":39,"column":1,"offset":1995},"end":{"line":39,"column":11,"offset":2005},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you love Etcher, or the Kerberos installer is not working as expected, you can also flash the Kerberos agent to your SD card manually. It goes as following:","position":{"start":{"line":41,"column":1,"offset":2007},"end":{"line":41,"column":160,"offset":2166},"indent":[]}}],"position":{"start":{"line":41,"column":1,"offset":2007},"end":{"line":41,"column":160,"offset":2166},"indent":[]}},{"type":"list","ordered":true,"start":1,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Download ","position":{"start":{"line":43,"column":4,"offset":2171},"end":{"line":43,"column":13,"offset":2180},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/releases","children":[{"type":"text","value":"the KiOS image","position":{"start":{"line":43,"column":14,"offset":2181},"end":{"line":43,"column":28,"offset":2195},"indent":[]}}],"position":{"start":{"line":43,"column":13,"offset":2180},"end":{"line":43,"column":75,"offset":2242},"indent":[]}},{"type":"text","value":",","position":{"start":{"line":43,"column":75,"offset":2242},"end":{"line":43,"column":76,"offset":2243},"indent":[]}}],"position":{"start":{"line":43,"column":4,"offset":2171},"end":{"line":43,"column":76,"offset":2243},"indent":[]}}],"position":{"start":{"line":43,"column":1,"offset":2168},"end":{"line":43,"column":76,"offset":2243},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"flash it to your SD card with Etcher,","position":{"start":{"line":44,"column":4,"offset":2247},"end":{"line":44,"column":41,"offset":2284},"indent":[]}}],"position":{"start":{"line":44,"column":4,"offset":2247},"end":{"line":44,"column":41,"offset":2284},"indent":[]}}],"position":{"start":{"line":44,"column":1,"offset":2244},"end":{"line":44,"column":41,"offset":2284},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"and edit some configuration files at the boot directory.","position":{"start":{"line":45,"column":4,"offset":2288},"end":{"line":45,"column":60,"offset":2344},"indent":[]}}],"position":{"start":{"line":45,"column":4,"offset":2288},"end":{"line":45,"column":60,"offset":2344},"indent":[]}}],"position":{"start":{"line":45,"column":1,"offset":2285},"end":{"line":45,"column":60,"offset":2344},"indent":[]}}],"position":{"start":{"line":43,"column":1,"offset":2168},"end":{"line":45,"column":60,"offset":2344},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://www.balena.io/etcher/","children":[{"type":"image","title":null,"url":"../../public/images/etcher-install.png","alt":"use etcher for kios","position":{"start":{"line":47,"column":2,"offset":2347},"end":{"line":47,"column":64,"offset":2409},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":2346},"end":{"line":47,"column":96,"offset":2441},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":2346},"end":{"line":47,"column":96,"offset":2441},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you have download the KiOS image (make sure you downloaded the right image) and flashed it to an SD card, put it back into your working station. Navigate to the SD card and creating following files.","position":{"start":{"line":49,"column":1,"offset":2443},"end":{"line":49,"column":204,"offset":2646},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":2443},"end":{"line":49,"column":204,"offset":2646},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Connecting to WiFi","position":{"start":{"line":51,"column":6,"offset":2653},"end":{"line":51,"column":24,"offset":2671},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":2648},"end":{"line":51,"column":24,"offset":2671},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to connect your Raspberry Pi to a WiFi connection, you will need to create a file ","position":{"start":{"line":53,"column":1,"offset":2673},"end":{"line":53,"column":95,"offset":2767},"indent":[]}},{"type":"inlineCode","value":"wireless.conf","position":{"start":{"line":53,"column":95,"offset":2767},"end":{"line":53,"column":110,"offset":2782},"indent":[]}},{"type":"text","value":" on your SD card, with following contents. Change the SSID and password properties to your own WiFi credentials.","position":{"start":{"line":53,"column":110,"offset":2782},"end":{"line":53,"column":222,"offset":2894},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":2673},"end":{"line":53,"column":222,"offset":2894},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"update_config=1\nctrl_interface=/var/run/wpa_supplicant\nnetwork={\n scan_ssid=1\n ssid=\"\"\n psk=\"\"\n}","position":{"start":{"line":55,"column":1,"offset":2896},"end":{"line":63,"column":4,"offset":3005},"indent":[1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Setup a static IP-address","position":{"start":{"line":65,"column":6,"offset":3012},"end":{"line":65,"column":31,"offset":3037},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":3007},"end":{"line":65,"column":31,"offset":3037},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to assign a static ip-address to your Raspberry Pi, create a file ","position":{"start":{"line":67,"column":1,"offset":3039},"end":{"line":67,"column":79,"offset":3117},"indent":[]}},{"type":"inlineCode","value":"static_ip.conf","position":{"start":{"line":67,"column":79,"offset":3117},"end":{"line":67,"column":95,"offset":3133},"indent":[]}},{"type":"text","value":" on your SD card, with following contents:","position":{"start":{"line":67,"column":95,"offset":3133},"end":{"line":67,"column":137,"offset":3175},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":3039},"end":{"line":67,"column":137,"offset":3175},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"#####################################################################\n# Enter the IP-address you want to have, followed by the subnet mask\n# e.g. 192.168.0.10/24\nstatic_ip=\"\"\n#####################################################################\n# Enter the Gateway and DNS, this will be your router in most cases\n# e.g. 192.168.0.1\nstatic_gw=\"\"\nstatic_dns=\"\"","position":{"start":{"line":69,"column":1,"offset":3177},"end":{"line":79,"column":4,"offset":3545},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Power on the Raspberry Pi","position":{"start":{"line":81,"column":5,"offset":3551},"end":{"line":81,"column":30,"offset":3576},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":3547},"end":{"line":81,"column":30,"offset":3576},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you've finished the installation using either the KiOS installer or Etcher, you can put the SD card into your Raspberry Pi and turn it on. Please note that the first time you boot KiOS it can take about 2 mins before the system is operational. When KiOS is ready you can open your favorite browser and type in the IP address of your Raspberry Pi. This will open the Kerberos agent's front-end, which you can access with the username: root and password: root.","position":{"start":{"line":83,"column":1,"offset":3578},"end":{"line":83,"column":464,"offset":4041},"indent":[]}}],"position":{"start":{"line":83,"column":1,"offset":3578},"end":{"line":83,"column":464,"offset":4041},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/access.png","alt":"access kerberos interface","position":{"start":{"line":85,"column":1,"offset":4043},"end":{"line":85,"column":61,"offset":4103},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":4043},"end":{"line":85,"column":61,"offset":4103},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Access the Raspberry Pi","position":{"start":{"line":87,"column":5,"offset":4109},"end":{"line":87,"column":28,"offset":4132},"indent":[]}}],"position":{"start":{"line":87,"column":1,"offset":4105},"end":{"line":87,"column":28,"offset":4132},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can access the KiOS system with attaching your Raspberry Pi to a HDMI monitor or by using ","position":{"start":{"line":89,"column":1,"offset":4134},"end":{"line":89,"column":95,"offset":4228},"indent":[]}},{"type":"inlineCode","value":"ssh","position":{"start":{"line":89,"column":95,"offset":4228},"end":{"line":89,"column":100,"offset":4233},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":89,"column":100,"offset":4233},"end":{"line":89,"column":101,"offset":4234},"indent":[]}}],"position":{"start":{"line":89,"column":1,"offset":4134},"end":{"line":89,"column":101,"offset":4234},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"Cedrics-Mac-mini:build cedricverst$ ssh root@192.168.0.12\nWelcome to kios-79e30bbb!\n[root@kios-79e30bbb ~]#","position":{"start":{"line":91,"column":1,"offset":4236},"end":{"line":95,"column":4,"offset":4353},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Note that by default no root password is set, you can define a password in the ","position":{"start":{"line":97,"column":1,"offset":4355},"end":{"line":97,"column":80,"offset":4434},"indent":[]}},{"type":"inlineCode","value":"/data/etc/kios.conf","position":{"start":{"line":97,"column":80,"offset":4434},"end":{"line":97,"column":101,"offset":4455},"indent":[]}},{"type":"text","value":" file. Once you added a password, make sure to reboot the OS.","position":{"start":{"line":97,"column":101,"offset":4455},"end":{"line":97,"column":162,"offset":4516},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":4355},"end":{"line":97,"column":162,"offset":4516},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"[root@kios-79e30bbb ~]# nano /data/etc/kios.conf\n[root@kios-79e30bbb ~]# reboot","position":{"start":{"line":99,"column":1,"offset":4518},"end":{"line":102,"column":4,"offset":4607},"indent":[1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Raspbian","position":{"start":{"line":104,"column":4,"offset":4612},"end":{"line":104,"column":12,"offset":4620},"indent":[]}}],"position":{"start":{"line":104,"column":1,"offset":4609},"end":{"line":104,"column":12,"offset":4620},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you have already an OS (e.g. Raspbian Buster) flashed to your Raspberry Pi, then it makes sense to install the Kerberos agent on top of your existing OS. There are two ways to achieve this:","position":{"start":{"line":106,"column":1,"offset":4622},"end":{"line":106,"column":193,"offset":4814},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":4622},"end":{"line":106,"column":193,"offset":4814},"indent":[]}},{"type":"list","ordered":true,"start":1,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Install the Kerberos agent using Docker (more info below),","position":{"start":{"line":108,"column":4,"offset":4819},"end":{"line":108,"column":62,"offset":4877},"indent":[]}}],"position":{"start":{"line":108,"column":4,"offset":4819},"end":{"line":108,"column":62,"offset":4877},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":4816},"end":{"line":108,"column":62,"offset":4877},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"or you can install the Kerberos agent manually (machinery + web).","position":{"start":{"line":109,"column":4,"offset":4881},"end":{"line":109,"column":69,"offset":4946},"indent":[]}}],"position":{"start":{"line":109,"column":4,"offset":4881},"end":{"line":109,"column":69,"offset":4946},"indent":[]}}],"position":{"start":{"line":109,"column":1,"offset":4878},"end":{"line":109,"column":69,"offset":4946},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":4816},"end":{"line":109,"column":69,"offset":4946},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"This section will focus on option 2, and will show you how to install the Kerberos agent manually.","position":{"start":{"line":111,"column":1,"offset":4948},"end":{"line":111,"column":99,"offset":5046},"indent":[]}}],"position":{"start":{"line":111,"column":1,"offset":4948},"end":{"line":111,"column":99,"offset":5046},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Update OS","position":{"start":{"line":113,"column":5,"offset":5052},"end":{"line":113,"column":14,"offset":5061},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":5048},"end":{"line":113,"column":14,"offset":5061},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Let's start with updating the OS, and installing a couple of packages.","position":{"start":{"line":115,"column":1,"offset":5063},"end":{"line":115,"column":71,"offset":5133},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":5063},"end":{"line":115,"column":71,"offset":5133},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"We have tested the Raspbian installation on ","position":{"start":{"line":117,"column":3,"offset":5137},"end":{"line":117,"column":47,"offset":5181},"indent":[]}},{"type":"inlineCode","value":"Raspbian GNU/Linux 10 (buster)","position":{"start":{"line":117,"column":47,"offset":5181},"end":{"line":117,"column":79,"offset":5213},"indent":[]}},{"type":"text","value":". It might be that if you have a different version of Raspbian, you will need to install additional/different packages.","position":{"start":{"line":117,"column":79,"offset":5213},"end":{"line":117,"column":198,"offset":5332},"indent":[]}}],"position":{"start":{"line":117,"column":3,"offset":5137},"end":{"line":117,"column":198,"offset":5332},"indent":[]}}],"position":{"start":{"line":117,"column":1,"offset":5135},"end":{"line":117,"column":198,"offset":5332},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo apt-get update && sudo apt-get install -y ffmpeg","position":{"start":{"line":119,"column":1,"offset":5334},"end":{"line":121,"column":4,"offset":5397},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":123,"column":5,"offset":5403},"end":{"line":123,"column":14,"offset":5412},"indent":[]}}],"position":{"start":{"line":123,"column":1,"offset":5399},"end":{"line":123,"column":14,"offset":5412},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Download the debian file from the machinery repository.","position":{"start":{"line":125,"column":1,"offset":5414},"end":{"line":125,"column":56,"offset":5469},"indent":[]}}],"position":{"start":{"line":125,"column":1,"offset":5414},"end":{"line":125,"column":56,"offset":5469},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/releases","children":[{"type":"text","value":"https://github.com/kerberos-io/machinery/releases","position":{"start":{"line":126,"column":3,"offset":5472},"end":{"line":126,"column":52,"offset":5521},"indent":[]}}],"position":{"start":{"line":126,"column":3,"offset":5472},"end":{"line":126,"column":52,"offset":5521},"indent":[]}}],"position":{"start":{"line":126,"column":3,"offset":5472},"end":{"line":126,"column":52,"offset":5521},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":5470},"end":{"line":126,"column":52,"offset":5521},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A ","position":{"start":{"line":128,"column":1,"offset":5523},"end":{"line":128,"column":3,"offset":5525},"indent":[]}},{"type":"inlineCode","value":".deb","position":{"start":{"line":128,"column":3,"offset":5525},"end":{"line":128,"column":9,"offset":5531},"indent":[]}},{"type":"text","value":" file is available for every version of the Raspberry Pi. For example if you are using a Raspberry Pi 4 for version 2.8.0, execute following command. You can change the version and Raspberry Pi board to your needs.","position":{"start":{"line":128,"column":9,"offset":5531},"end":{"line":128,"column":223,"offset":5745},"indent":[]}}],"position":{"start":{"line":128,"column":1,"offset":5523},"end":{"line":128,"column":223,"offset":5745},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Please make sure you pick the right board (rpi, rpi2, rpi3 or rpi4), and choose the version you want (e.g. 2.8.0). Replace below url, with your preferences.","position":{"start":{"line":130,"column":3,"offset":5749},"end":{"line":130,"column":159,"offset":5905},"indent":[]}}],"position":{"start":{"line":130,"column":3,"offset":5749},"end":{"line":130,"column":159,"offset":5905},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":5747},"end":{"line":130,"column":159,"offset":5905},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"wget https://github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-machinery-kerberosio-armhf-2.8.0.deb\nsudo dpkg -i rpi4-machinery-kerberosio-armhf-2.8.0.deb","position":{"start":{"line":132,"column":1,"offset":5907},"end":{"line":135,"column":4,"offset":6084},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Download the x265 library (version 160) from the machinery repository, as Raspbian Buster 10 only ships with version 165. Make sure you select the right board.","position":{"start":{"line":137,"column":1,"offset":6086},"end":{"line":137,"column":160,"offset":6245},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":6086},"end":{"line":137,"column":160,"offset":6245},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"inlineCode","value":"v2.8.0/rpi4-libx265.so.160","position":{"start":{"line":139,"column":3,"offset":6249},"end":{"line":139,"column":31,"offset":6277},"indent":[]}},{"type":"text","value":" this will download the libx265 shared library for the Raspberry Pi 4.","position":{"start":{"line":139,"column":31,"offset":6277},"end":{"line":139,"column":101,"offset":6347},"indent":[]}}],"position":{"start":{"line":139,"column":3,"offset":6249},"end":{"line":139,"column":101,"offset":6347},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":6247},"end":{"line":139,"column":101,"offset":6347},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"wget https://github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-libx265.so.160\nsudo mv rpi4-libx265.so.160 /usr/lib/arm-linux-gnueabihf/libx265.so.160","position":{"start":{"line":141,"column":1,"offset":6349},"end":{"line":144,"column":4,"offset":6521},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Same applies for the libx264 library, download the right shared library.","position":{"start":{"line":146,"column":1,"offset":6523},"end":{"line":146,"column":73,"offset":6595},"indent":[]}}],"position":{"start":{"line":146,"column":1,"offset":6523},"end":{"line":146,"column":73,"offset":6595},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"inlineCode","value":"v2.8.0/rpi4-libx264.so.148","position":{"start":{"line":149,"column":3,"offset":6600},"end":{"line":149,"column":31,"offset":6628},"indent":[]}},{"type":"text","value":" this will download the libx264 shared library for the Raspberry Pi 4.","position":{"start":{"line":149,"column":31,"offset":6628},"end":{"line":149,"column":101,"offset":6698},"indent":[]}}],"position":{"start":{"line":149,"column":3,"offset":6600},"end":{"line":149,"column":101,"offset":6698},"indent":[]}}],"position":{"start":{"line":149,"column":1,"offset":6598},"end":{"line":149,"column":101,"offset":6698},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"wget https://github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-libx264.so.148\nsudo mv rpi4-libx264.so.148 /usr/lib/arm-linux-gnueabihf/libx264.so.148","position":{"start":{"line":151,"column":1,"offset":6700},"end":{"line":154,"column":4,"offset":6872},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"If you wish to use the Raspberry Pi Camera Module, make sure ","position":{"start":{"line":156,"column":1,"offset":6874},"end":{"line":156,"column":62,"offset":6935},"indent":[]}},{"type":"link","title":null,"url":"https://www.raspberrypi.org/documentation/configuration/camera.md","children":[{"type":"text","value":"to enable it","position":{"start":{"line":156,"column":63,"offset":6936},"end":{"line":156,"column":75,"offset":6948},"indent":[]}}],"position":{"start":{"line":156,"column":62,"offset":6935},"end":{"line":156,"column":143,"offset":7016},"indent":[]}},{"type":"text","value":" using ","position":{"start":{"line":156,"column":143,"offset":7016},"end":{"line":156,"column":150,"offset":7023},"indent":[]}},{"type":"inlineCode","value":"sudo raspi-config","position":{"start":{"line":156,"column":150,"offset":7023},"end":{"line":156,"column":169,"offset":7042},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":156,"column":169,"offset":7042},"end":{"line":156,"column":170,"offset":7043},"indent":[]}}],"position":{"start":{"line":156,"column":1,"offset":6874},"end":{"line":156,"column":170,"offset":7043},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo raspi-config","position":{"start":{"line":158,"column":1,"offset":7045},"end":{"line":160,"column":4,"offset":7072},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Enable machinery to start on boot, and start the service.","position":{"start":{"line":162,"column":1,"offset":7074},"end":{"line":162,"column":58,"offset":7131},"indent":[]}}],"position":{"start":{"line":162,"column":1,"offset":7074},"end":{"line":162,"column":58,"offset":7131},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"sudo systemctl enable kerberosio\nsudo service kerberosio start","position":{"start":{"line":164,"column":1,"offset":7133},"end":{"line":167,"column":4,"offset":7203},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Web","position":{"start":{"line":169,"column":5,"offset":7209},"end":{"line":169,"column":8,"offset":7212},"indent":[]}}],"position":{"start":{"line":169,"column":1,"offset":7205},"end":{"line":169,"column":8,"offset":7212},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before you can run the web interface, you'll need to download and configure a webserver. We recommend to use Nginx, as it is a light-weight and fast webserver. The web interface is written in PHP, so we also need to download PHP and some packages. Update the packages and kernel.","position":{"start":{"line":171,"column":1,"offset":7214},"end":{"line":171,"column":280,"offset":7493},"indent":[]}}],"position":{"start":{"line":171,"column":1,"offset":7214},"end":{"line":171,"column":280,"offset":7493},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Install Nginx and PHP (+extensions).","position":{"start":{"line":173,"column":1,"offset":7495},"end":{"line":173,"column":37,"offset":7531},"indent":[]}}],"position":{"start":{"line":173,"column":1,"offset":7495},"end":{"line":173,"column":37,"offset":7531},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo apt-get install -y nginx php7.1 php7.1-curl php7.1-gd php7.1-fpm php7.1-cli php7.1-opcache php7.1-mbstring php7.1-xml php7.1-zip php7.1-mcrypt php7.1-readline","position":{"start":{"line":175,"column":1,"offset":7533},"end":{"line":177,"column":4,"offset":7706},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Creating a Nginx config.","position":{"start":{"line":179,"column":1,"offset":7708},"end":{"line":179,"column":25,"offset":7732},"indent":[]}}],"position":{"start":{"line":179,"column":1,"offset":7708},"end":{"line":179,"column":25,"offset":7732},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo rm -f /etc/nginx/sites-enabled/default\nsudo nano /etc/nginx/sites-enabled/kerberosio.conf","position":{"start":{"line":181,"column":1,"offset":7734},"end":{"line":184,"column":4,"offset":7838},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Copy and paste following config file; this file tells nginx where the web will be installed and that it requires PHP.","position":{"start":{"line":186,"column":1,"offset":7840},"end":{"line":186,"column":118,"offset":7957},"indent":[]}}],"position":{"start":{"line":186,"column":1,"offset":7840},"end":{"line":186,"column":118,"offset":7957},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"server\n{\n listen 80 default_server;\n listen [::]:80 default_server;\n root /var/www/web/public;\n server_name kerberos.rpi;\n index index.php index.html index.htm;\n location /\n {\n autoindex on;\n try_files $uri $uri/ /index.php?$query_string;\n }\n location ~ \\.php$\n {\n fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n}","position":{"start":{"line":188,"column":1,"offset":7959},"end":{"line":208,"column":4,"offset":8466},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Restart nginx","position":{"start":{"line":210,"column":1,"offset":8468},"end":{"line":210,"column":14,"offset":8481},"indent":[]}}],"position":{"start":{"line":210,"column":1,"offset":8468},"end":{"line":210,"column":14,"offset":8481},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo service nginx restart","position":{"start":{"line":212,"column":1,"offset":8483},"end":{"line":214,"column":4,"offset":8519},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Now we have installed all the dependencies, we can download the web interface source code.","position":{"start":{"line":216,"column":1,"offset":8521},"end":{"line":216,"column":91,"offset":8611},"indent":[]}}],"position":{"start":{"line":216,"column":1,"offset":8521},"end":{"line":216,"column":91,"offset":8611},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo mkdir -p /var/www/web && sudo chown www-data:www-data /var/www/web\ncd /var/www/web\nsudo -u www-data wget https://github.com/kerberos-io/web/releases/download/v2.8.0/web.tar.gz\nsudo -u www-data tar xvf web.tar.gz .\nsudo chown www-data -R storage bootstrap/cache config/kerberos.php\nsudo chmod -R 775 storage bootstrap/cache\nsudo chmod 0600 config/kerberos.php","position":{"start":{"line":218,"column":1,"offset":8613},"end":{"line":226,"column":4,"offset":8986},"indent":[1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Once everything is setup correctly, you should be able to browse towards the ip-address of your Raspberry Pi and see the Kerberos web interface.","position":{"start":{"line":228,"column":1,"offset":8988},"end":{"line":228,"column":145,"offset":9132},"indent":[]}}],"position":{"start":{"line":228,"column":1,"offset":8988},"end":{"line":228,"column":145,"offset":9132},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Auto removal","position":{"start":{"line":230,"column":5,"offset":9138},"end":{"line":230,"column":17,"offset":9150},"indent":[]}}],"position":{"start":{"line":230,"column":1,"offset":9134},"end":{"line":230,"column":17,"offset":9150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By default images or videos aren't removed automatically. This means that the Kerberos agent will keep writing to disk, even if there is no more space available on your SD card. When your SD card is full you'll be experiencing strange errors: a corrupt web interface, blank images or corrupt videos.","position":{"start":{"line":232,"column":1,"offset":9152},"end":{"line":232,"column":300,"offset":9451},"indent":[]}}],"position":{"start":{"line":232,"column":1,"offset":9152},"end":{"line":232,"column":300,"offset":9451},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To resolve this your should install a simple bash script and initiate a cronjob which continuously poll your filesystem, and start removing media when your disk is getting full.","position":{"start":{"line":234,"column":1,"offset":9453},"end":{"line":234,"column":178,"offset":9630},"indent":[]}}],"position":{"start":{"line":234,"column":1,"offset":9453},"end":{"line":234,"column":178,"offset":9630},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Create a bash script and copy following script.","position":{"start":{"line":236,"column":1,"offset":9632},"end":{"line":236,"column":48,"offset":9679},"indent":[]}}],"position":{"start":{"line":236,"column":1,"offset":9632},"end":{"line":236,"column":48,"offset":9679},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"nano /home/pi/autoremoval.sh","position":{"start":{"line":238,"column":1,"offset":9681},"end":{"line":240,"column":4,"offset":9721},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Copy following script (make sure the partition is correct, this is the default one for a Raspberry Pi).","position":{"start":{"line":242,"column":1,"offset":9723},"end":{"line":242,"column":104,"offset":9826},"indent":[]}}],"position":{"start":{"line":242,"column":1,"offset":9723},"end":{"line":242,"column":104,"offset":9826},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"partition=/dev/root\nimagedir=/etc/opt/kerberosio/capture/\nif [[ $(df -h | grep $partition | head -1 | awk -F' ' '{ print $5/1 }' | tr ['%'] [\"0\"]) -gt 90 ]];\nthen\n echo \"Cleaning disk\"\n find $imagedir -type f | sort | head -n 100 | xargs -r rm -rf;\nfi;","position":{"start":{"line":244,"column":1,"offset":9828},"end":{"line":252,"column":4,"offset":10098},"indent":[1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Make the script executable.","position":{"start":{"line":254,"column":1,"offset":10100},"end":{"line":254,"column":28,"offset":10127},"indent":[]}}],"position":{"start":{"line":254,"column":1,"offset":10100},"end":{"line":254,"column":28,"offset":10127},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"chmod +x /home/pi/autoremoval.sh","position":{"start":{"line":256,"column":1,"offset":10129},"end":{"line":258,"column":4,"offset":10173},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Initiate a cronjob, and select the nano editor.","position":{"start":{"line":260,"column":1,"offset":10175},"end":{"line":260,"column":48,"offset":10222},"indent":[]}}],"position":{"start":{"line":260,"column":1,"offset":10175},"end":{"line":260,"column":48,"offset":10222},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"crontab -e","position":{"start":{"line":262,"column":1,"offset":10224},"end":{"line":264,"column":4,"offset":10246},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Append following line, to execute the autoremoval.sh script every 5min.","position":{"start":{"line":266,"column":1,"offset":10248},"end":{"line":266,"column":72,"offset":10319},"indent":[]}}],"position":{"start":{"line":266,"column":1,"offset":10248},"end":{"line":266,"column":72,"offset":10319},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"*/5 * * * * /bin/bash /home/pi/autoremoval.sh","position":{"start":{"line":268,"column":1,"offset":10321},"end":{"line":270,"column":4,"offset":10378},"indent":[1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Docker","position":{"start":{"line":272,"column":4,"offset":10383},"end":{"line":272,"column":10,"offset":10389},"indent":[]}}],"position":{"start":{"line":272,"column":1,"offset":10380},"end":{"line":272,"column":10,"offset":10389},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A Docker image (x86, ARMv7, ARMv8) is available on the Docker Hub, which contains all the necessary software to setup the Kerberos agent in a matter of seconds. Before you can run this image, make sure you have Docker installed. Afterwards you can use docker, to get the Kerberos agent up and running. All docker images can be found on ","position":{"start":{"line":274,"column":1,"offset":10391},"end":{"line":274,"column":337,"offset":10727},"indent":[]}},{"type":"link","title":null,"url":"https://hub.docker.com/u/kerberos","children":[{"type":"text","value":"the Docker hub","position":{"start":{"line":274,"column":338,"offset":10728},"end":{"line":274,"column":352,"offset":10742},"indent":[]}}],"position":{"start":{"line":274,"column":337,"offset":10727},"end":{"line":274,"column":388,"offset":10778},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":274,"column":388,"offset":10778},"end":{"line":274,"column":389,"offset":10779},"indent":[]}}],"position":{"start":{"line":274,"column":1,"offset":10391},"end":{"line":274,"column":389,"offset":10779},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Prerequisites","position":{"start":{"line":276,"column":5,"offset":10785},"end":{"line":276,"column":18,"offset":10798},"indent":[]}}],"position":{"start":{"line":276,"column":1,"offset":10781},"end":{"line":276,"column":18,"offset":10798},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Docker or Docker Desktop (Linux, OS or Windows)","position":{"start":{"line":278,"column":3,"offset":10802},"end":{"line":278,"column":50,"offset":10849},"indent":[]}}],"position":{"start":{"line":278,"column":3,"offset":10802},"end":{"line":278,"column":50,"offset":10849},"indent":[]}}],"position":{"start":{"line":278,"column":1,"offset":10800},"end":{"line":278,"column":50,"offset":10849},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Github","position":{"start":{"line":280,"column":5,"offset":10855},"end":{"line":280,"column":11,"offset":10861},"indent":[]}}],"position":{"start":{"line":280,"column":1,"offset":10851},"end":{"line":280,"column":11,"offset":10861},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"All technical information, such as Dockerfile, can be found on ","position":{"start":{"line":282,"column":1,"offset":10863},"end":{"line":282,"column":64,"offset":10926},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/docker","children":[{"type":"text","value":"following Github repo","position":{"start":{"line":282,"column":65,"offset":10927},"end":{"line":282,"column":86,"offset":10948},"indent":[]}}],"position":{"start":{"line":282,"column":64,"offset":10926},"end":{"line":282,"column":126,"offset":10988},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":282,"column":126,"offset":10988},"end":{"line":282,"column":127,"offset":10989},"indent":[]}}],"position":{"start":{"line":282,"column":1,"offset":10863},"end":{"line":282,"column":127,"offset":10989},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Download docker image","position":{"start":{"line":284,"column":5,"offset":10995},"end":{"line":284,"column":26,"offset":11016},"indent":[]}}],"position":{"start":{"line":284,"column":1,"offset":10991},"end":{"line":284,"column":26,"offset":11016},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before you are able to run the Kerberos agent inside a container, you will need to pull the docker image from the Docker hub.","position":{"start":{"line":286,"column":1,"offset":11018},"end":{"line":286,"column":126,"offset":11143},"indent":[]}}],"position":{"start":{"line":286,"column":1,"offset":11018},"end":{"line":286,"column":126,"offset":11143},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"docker pull kerberos/kerberos","position":{"start":{"line":288,"column":1,"offset":11145},"end":{"line":290,"column":4,"offset":11184},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"When you pulled succesfully you can run your first Kerberos container as following. This will run Kerberos agent and expose the web interface on port 80, and the livestream on port 8889.","position":{"start":{"line":292,"column":1,"offset":11186},"end":{"line":292,"column":187,"offset":11372},"indent":[]}}],"position":{"start":{"line":292,"column":1,"offset":11186},"end":{"line":292,"column":187,"offset":11372},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"docker run --name camera1 -p 80:80 -p 8889:8889 -d kerberos/kerberos","position":{"start":{"line":294,"column":1,"offset":11374},"end":{"line":296,"column":4,"offset":11452},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"To add more containers, you can change the name parameter and assign another port to expose the web interface and livestream (ports are unique on a OS).","position":{"start":{"line":298,"column":1,"offset":11454},"end":{"line":298,"column":153,"offset":11606},"indent":[]}}],"position":{"start":{"line":298,"column":1,"offset":11454},"end":{"line":298,"column":153,"offset":11606},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"docker run --name camera2 -p 81:80 -p 8890:8889 -d kerberos/kerberos\ndocker run --name camera3 -p 82:80 -p 8891:8889 -d kerberos/kerberos","position":{"start":{"line":300,"column":1,"offset":11608},"end":{"line":303,"column":4,"offset":11755},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"When the containers are created, you can open your browser and browse to your different containers.","position":{"start":{"line":305,"column":1,"offset":11757},"end":{"line":305,"column":100,"offset":11856},"indent":[]}}],"position":{"start":{"line":305,"column":1,"offset":11757},"end":{"line":305,"column":100,"offset":11856},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"http://localhost:80\nhttp://localhost:81\nhttp://localhost:82","position":{"start":{"line":306,"column":1,"offset":11857},"end":{"line":310,"column":4,"offset":11926},"indent":[1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Volumes","position":{"start":{"line":312,"column":5,"offset":11932},"end":{"line":312,"column":12,"offset":11939},"indent":[]}}],"position":{"start":{"line":312,"column":1,"offset":11928},"end":{"line":312,"column":12,"offset":11939},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can assign volumes to the Kerberos container to for example","position":{"start":{"line":314,"column":1,"offset":11941},"end":{"line":314,"column":64,"offset":12004},"indent":[]}}],"position":{"start":{"line":314,"column":1,"offset":11941},"end":{"line":314,"column":64,"offset":12004},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"preload configuration,","position":{"start":{"line":315,"column":3,"offset":12007},"end":{"line":315,"column":25,"offset":12029},"indent":[]}}],"position":{"start":{"line":315,"column":3,"offset":12007},"end":{"line":315,"column":25,"offset":12029},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":12005},"end":{"line":315,"column":25,"offset":12029},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"or centralise the images/videos on your working station.","position":{"start":{"line":316,"column":3,"offset":12032},"end":{"line":316,"column":59,"offset":12088},"indent":[]}}],"position":{"start":{"line":316,"column":3,"offset":12032},"end":{"line":316,"column":59,"offset":12088},"indent":[]}}],"position":{"start":{"line":316,"column":1,"offset":12030},"end":{"line":316,"column":59,"offset":12088},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":12005},"end":{"line":316,"column":59,"offset":12088},"indent":[1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Generic","position":{"start":{"line":318,"column":4,"offset":12093},"end":{"line":318,"column":11,"offset":12100},"indent":[]}}],"position":{"start":{"line":318,"column":1,"offset":12090},"end":{"line":318,"column":11,"offset":12100},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to install the Kerberos agent from source on your working station or server, either for development or running the software, this is the preferred installation procedure. We are assuming that you use a Linux OS, when using Mac OSX the installation is slightly different.","position":{"start":{"line":320,"column":1,"offset":12102},"end":{"line":320,"column":283,"offset":12384},"indent":[]}}],"position":{"start":{"line":320,"column":1,"offset":12102},"end":{"line":320,"column":283,"offset":12384},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"This was tested on a Ubuntu VM (18.04.3 (LTS) x64).","position":{"start":{"line":322,"column":3,"offset":12388},"end":{"line":322,"column":54,"offset":12439},"indent":[]}}],"position":{"start":{"line":322,"column":3,"offset":12388},"end":{"line":322,"column":54,"offset":12439},"indent":[]}}],"position":{"start":{"line":322,"column":1,"offset":12386},"end":{"line":322,"column":54,"offset":12439},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":324,"column":5,"offset":12445},"end":{"line":324,"column":14,"offset":12454},"indent":[]}}],"position":{"start":{"line":324,"column":1,"offset":12441},"end":{"line":324,"column":14,"offset":12454},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Update the packages and kernel, and install some development tools.","position":{"start":{"line":326,"column":1,"offset":12456},"end":{"line":326,"column":68,"offset":12523},"indent":[]}}],"position":{"start":{"line":326,"column":1,"offset":12456},"end":{"line":326,"column":68,"offset":12523},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo apt-get -y update\nsudo apt-get install -y git cmake subversion dh-autoreconf libcurl4-openssl-dev yasm libx264-dev pkg-config libssl-dev","position":{"start":{"line":328,"column":1,"offset":12525},"end":{"line":331,"column":4,"offset":12676},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Install the FFmpeg library with x264 support.","position":{"start":{"line":333,"column":1,"offset":12678},"end":{"line":333,"column":46,"offset":12723},"indent":[]}}],"position":{"start":{"line":333,"column":1,"offset":12678},"end":{"line":333,"column":46,"offset":12723},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"It's recommended to install FFmpeg 3.1. Later versions might give issues at compilation or run time.","position":{"start":{"line":335,"column":3,"offset":12727},"end":{"line":335,"column":103,"offset":12827},"indent":[]}}],"position":{"start":{"line":335,"column":3,"offset":12727},"end":{"line":335,"column":103,"offset":12827},"indent":[]}}],"position":{"start":{"line":335,"column":1,"offset":12725},"end":{"line":335,"column":103,"offset":12827},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"git clone https://github.com/FFmpeg/FFmpeg ffmpeg\ncd ffmpeg && git checkout remotes/origin/release/3.1\n./configure --enable-gpl --enable-libx264 --enable-shared --prefix=/usr\nmake && sudo make install","position":{"start":{"line":337,"column":1,"offset":12829},"end":{"line":342,"column":4,"offset":13039},"indent":[1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Go to your home directory, or any place your prefer and pull the machinery from Github. Afterwards create a build directory and start the compilation.","position":{"start":{"line":344,"column":1,"offset":13041},"end":{"line":344,"column":151,"offset":13191},"indent":[]}}],"position":{"start":{"line":344,"column":1,"offset":13041},"end":{"line":344,"column":151,"offset":13191},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"You can change the ","position":{"start":{"line":346,"column":3,"offset":13195},"end":{"line":346,"column":22,"offset":13214},"indent":[]}},{"type":"inlineCode","value":"-j","position":{"start":{"line":346,"column":22,"offset":13214},"end":{"line":346,"column":26,"offset":13218},"indent":[]}},{"type":"text","value":" attribute of ","position":{"start":{"line":346,"column":26,"offset":13218},"end":{"line":346,"column":40,"offset":13232},"indent":[]}},{"type":"inlineCode","value":"make -j8","position":{"start":{"line":346,"column":40,"offset":13232},"end":{"line":346,"column":50,"offset":13242},"indent":[]}},{"type":"text","value":"to the number of cores of your compilation host.","position":{"start":{"line":346,"column":50,"offset":13242},"end":{"line":346,"column":98,"offset":13290},"indent":[]}}],"position":{"start":{"line":346,"column":3,"offset":13195},"end":{"line":346,"column":98,"offset":13290},"indent":[]}}],"position":{"start":{"line":346,"column":1,"offset":13193},"end":{"line":346,"column":98,"offset":13290},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"cd && git clone https://github.com/kerberos-io/machinery\ncd machinery && mkdir build && cd build\ncmake .. && make -j8 && make check && sudo make install","position":{"start":{"line":348,"column":1,"offset":13292},"end":{"line":352,"column":4,"offset":13454},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"After the machinery is build and installed succesfully, you can enable ","position":{"start":{"line":354,"column":1,"offset":13456},"end":{"line":354,"column":72,"offset":13527},"indent":[]}},{"type":"inlineCode","value":"kerberosio","position":{"start":{"line":354,"column":72,"offset":13527},"end":{"line":354,"column":84,"offset":13539},"indent":[]}},{"type":"text","value":" to start on boot.","position":{"start":{"line":354,"column":84,"offset":13539},"end":{"line":354,"column":102,"offset":13557},"indent":[]}}],"position":{"start":{"line":354,"column":1,"offset":13456},"end":{"line":354,"column":102,"offset":13557},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo systemctl enable kerberosio\nsudo systemctl start kerberosio","position":{"start":{"line":356,"column":1,"offset":13559},"end":{"line":359,"column":4,"offset":13633},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Web","position":{"start":{"line":361,"column":5,"offset":13639},"end":{"line":361,"column":8,"offset":13642},"indent":[]}}],"position":{"start":{"line":361,"column":1,"offset":13635},"end":{"line":361,"column":8,"offset":13642},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to install the web, you'll need to have a webserver (e.g. Nginx) and PHP running with some extensions. You'll also need NodeJS and npm installed, to install Bower.","position":{"start":{"line":363,"column":1,"offset":13644},"end":{"line":363,"column":176,"offset":13819},"indent":[]}}],"position":{"start":{"line":363,"column":1,"offset":13644},"end":{"line":363,"column":176,"offset":13819},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"cd ~\ncurl -sL https://deb.nodesource.com/setup_10.x | sudo bash -\nsudo apt-add-repository -y ppa:ondrej/php\nsudo apt-get -y update\nsudo apt-get install -y git php7.1-cli php7.1-gd php7.1-mcrypt php7.1-curl php7.1-mbstring php7.1-dom php7.1-zip php7.1-fpm nodejs\nsudo npm -g install bower","position":{"start":{"line":365,"column":1,"offset":13821},"end":{"line":372,"column":4,"offset":14118},"indent":[1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Next we'll need to install Nginx, and create a config file.","position":{"start":{"line":374,"column":1,"offset":14120},"end":{"line":374,"column":60,"offset":14179},"indent":[]}}],"position":{"start":{"line":374,"column":1,"offset":14120},"end":{"line":374,"column":60,"offset":14179},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo apt-get -y install nginx\nsudo rm -f /etc/nginx/sites-enabled/default\nsudo nano /etc/nginx/sites-enabled/default","position":{"start":{"line":376,"column":1,"offset":14181},"end":{"line":380,"column":4,"offset":14307},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Assign Nginx to our web interface (which we will soon create).","position":{"start":{"line":382,"column":1,"offset":14309},"end":{"line":382,"column":63,"offset":14371},"indent":[]}}],"position":{"start":{"line":382,"column":1,"offset":14309},"end":{"line":382,"column":63,"offset":14371},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"server\n{\n listen 80 default_server;\n listen [::]:80 default_server;\n root /var/www/web/public;\n server_name kerberos.rpi;\n index index.php index.html index.htm;\n location /\n {\n autoindex on;\n try_files $uri $uri/ /index.php?$query_string;\n }\n location ~ \\.php$\n {\n fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n}","position":{"start":{"line":384,"column":1,"offset":14373},"end":{"line":404,"column":4,"offset":14880},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Now we have all the dependencies installed we can clone the web repository to our working station.","position":{"start":{"line":406,"column":1,"offset":14882},"end":{"line":406,"column":99,"offset":14980},"indent":[]}}],"position":{"start":{"line":406,"column":1,"offset":14882},"end":{"line":406,"column":99,"offset":14980},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"mkdir -p /var/www\ncd /var/www && sudo git clone https://github.com/kerberos-io/web && cd web","position":{"start":{"line":408,"column":1,"offset":14982},"end":{"line":411,"column":4,"offset":15084},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Install the PHP dependency manager, ","position":{"start":{"line":413,"column":1,"offset":15086},"end":{"line":413,"column":37,"offset":15122},"indent":[]}},{"type":"inlineCode","value":"composer","position":{"start":{"line":413,"column":37,"offset":15122},"end":{"line":413,"column":47,"offset":15132},"indent":[]}},{"type":"text","value":", the install all the needed dependencies.","position":{"start":{"line":413,"column":47,"offset":15132},"end":{"line":413,"column":89,"offset":15174},"indent":[]}}],"position":{"start":{"line":413,"column":1,"offset":15086},"end":{"line":413,"column":89,"offset":15174},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"curl -sS https://getcomposer.org/installer | sudo php\nsudo mv composer.phar /usr/bin/composer\nsudo composer install","position":{"start":{"line":415,"column":1,"offset":15176},"end":{"line":419,"column":4,"offset":15301},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Change some permissions, to make sure we can write logging and caching files.","position":{"start":{"line":421,"column":1,"offset":15303},"end":{"line":421,"column":78,"offset":15380},"indent":[]}}],"position":{"start":{"line":421,"column":1,"offset":15303},"end":{"line":421,"column":78,"offset":15380},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo chmod -R 777 storage\nsudo chmod -R 777 bootstrap/cache\nsudo chmod 777 config/kerberos.php","position":{"start":{"line":423,"column":1,"offset":15382},"end":{"line":427,"column":4,"offset":15486},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"We will need to install a couple of more JavaScript libraries using bower.","position":{"start":{"line":429,"column":1,"offset":15488},"end":{"line":429,"column":75,"offset":15562},"indent":[]}}],"position":{"start":{"line":429,"column":1,"offset":15488},"end":{"line":429,"column":75,"offset":15562},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"cd public\nsudo bower --allow-root install\nservice nginx restart","position":{"start":{"line":431,"column":1,"offset":15564},"end":{"line":435,"column":4,"offset":15637},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Once everything is setup correctly, you should be able to browse towards the ip-address of your Raspberry Pi and see the Kerberos web interface.","position":{"start":{"line":437,"column":1,"offset":15639},"end":{"line":437,"column":145,"offset":15783},"indent":[]}}],"position":{"start":{"line":437,"column":1,"offset":15639},"end":{"line":437,"column":145,"offset":15783},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Auto removal","position":{"start":{"line":439,"column":5,"offset":15789},"end":{"line":439,"column":17,"offset":15801},"indent":[]}}],"position":{"start":{"line":439,"column":1,"offset":15785},"end":{"line":439,"column":17,"offset":15801},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By default images or videos aren't removed automatically. This means that the Kerberos agent will keep writing to disk, even if there is no more space available on your SD card. When your SD card is full you'll be experiencing strange errors: a corrupt web interface, blank images or corrupt videos.","position":{"start":{"line":441,"column":1,"offset":15803},"end":{"line":441,"column":300,"offset":16102},"indent":[]}}],"position":{"start":{"line":441,"column":1,"offset":15803},"end":{"line":441,"column":300,"offset":16102},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To resolve this your should install a simple bash script and initiate a cronjob which continuously poll your filesystem, and start removing media when your disk is getting full.","position":{"start":{"line":443,"column":1,"offset":16104},"end":{"line":443,"column":178,"offset":16281},"indent":[]}}],"position":{"start":{"line":443,"column":1,"offset":16104},"end":{"line":443,"column":178,"offset":16281},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Create a bash script and copy following script.","position":{"start":{"line":445,"column":1,"offset":16283},"end":{"line":445,"column":48,"offset":16330},"indent":[]}}],"position":{"start":{"line":445,"column":1,"offset":16283},"end":{"line":445,"column":48,"offset":16330},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"nano /home/[user]/autoremoval.sh","position":{"start":{"line":447,"column":1,"offset":16332},"end":{"line":449,"column":4,"offset":16376},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Copy following script (make sure the partition is correct, this is the default one for a Raspberry Pi).","position":{"start":{"line":451,"column":1,"offset":16378},"end":{"line":451,"column":104,"offset":16481},"indent":[]}}],"position":{"start":{"line":451,"column":1,"offset":16378},"end":{"line":451,"column":104,"offset":16481},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"partition=/dev/root\nimagedir=/etc/opt/kerberosio/capture/\nif [[ $(df -h | grep $partition | head -1 | awk -F' ' '{ print $5/1 }' | tr ['%'] [\"0\"]) -gt 90 ]];\nthen\n echo \"Cleaning disk\"\n find $imagedir -type f | sort | head -n 100 | xargs -r rm -rf;\nfi;","position":{"start":{"line":453,"column":1,"offset":16483},"end":{"line":461,"column":4,"offset":16753},"indent":[1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Make the script executable.","position":{"start":{"line":463,"column":1,"offset":16755},"end":{"line":463,"column":28,"offset":16782},"indent":[]}}],"position":{"start":{"line":463,"column":1,"offset":16755},"end":{"line":463,"column":28,"offset":16782},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"chmod +x /home/[user]/autoremoval.sh","position":{"start":{"line":465,"column":1,"offset":16784},"end":{"line":467,"column":4,"offset":16832},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Initiate a cronjob, and select the nano editor.","position":{"start":{"line":469,"column":1,"offset":16834},"end":{"line":469,"column":48,"offset":16881},"indent":[]}}],"position":{"start":{"line":469,"column":1,"offset":16834},"end":{"line":469,"column":48,"offset":16881},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"crontab -e","position":{"start":{"line":471,"column":1,"offset":16883},"end":{"line":473,"column":4,"offset":16905},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Append following line, to execute the autoremoval.sh script every 5min.","position":{"start":{"line":475,"column":1,"offset":16907},"end":{"line":475,"column":72,"offset":16978},"indent":[]}}],"position":{"start":{"line":475,"column":1,"offset":16907},"end":{"line":475,"column":72,"offset":16978},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"*/5 * * * * /bin/bash /home/[user]/autoremoval.sh","position":{"start":{"line":477,"column":1,"offset":16980},"end":{"line":479,"column":4,"offset":17041},"indent":[1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":482,"column":1,"offset":17044},"end":{"line":482,"column":31,"offset":17074},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":482,"column":31,"offset":17074}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Installation`}

\n

{`Kerberos Open Source comes with different installation flavours. So you might think, why? The reason is simple, depending on the use case one option is better than another. A short list of recommendations:`}

\n
    \n
  1. {`KiOS`}{`: You have a Raspberry Pi, and you only want to run a Kerberos agent on it.`}
  2. \n
  3. {`Raspbian`}{`: You have a Raspberry Pi, but you want other services running next to the Kerberos agent.`}
  4. \n
  5. {`Docker`}{`: You have a lot of IP cameras, and/or don't want to mess with dependencies.`}
  6. \n
  7. {`Generic`}{`: You want to develop/extend Kerberos with your own features, or you want to run a Kerberos agent on a not supported OS/architecure.`}
  8. \n
\n

{`KiOS`}

\n

{`KiOS (Kerberos Operating System) is our custom linux OS, which runs the Kerberos agent out-of-the-box (read plug-and-play). It's an OS designed for the Raspberry Pi (all version are supported), which you can flash to an SD card.`}

\n

{`It can be installed using our own installer, which comes with a nice interface that handles the flashing and network configuration for you, or you can handle the flashing yourself by using Etcher.`}

\n

{`Github`}

\n

{`KiOS is compiled using Buildroot, the project can be found on `}{`following Github repo`}{`.`}

\n

{`Kerberos installer`}

\n

{`Installing the Kerberos agent to your Raspberry Pi, has never been so easy. By using our cross-platform installer, you can run a fully configured video surveillance system within 3 minutes. Indeed, we also think that's awesome!`}

\n

\"access

\n

{`Download the correct installer for your OS below:`}

\n
\n

{`https://github.com/kerberos-io/etcher/releases`}

\n
\n

{`Etcher`}

\n

{`If you love Etcher, or the Kerberos installer is not working as expected, you can also flash the Kerberos agent to your SD card manually. It goes as following:`}

\n
    \n
  1. {`Download `}{`the KiOS image`}{`,`}
  2. \n
  3. {`flash it to your SD card with Etcher,`}
  4. \n
  5. {`and edit some configuration files at the boot directory.`}
  6. \n
\n

\"use

\n

{`Once you have download the KiOS image (make sure you downloaded the right image) and flashed it to an SD card, put it back into your working station. Navigate to the SD card and creating following files.`}

\n

{`Connecting to WiFi`}

\n

{`If you want to connect your Raspberry Pi to a WiFi connection, you will need to create a file `}{`wireless.conf`}{` on your SD card, with following contents. Change the SSID and password properties to your own WiFi credentials.`}

\n
{`update_config`}{`=`}{`1`}{`\n`}{`ctrl_interface`}{`=/`}{`var`}{`/`}{`run`}{`/wpa_supplicant`}{`\n`}{`network`}{`={`}{`\n`}{`  `}{`scan_ssid`}{`=`}{`1`}{`\n`}{`  `}{`ssid`}{`=`}{`\"\"`}{`\n`}{`  `}{`psk`}{`=`}{`\"\"`}{`\n`}{`}`}
\n

{`Setup a static IP-address`}

\n

{`If you want to assign a static ip-address to your Raspberry Pi, create a file `}{`static_ip.conf`}{` on your SD card, with following contents:`}

\n
{`#####################################################################`}{`\n`}{`# `}{`Enter`}{` `}{`the`}{` `}{`IP`}{`-`}{`address`}{` `}{`you`}{` `}{`want`}{` `}{`to`}{` `}{`have`}{`, `}{`followed`}{` `}{`by`}{` `}{`the`}{` `}{`subnet`}{` `}{`mask`}{`\n`}{`# `}{`e`}{`.`}{`g`}{`. `}{`192.168`}{`.`}{`0.10`}{`/`}{`24`}{`\n`}{`static_ip`}{`=`}{`\"\"`}{`\n`}{`#####################################################################`}{`\n`}{`# `}{`Enter`}{` `}{`the`}{` `}{`Gateway`}{` `}{`and`}{` `}{`DNS`}{`, `}{`this`}{` `}{`will`}{` `}{`be`}{` `}{`your`}{` `}{`router`}{` `}{`in`}{` `}{`most`}{` `}{`cases`}{`\n`}{`# `}{`e`}{`.`}{`g`}{`. `}{`192.168`}{`.`}{`0.1`}{`\n`}{`static_gw`}{`=`}{`\"\"`}{`\n`}{`static_dns`}{`=`}{`\"\"`}
\n

{`Power on the Raspberry Pi`}

\n

{`Once you've finished the installation using either the KiOS installer or Etcher, you can put the SD card into your Raspberry Pi and turn it on. Please note that the first time you boot KiOS it can take about 2 mins before the system is operational. When KiOS is ready you can open your favorite browser and type in the IP address of your Raspberry Pi. This will open the Kerberos agent's front-end, which you can access with the username: root and password: root.`}

\n

\"access

\n

{`Access the Raspberry Pi`}

\n

{`You can access the KiOS system with attaching your Raspberry Pi to a HDMI monitor or by using `}{`ssh`}{`.`}

\n
{`Cedrics`}{`-`}{`Mac`}{`-mini:`}{`build`}{` `}{`cedricverst$`}{` `}{`ssh`}{` `}{`root`}{`@`}{`192.168`}{`.`}{`0.12`}{`\n`}{`Welcome`}{` `}{`to`}{` `}{`kios`}{`-79`}{`e30bbb`}{`!`}{`\n`}{`[`}{`root`}{`@`}{`kios`}{`-79`}{`e30bbb`}{` ~]#`}
\n

{`Note that by default no root password is set, you can define a password in the `}{`/data/etc/kios.conf`}{` file. Once you added a password, make sure to reboot the OS.`}

\n
{`[`}{`root`}{`@`}{`kios`}{`-79`}{`e30bbb`}{` ~]# `}{`nano`}{` /`}{`data`}{`/`}{`etc`}{`/`}{`kios`}{`.`}{`conf`}{`\n`}{`[`}{`root`}{`@`}{`kios`}{`-79`}{`e30bbb`}{` ~]# `}{`reboot`}
\n

{`Raspbian`}

\n

{`If you have already an OS (e.g. Raspbian Buster) flashed to your Raspberry Pi, then it makes sense to install the Kerberos agent on top of your existing OS. There are two ways to achieve this:`}

\n
    \n
  1. {`Install the Kerberos agent using Docker (more info below),`}
  2. \n
  3. {`or you can install the Kerberos agent manually (machinery + web).`}
  4. \n
\n

{`This section will focus on option 2, and will show you how to install the Kerberos agent manually.`}

\n

{`Update OS`}

\n

{`Let's start with updating the OS, and installing a couple of packages.`}

\n
\n

{`We have tested the Raspbian installation on `}{`Raspbian GNU/Linux 10 (buster)`}{`. It might be that if you have a different version of Raspbian, you will need to install additional/different packages.`}

\n
\n
{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`update`}{` && `}{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`install`}{` -`}{`y`}{` `}{`ffmpeg`}
\n

{`Machinery`}

\n

{`Download the debian file from the machinery repository.`}

\n
\n

{`https://github.com/kerberos-io/machinery/releases`}

\n
\n

{`A `}{`.deb`}{` file is available for every version of the Raspberry Pi. For example if you are using a Raspberry Pi 4 for version 2.8.0, execute following command. You can change the version and Raspberry Pi board to your needs.`}

\n
\n

{`Please make sure you pick the right board (rpi, rpi2, rpi3 or rpi4), and choose the version you want (e.g. 2.8.0). Replace below url, with your preferences.`}

\n
\n
{`wget`}{` https:`}{`//github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-machinery-kerberosio-armhf-2.8.0.deb`}{`\n`}{`sudo`}{` `}{`dpkg`}{` -`}{`i`}{` `}{`rpi4`}{`-`}{`machinery`}{`-`}{`kerberosio`}{`-`}{`armhf`}{`-`}{`2.8`}{`.0.`}{`deb`}
\n

{`Download the x265 library (version 160) from the machinery repository, as Raspbian Buster 10 only ships with version 165. Make sure you select the right board.`}

\n
\n

{`v2.8.0/rpi4-libx265.so.160`}{` this will download the libx265 shared library for the Raspberry Pi 4.`}

\n
\n
{`wget`}{` https:`}{`//github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-libx265.so.160`}{`\n`}{`sudo`}{` `}{`mv`}{` `}{`rpi4`}{`-`}{`libx265`}{`.`}{`so`}{`.`}{`160`}{` /`}{`usr`}{`/`}{`lib`}{`/`}{`arm`}{`-`}{`linux`}{`-`}{`gnueabihf`}{`/`}{`libx265`}{`.`}{`so`}{`.`}{`160`}
\n

{`Same applies for the libx264 library, download the right shared library.`}

\n
\n

{`v2.8.0/rpi4-libx264.so.148`}{` this will download the libx264 shared library for the Raspberry Pi 4.`}

\n
\n
{`wget`}{` https:`}{`//github.com/kerberos-io/machinery/releases/download/v2.8.0/rpi4-libx264.so.148`}{`\n`}{`sudo`}{` `}{`mv`}{` `}{`rpi4`}{`-`}{`libx264`}{`.`}{`so`}{`.`}{`148`}{` /`}{`usr`}{`/`}{`lib`}{`/`}{`arm`}{`-`}{`linux`}{`-`}{`gnueabihf`}{`/`}{`libx264`}{`.`}{`so`}{`.`}{`148`}
\n

{`If you wish to use the Raspberry Pi Camera Module, make sure `}{`to enable it`}{` using `}{`sudo raspi-config`}{`.`}

\n
{`sudo`}{` `}{`raspi`}{`-`}{`config`}
\n

{`Enable machinery to start on boot, and start the service.`}

\n
{`sudo systemctl enable kerberosio`}{`\n`}{`sudo service kerberosio start`}
\n

{`Web`}

\n

{`Before you can run the web interface, you'll need to download and configure a webserver. We recommend to use Nginx, as it is a light-weight and fast webserver. The web interface is written in PHP, so we also need to download PHP and some packages. Update the packages and kernel.`}

\n

{`Install Nginx and PHP (+extensions).`}

\n
{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`install`}{` -`}{`y`}{` `}{`nginx`}{` `}{`php7`}{`.`}{`1`}{` `}{`php7`}{`.`}{`1`}{`-`}{`curl`}{` `}{`php7`}{`.`}{`1`}{`-`}{`gd`}{` `}{`php7`}{`.`}{`1`}{`-`}{`fpm`}{` `}{`php7`}{`.`}{`1`}{`-`}{`cli`}{` `}{`php7`}{`.`}{`1`}{`-`}{`opcache`}{` `}{`php7`}{`.`}{`1`}{`-`}{`mbstring`}{` `}{`php7`}{`.`}{`1`}{`-`}{`xml`}{` `}{`php7`}{`.`}{`1`}{`-`}{`zip`}{` `}{`php7`}{`.`}{`1`}{`-`}{`mcrypt`}{` `}{`php7`}{`.`}{`1`}{`-`}{`readline`}
\n

{`Creating a Nginx config.`}

\n
{`sudo`}{` `}{`rm`}{` -`}{`f`}{` /`}{`etc`}{`/`}{`nginx`}{`/`}{`sites`}{`-`}{`enabled`}{`/`}{`default`}{`\n`}{`sudo`}{` `}{`nano`}{` /`}{`etc`}{`/`}{`nginx`}{`/`}{`sites`}{`-`}{`enabled`}{`/`}{`kerberosio`}{`.`}{`conf`}
\n

{`Copy and paste following config file; this file tells nginx where the web will be installed and that it requires PHP.`}

\n
{`server`}{`\n`}{`{`}{`\n`}{`    `}{`listen`}{` `}{`80`}{` `}{`default_server`}{`;`}{`\n`}{`    `}{`listen`}{` [::]:`}{`80`}{` `}{`default_server`}{`;`}{`\n`}{`    `}{`root`}{` /`}{`var`}{`/`}{`www`}{`/web/public;`}{`\n`}{`    `}{`server_name`}{` `}{`kerberos`}{`.`}{`rpi`}{`;`}{`\n`}{`    `}{`index`}{` `}{`index`}{`.`}{`php`}{` `}{`index`}{`.`}{`html`}{` `}{`index`}{`.`}{`htm`}{`;`}{`\n`}{`    `}{`location`}{` /`}{`\n`}{`    {`}{`\n`}{`            `}{`autoindex`}{` `}{`on`}{`;`}{`\n`}{`            `}{`try_files`}{` `}{`$uri`}{` `}{`$uri`}{`/ /`}{`index`}{`.`}{`php`}{`?`}{`$query_string`}{`;`}{`\n`}{`    }`}{`\n`}{`    `}{`location`}{` ~ \\\\.`}{`php$`}{`\n`}{`    {`}{`\n`}{`            fastcgi_pass `}{`unix:`}{`/`}{`var`}{`/`}{`run`}{`/`}{`php`}{`/`}{`php7`}{`.`}{`1`}{`-`}{`fpm`}{`.`}{`sock`}{`;`}{`\n`}{`            `}{`fastcgi_param`}{` `}{`SCRIPT_FILENAME`}{` `}{`$document_root$fastcgi_script_name`}{`;`}{`\n`}{`            `}{`include`}{` `}{`fastcgi_params`}{`;`}{`\n`}{`    }`}{`\n`}{`}`}
\n

{`Restart nginx`}

\n
{`sudo`}{` `}{`service`}{` `}{`nginx`}{` `}{`restart`}
\n

{`Now we have installed all the dependencies, we can download the web interface source code.`}

\n
{`sudo`}{` `}{`mkdir`}{` -`}{`p`}{` /`}{`var`}{`/`}{`www`}{`/web && sudo chown www-data:`}{`www`}{`-`}{`data`}{` /`}{`var`}{`/`}{`www`}{`/`}{`web`}{`\n`}{`cd`}{` /`}{`var`}{`/`}{`www`}{`/web`}{`\n`}{`sudo`}{` -`}{`u`}{` `}{`www`}{`-`}{`data`}{` `}{`wget`}{` https:`}{`//github.com/kerberos-io/web/releases/download/v2.8.0/web.tar.gz`}{`\n`}{`sudo`}{` -`}{`u`}{` `}{`www`}{`-`}{`data`}{` `}{`tar`}{` `}{`xvf`}{` `}{`web`}{`.`}{`tar`}{`.`}{`gz`}{` .`}{`\n`}{`sudo`}{` `}{`chown`}{` `}{`www`}{`-`}{`data`}{` -`}{`R`}{` `}{`storage`}{` `}{`bootstrap`}{`/`}{`cache`}{` `}{`config`}{`/`}{`kerberos`}{`.`}{`php`}{`\n`}{`sudo`}{` `}{`chmod`}{` -`}{`R`}{` `}{`775`}{` `}{`storage`}{` `}{`bootstrap`}{`/`}{`cache`}{`\n`}{`sudo`}{` `}{`chmod`}{` `}{`0600`}{` `}{`config`}{`/`}{`kerberos`}{`.`}{`php`}
\n

{`Once everything is setup correctly, you should be able to browse towards the ip-address of your Raspberry Pi and see the Kerberos web interface.`}

\n

{`Auto removal`}

\n

{`By default images or videos aren't removed automatically. This means that the Kerberos agent will keep writing to disk, even if there is no more space available on your SD card. When your SD card is full you'll be experiencing strange errors: a corrupt web interface, blank images or corrupt videos.`}

\n

{`To resolve this your should install a simple bash script and initiate a cronjob which continuously poll your filesystem, and start removing media when your disk is getting full.`}

\n

{`Create a bash script and copy following script.`}

\n
{`nano /home/pi/autoremoval.sh`}
\n

{`Copy following script (make sure the partition is correct, this is the default one for a Raspberry Pi).`}

\n
{`partition=/dev/root`}{`\n`}{`imagedir=/etc/opt/kerberosio/capture/`}{`\n`}{`if`}{` [[ `}{`$(df -h `}{`|`}{` grep `}{`$partition`}{` `}{`|`}{` head -1 `}{`|`}{` awk -F' ' '{ print $5/1 }' `}{`|`}{` tr ['%'] [\"0\"])`}{` -gt 90 ]];`}{`\n`}{`then`}{`\n`}{`    `}{`echo`}{` `}{`\"Cleaning disk\"`}{`\n`}{`    find `}{`$imagedir`}{` -type f | sort | head -n 100 | xargs -r rm -rf;`}{`\n`}{`fi`}{`;`}
\n

{`Make the script executable.`}

\n
{`chmod +x /home/pi/autoremoval.sh`}
\n

{`Initiate a cronjob, and select the nano editor.`}

\n
{`crontab -e`}
\n

{`Append following line, to execute the autoremoval.sh script every 5min.`}

\n
{`*/5 * * * * /bin/bash /home/pi/autoremoval.sh`}
\n

{`Docker`}

\n

{`A Docker image (x86, ARMv7, ARMv8) is available on the Docker Hub, which contains all the necessary software to setup the Kerberos agent in a matter of seconds. Before you can run this image, make sure you have Docker installed. Afterwards you can use docker, to get the Kerberos agent up and running. All docker images can be found on `}{`the Docker hub`}{`.`}

\n

{`Prerequisites`}

\n
\n

{`Docker or Docker Desktop (Linux, OS or Windows)`}

\n
\n

{`Github`}

\n

{`All technical information, such as Dockerfile, can be found on `}{`following Github repo`}{`.`}

\n

{`Download docker image`}

\n

{`Before you are able to run the Kerberos agent inside a container, you will need to pull the docker image from the Docker hub.`}

\n
{`docker`}{` `}{`pull`}{` `}{`kerberos`}{`/`}{`kerberos`}
\n

{`When you pulled succesfully you can run your first Kerberos container as following. This will run Kerberos agent and expose the web interface on port 80, and the livestream on port 8889.`}

\n
{`docker`}{` `}{`run`}{` --`}{`name`}{` `}{`camera1`}{` -`}{`p`}{` `}{`80`}{`:`}{`80`}{` -`}{`p`}{` `}{`8889`}{`:`}{`8889`}{` -`}{`d`}{` `}{`kerberos`}{`/`}{`kerberos`}
\n

{`To add more containers, you can change the name parameter and assign another port to expose the web interface and livestream (ports are unique on a OS).`}

\n
{`docker`}{` `}{`run`}{` --`}{`name`}{` `}{`camera2`}{` -`}{`p`}{` `}{`81`}{`:`}{`80`}{` -`}{`p`}{` `}{`8890`}{`:`}{`8889`}{` -`}{`d`}{` `}{`kerberos`}{`/`}{`kerberos`}{`\n`}{`docker`}{` `}{`run`}{` --`}{`name`}{` `}{`camera3`}{` -`}{`p`}{` `}{`82`}{`:`}{`80`}{` -`}{`p`}{` `}{`8891`}{`:`}{`8889`}{` -`}{`d`}{` `}{`kerberos`}{`/`}{`kerberos`}
\n

{`When the containers are created, you can open your browser and browse to your different containers.`}

\n
{`http:`}{`//localhost:80`}{`\n`}{`http:`}{`//localhost:81`}{`\n`}{`http:`}{`//localhost:82`}
\n

{`Volumes`}

\n

{`You can assign volumes to the Kerberos container to for example`}

\n
    \n
  • {`preload configuration,`}
  • \n
  • {`or centralise the images/videos on your working station.`}
  • \n
\n

{`Generic`}

\n

{`If you want to install the Kerberos agent from source on your working station or server, either for development or running the software, this is the preferred installation procedure. We are assuming that you use a Linux OS, when using Mac OSX the installation is slightly different.`}

\n
\n

{`This was tested on a Ubuntu VM (18.04.3 (LTS) x64).`}

\n
\n

{`Machinery`}

\n

{`Update the packages and kernel, and install some development tools.`}

\n
{`sudo`}{` `}{`apt`}{`-`}{`get`}{` -`}{`y`}{` `}{`update`}{`\n`}{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`install`}{` -`}{`y`}{` `}{`git`}{` `}{`cmake`}{` `}{`subversion`}{` `}{`dh`}{`-`}{`autoreconf`}{` `}{`libcurl4`}{`-`}{`openssl`}{`-`}{`dev`}{` `}{`yasm`}{` `}{`libx264`}{`-`}{`dev`}{` `}{`pkg`}{`-`}{`config`}{` `}{`libssl`}{`-`}{`dev`}
\n

{`Install the FFmpeg library with x264 support.`}

\n
\n

{`It's recommended to install FFmpeg 3.1. Later versions might give issues at compilation or run time.`}

\n
\n
{`git`}{` `}{`clone`}{` https:`}{`//github.com/FFmpeg/FFmpeg ffmpeg`}{`\n`}{`cd`}{` `}{`ffmpeg`}{` && `}{`git`}{` `}{`checkout`}{` `}{`remotes`}{`/`}{`origin`}{`/`}{`release`}{`/`}{`3.1`}{`\n`}{`./`}{`configure`}{` --`}{`enable`}{`-`}{`gpl`}{` --`}{`enable`}{`-`}{`libx264`}{` --`}{`enable`}{`-`}{`shared`}{` --`}{`prefix`}{`=/`}{`usr`}{`\n`}{`make`}{` && `}{`sudo`}{` `}{`make`}{` `}{`install`}
\n

{`Go to your home directory, or any place your prefer and pull the machinery from Github. Afterwards create a build directory and start the compilation.`}

\n
\n

{`You can change the `}{`-j`}{` attribute of `}{`make -j8`}{`to the number of cores of your compilation host.`}

\n
\n
{`cd`}{` && `}{`git`}{` `}{`clone`}{` https:`}{`//github.com/kerberos-io/machinery`}{`\n`}{`cd`}{` `}{`machinery`}{` && `}{`mkdir`}{` `}{`build`}{` && `}{`cd`}{` `}{`build`}{`\n`}{`cmake`}{` .. && `}{`make`}{` -`}{`j8`}{` && `}{`make`}{` `}{`check`}{` && `}{`sudo`}{` `}{`make`}{` `}{`install`}
\n

{`After the machinery is build and installed succesfully, you can enable `}{`kerberosio`}{` to start on boot.`}

\n
{`sudo`}{` `}{`systemctl`}{` `}{`enable`}{` `}{`kerberosio`}{`\n`}{`sudo`}{` `}{`systemctl`}{` `}{`start`}{` `}{`kerberosio`}
\n

{`Web`}

\n

{`If you want to install the web, you'll need to have a webserver (e.g. Nginx) and PHP running with some extensions. You'll also need NodeJS and npm installed, to install Bower.`}

\n
{`cd`}{` ~`}{`\n`}{`curl`}{` -`}{`sL`}{` https:`}{`//deb.nodesource.com/setup_10.x | sudo bash -`}{`\n`}{`sudo`}{` `}{`apt`}{`-`}{`add`}{`-`}{`repository`}{` -`}{`y`}{` ppa:`}{`ondrej`}{`/`}{`php`}{`\n`}{`sudo`}{` `}{`apt`}{`-`}{`get`}{` -`}{`y`}{` `}{`update`}{`\n`}{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`install`}{` -`}{`y`}{` `}{`git`}{` `}{`php7`}{`.`}{`1`}{`-`}{`cli`}{` `}{`php7`}{`.`}{`1`}{`-`}{`gd`}{` `}{`php7`}{`.`}{`1`}{`-`}{`mcrypt`}{` `}{`php7`}{`.`}{`1`}{`-`}{`curl`}{` `}{`php7`}{`.`}{`1`}{`-`}{`mbstring`}{` `}{`php7`}{`.`}{`1`}{`-`}{`dom`}{` `}{`php7`}{`.`}{`1`}{`-`}{`zip`}{` `}{`php7`}{`.`}{`1`}{`-`}{`fpm`}{` `}{`nodejs`}{`\n`}{`sudo`}{` `}{`npm`}{` -`}{`g`}{` `}{`install`}{` `}{`bower`}
\n

{`Next we'll need to install Nginx, and create a config file.`}

\n
{`sudo`}{` `}{`apt`}{`-`}{`get`}{` -`}{`y`}{` `}{`install`}{` `}{`nginx`}{`\n`}{`sudo`}{` `}{`rm`}{` -`}{`f`}{` /`}{`etc`}{`/`}{`nginx`}{`/`}{`sites`}{`-`}{`enabled`}{`/`}{`default`}{`\n`}{`sudo`}{` `}{`nano`}{` /`}{`etc`}{`/`}{`nginx`}{`/`}{`sites`}{`-`}{`enabled`}{`/`}{`default`}
\n

{`Assign Nginx to our web interface (which we will soon create).`}

\n
{`server`}{`\n`}{`{`}{`\n`}{`    `}{`listen`}{` `}{`80`}{` `}{`default_server`}{`;`}{`\n`}{`    `}{`listen`}{` [::]:`}{`80`}{` `}{`default_server`}{`;`}{`\n`}{`    `}{`root`}{` /`}{`var`}{`/`}{`www`}{`/web/public;`}{`\n`}{`    `}{`server_name`}{` `}{`kerberos`}{`.`}{`rpi`}{`;`}{`\n`}{`    `}{`index`}{` `}{`index`}{`.`}{`php`}{` `}{`index`}{`.`}{`html`}{` `}{`index`}{`.`}{`htm`}{`;`}{`\n`}{`    `}{`location`}{` /`}{`\n`}{`    {`}{`\n`}{`            `}{`autoindex`}{` `}{`on`}{`;`}{`\n`}{`            `}{`try_files`}{` `}{`$uri`}{` `}{`$uri`}{`/ /`}{`index`}{`.`}{`php`}{`?`}{`$query_string`}{`;`}{`\n`}{`    }`}{`\n`}{`    `}{`location`}{` ~ \\\\.`}{`php$`}{`\n`}{`    {`}{`\n`}{`            fastcgi_pass `}{`unix:`}{`/`}{`var`}{`/`}{`run`}{`/`}{`php`}{`/`}{`php7`}{`.`}{`1`}{`-`}{`fpm`}{`.`}{`sock`}{`;`}{`\n`}{`            `}{`fastcgi_param`}{` `}{`SCRIPT_FILENAME`}{` `}{`$document_root$fastcgi_script_name`}{`;`}{`\n`}{`            `}{`include`}{` `}{`fastcgi_params`}{`;`}{`\n`}{`    }`}{`\n`}{`}`}
\n

{`Now we have all the dependencies installed we can clone the web repository to our working station.`}

\n
{`mkdir`}{` -`}{`p`}{` /`}{`var`}{`/`}{`www`}{`\n`}{`cd`}{` /`}{`var`}{`/`}{`www`}{` && sudo git clone https:`}{`//github.com/kerberos-io/web && cd web`}
\n

{`Install the PHP dependency manager, `}{`composer`}{`, the install all the needed dependencies.`}

\n
{`curl`}{` -`}{`sS`}{` https:`}{`//getcomposer.org/installer | sudo php`}{`\n`}{`sudo`}{` `}{`mv`}{` `}{`composer`}{`.`}{`phar`}{` /`}{`usr`}{`/`}{`bin`}{`/`}{`composer`}{`\n`}{`sudo`}{` `}{`composer`}{` `}{`install`}
\n

{`Change some permissions, to make sure we can write logging and caching files.`}

\n
{`sudo`}{` `}{`chmod`}{` -`}{`R`}{` `}{`777`}{` `}{`storage`}{`\n`}{`sudo`}{` `}{`chmod`}{` -`}{`R`}{` `}{`777`}{` `}{`bootstrap`}{`/`}{`cache`}{`\n`}{`sudo`}{` `}{`chmod`}{` `}{`777`}{` `}{`config`}{`/`}{`kerberos`}{`.`}{`php`}
\n

{`We will need to install a couple of more JavaScript libraries using bower.`}

\n
{`cd`}{` `}{`public`}{`\n`}{`sudo`}{` `}{`bower`}{` --`}{`allow`}{`-`}{`root`}{` `}{`install`}{`\n`}{`service`}{` `}{`nginx`}{` `}{`restart`}
\n

{`Once everything is setup correctly, you should be able to browse towards the ip-address of your Raspberry Pi and see the Kerberos web interface.`}

\n

{`Auto removal`}

\n

{`By default images or videos aren't removed automatically. This means that the Kerberos agent will keep writing to disk, even if there is no more space available on your SD card. When your SD card is full you'll be experiencing strange errors: a corrupt web interface, blank images or corrupt videos.`}

\n

{`To resolve this your should install a simple bash script and initiate a cronjob which continuously poll your filesystem, and start removing media when your disk is getting full.`}

\n

{`Create a bash script and copy following script.`}

\n
{`nano /home/[user]/autoremoval.sh`}
\n

{`Copy following script (make sure the partition is correct, this is the default one for a Raspberry Pi).`}

\n
{`partition=/dev/root`}{`\n`}{`imagedir=/etc/opt/kerberosio/capture/`}{`\n`}{`if`}{` [[ `}{`$(df -h `}{`|`}{` grep `}{`$partition`}{` `}{`|`}{` head -1 `}{`|`}{` awk -F' ' '{ print $5/1 }' `}{`|`}{` tr ['%'] [\"0\"])`}{` -gt 90 ]];`}{`\n`}{`then`}{`\n`}{`    `}{`echo`}{` `}{`\"Cleaning disk\"`}{`\n`}{`    find `}{`$imagedir`}{` -type f | sort | head -n 100 | xargs -r rm -rf;`}{`\n`}{`fi`}{`;`}
\n

{`Make the script executable.`}

\n
{`chmod +x /home/[user]/autoremoval.sh`}
\n

{`Initiate a cronjob, and select the nano editor.`}

\n
{`crontab -e`}
\n

{`Append following line, to execute the autoremoval.sh script every 5min.`}

\n
{`*/5 * * * * /bin/bash /home/[user]/autoremoval.sh`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-38350fd47cf6441333be39c4c8a76012.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-38350fd47cf6441333be39c4c8a76012.json new file mode 100644 index 0000000..0cd5124 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-38350fd47cf6441333be39c4c8a76012.json @@ -0,0 +1 @@ +{"expireTime":9007200838767280000,"key":"gatsby-plugin-mdx-entire-payload-8cc632b5b23a5628b43e127013451805-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":31,"offset":802},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":24,"column":31,"offset":802}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-38894f9b70e1dcadeff4de87006f8b5e.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-38894f9b70e1dcadeff4de87006f8b5e.json new file mode 100644 index 0000000..27e8d64 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-38894f9b70e1dcadeff4de87006f8b5e.json @@ -0,0 +1 @@ +{"expireTime":9007200838760428000,"key":"gatsby-plugin-mdx-entire-payload-97faa4d223d453876500f2944b84f792-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable solution. Lots of people and companies started to adopt the system, and requested enhancements. Despite the fact that Kerberos Open Source is stable and feature rich, every\nsolution has its limitations, especially if you aim to scale it.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":65,"offset":467},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":65,"offset":467},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"That being said, Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it doesn't scale well if you plan to monitor dozens or hundreds of surveillance cameras. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":469},"end":{"line":14,"column":274,"offset":975},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":469},"end":{"line":14,"column":274,"offset":975},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":977},"end":{"line":16,"column":186,"offset":1162},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1167},"end":{"line":18,"column":14,"offset":1177},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1164},"end":{"line":18,"column":14,"offset":1177},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1179},"end":{"line":20,"column":319,"offset":1497},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1179},"end":{"line":20,"column":319,"offset":1497},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1499},"end":{"line":22,"column":91,"offset":1589},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1499},"end":{"line":22,"column":91,"offset":1589},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute these pods across your nodes (VM's/Bare-metal machines).","position":{"start":{"line":24,"column":1,"offset":1591},"end":{"line":24,"column":239,"offset":1829},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1591},"end":{"line":24,"column":239,"offset":1829},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Nodes inside your cluster can fail or crash, Kubernetes will make sure the Kerberos pods running on the failed nodes will be deployed to healthy nodes, to make sure the monitoring of your video surveillance cameras continues seamlessly.","position":{"start":{"line":26,"column":1,"offset":1831},"end":{"line":26,"column":237,"offset":2067},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1831},"end":{"line":26,"column":237,"offset":2067},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By having the power to add nodes to your cluster, you can anticipate to the ever growing need of surveillance cameras. With the Kubernetes tools you can monitor your cluster and get into the details.","position":{"start":{"line":28,"column":1,"offset":2069},"end":{"line":28,"column":200,"offset":2268},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":2069},"end":{"line":28,"column":200,"offset":2268},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Cloud or on premise","position":{"start":{"line":30,"column":4,"offset":2273},"end":{"line":30,"column":23,"offset":2292},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":2270},"end":{"line":30,"column":23,"offset":2292},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You install Kerberos Enterprise inside a Kubernetes cluster, but there are not limitations where this cluster is running. This means that whatever security policy you have within your company, you can run it where you want: on-premise, public cloud, private cloud, etc.","position":{"start":{"line":32,"column":1,"offset":2294},"end":{"line":32,"column":270,"offset":2563},"indent":[]}}],"position":{"start":{"line":32,"column":1,"offset":2294},"end":{"line":32,"column":270,"offset":2563},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes-cloud.png","alt":"architecture kubernetes","position":{"start":{"line":34,"column":1,"offset":2565},"end":{"line":34,"column":97,"offset":2661},"indent":[]}}],"position":{"start":{"line":34,"column":1,"offset":2565},"end":{"line":34,"column":97,"offset":2661},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Licensing","position":{"start":{"line":36,"column":4,"offset":2666},"end":{"line":36,"column":13,"offset":2675},"indent":[]}}],"position":{"start":{"line":36,"column":1,"offset":2663},"end":{"line":36,"column":13,"offset":2675},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is publicly available but requires a license key to operate correctly. A license key can be requested by contacting ","position":{"start":{"line":38,"column":1,"offset":2677},"end":{"line":38,"column":137,"offset":2813},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"cedric@verstraeten.io","position":{"start":{"line":38,"column":139,"offset":2815},"end":{"line":38,"column":160,"offset":2836},"indent":[]}}],"position":{"start":{"line":38,"column":137,"offset":2813},"end":{"line":38,"column":162,"offset":2838},"indent":[]}},{"type":"text","value":", send an email to have more information about the pricing.","position":{"start":{"line":38,"column":162,"offset":2838},"end":{"line":38,"column":221,"offset":2897},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":2677},"end":{"line":38,"column":221,"offset":2897},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":41,"column":1,"offset":2900},"end":{"line":41,"column":31,"offset":2930},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":41,"column":31,"offset":2930}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable solution. Lots of people and companies started to adopt the system, and requested enhancements. Despite the fact that Kerberos Open Source is stable and feature rich, every\nsolution has its limitations, especially if you aim to scale it.`}

\n

{`That being said, Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it doesn't scale well if you plan to monitor dozens or hundreds of surveillance cameras. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n

{`Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute these pods across your nodes (VM's/Bare-metal machines).`}

\n

{`Nodes inside your cluster can fail or crash, Kubernetes will make sure the Kerberos pods running on the failed nodes will be deployed to healthy nodes, to make sure the monitoring of your video surveillance cameras continues seamlessly.`}

\n

{`By having the power to add nodes to your cluster, you can anticipate to the ever growing need of surveillance cameras. With the Kubernetes tools you can monitor your cluster and get into the details.`}

\n

{`Cloud or on premise`}

\n

{`You install Kerberos Enterprise inside a Kubernetes cluster, but there are not limitations where this cluster is running. This means that whatever security policy you have within your company, you can run it where you want: on-premise, public cloud, private cloud, etc.`}

\n

\"architecture

\n

{`Licensing`}

\n

{`Kerberos Enterprise is publicly available but requires a license key to operate correctly. A license key can be requested by contacting `}{`cedric@verstraeten.io`}{`, send an email to have more information about the pricing.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3a491fc7ff79adb41ea1a5e2b213ded3.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3a491fc7ff79adb41ea1a5e2b213ded3.json new file mode 100644 index 0000000..76d14b7 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3a491fc7ff79adb41ea1a5e2b213ded3.json @@ -0,0 +1 @@ +{"expireTime":9007200838824357000,"key":"gatsby-plugin-mdx-entire-payload-3ab2a511208d88bacb2445ff715be446-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":29,"offset":797},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":29,"offset":797},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":799},"end":{"line":23,"column":41,"offset":839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":842},"end":{"line":26,"column":17,"offset":858},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":842},"end":{"line":26,"column":17,"offset":858},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":860},"end":{"line":48,"column":42,"offset":1444},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1450},"end":{"line":51,"column":8,"offset":1454},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1447},"end":{"line":51,"column":8,"offset":1454},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1459},"end":{"line":53,"column":8,"offset":1463},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1457},"end":{"line":53,"column":10,"offset":1465},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1456},"end":{"line":53,"column":29,"offset":1484},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily.\nInstead of writing yaml files yourself, you use so called ","position":{"start":{"line":53,"column":29,"offset":1484},"end":{"line":54,"column":59,"offset":1627},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":61,"offset":1629},"end":{"line":54,"column":67,"offset":1635},"indent":[]}}],"position":{"start":{"line":54,"column":59,"offset":1627},"end":{"line":54,"column":69,"offset":1637},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure\nwith configuration files.","position":{"start":{"line":54,"column":69,"offset":1637},"end":{"line":55,"column":26,"offset":1709},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1456},"end":{"line":55,"column":26,"offset":1709},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1711},"end":{"line":57,"column":73,"offset":1783},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1711},"end":{"line":57,"column":73,"offset":1783},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1785},"end":{"line":65,"column":24,"offset":1890},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1896},"end":{"line":67,"column":18,"offset":1909},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1892},"end":{"line":67,"column":18,"offset":1909},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":1911},"end":{"line":70,"column":55,"offset":2067},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":1911},"end":{"line":70,"column":55,"offset":2067},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2069},"end":{"line":74,"column":39,"offset":2227},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2229},"end":{"line":76,"column":31,"offset":2259},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2229},"end":{"line":76,"column":31,"offset":2259},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2261},"end":{"line":89,"column":19,"offset":2562},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2567},"end":{"line":91,"column":11,"offset":2574},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2564},"end":{"line":91,"column":11,"offset":2574},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2579},"end":{"line":93,"column":11,"offset":2586},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2577},"end":{"line":93,"column":13,"offset":2588},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2576},"end":{"line":93,"column":44,"offset":2619},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.","position":{"start":{"line":93,"column":44,"offset":2619},"end":{"line":94,"column":103,"offset":2779},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2576},"end":{"line":94,"column":103,"offset":2779},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2781},"end":{"line":96,"column":72,"offset":2852},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2854},"end":{"line":98,"column":22,"offset":2875},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2854},"end":{"line":98,"column":22,"offset":2875},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":2877},"end":{"line":105,"column":22,"offset":3001},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3005},"end":{"line":106,"column":11,"offset":3012},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3002},"end":{"line":106,"column":11,"offset":3012},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3014},"end":{"line":109,"column":117,"offset":3264},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3014},"end":{"line":109,"column":117,"offset":3264},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3266},"end":{"line":111,"column":78,"offset":3343},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kerberos factory","position":{"start":{"line":113,"column":4,"offset":3348},"end":{"line":113,"column":20,"offset":3364},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3345},"end":{"line":113,"column":20,"offset":3364},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":115,"column":1,"offset":3366},"end":{"line":115,"column":74,"offset":3439},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":115,"column":76,"offset":3441},"end":{"line":115,"column":83,"offset":3448},"indent":[]}}],"position":{"start":{"line":115,"column":74,"offset":3439},"end":{"line":115,"column":85,"offset":3450},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating","position":{"start":{"line":115,"column":85,"offset":3450},"end":{"line":115,"column":128,"offset":3493},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":3366},"end":{"line":115,"column":128,"offset":3493},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":117,"column":1,"offset":3495},"end":{"line":117,"column":47,"offset":3541},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":120,"column":1,"offset":3544},"end":{"line":120,"column":31,"offset":3574},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":120,"column":31,"offset":3574}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily.\nInstead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure\nwith configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Kerberos factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3ac33388759d113211aa8324dfc5615a.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3ac33388759d113211aa8324dfc5615a.json new file mode 100644 index 0000000..6b6153d --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3ac33388759d113211aa8324dfc5615a.json @@ -0,0 +1 @@ +{"expireTime":9007200838837016000,"key":"gatsby-plugin-mdx-entire-payload-a7ffee3e7ed6687bb094ca5cc0285309-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":107,"column":4,"offset":3144},"end":{"line":107,"column":11,"offset":3151},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":3141},"end":{"line":107,"column":11,"offset":3151},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}}],"position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":112,"column":1,"offset":3398},"end":{"line":112,"column":78,"offset":3475},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":116,"column":1,"offset":3501},"end":{"line":116,"column":8,"offset":3508},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":118,"column":4,"offset":3513},"end":{"line":118,"column":11,"offset":3520},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3510},"end":{"line":118,"column":11,"offset":3520},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":120,"column":74,"offset":3595},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":120,"column":76,"offset":3597},"end":{"line":120,"column":83,"offset":3604},"indent":[]}}],"position":{"start":{"line":120,"column":74,"offset":3595},"end":{"line":120,"column":85,"offset":3606},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":120,"column":85,"offset":3606},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}}],"position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":125,"column":1,"offset":3989},"end":{"line":125,"column":47,"offset":4035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}}],"position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":129,"column":1,"offset":4064},"end":{"line":129,"column":25,"offset":4088},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":131,"column":3,"offset":4092},"end":{"line":131,"column":25,"offset":4114},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":4090},"end":{"line":131,"column":25,"offset":4114},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":135,"column":12,"offset":4222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4223},"end":{"line":136,"column":12,"offset":4234},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4235},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":137,"column":12,"offset":4246},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":141,"column":1,"offset":4275},"end":{"line":145,"column":73,"offset":4587},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":147,"column":4,"offset":4592},"end":{"line":147,"column":21,"offset":4609},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4589},"end":{"line":147,"column":21,"offset":4609},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure your DNS server. Look for the\nTraefik service, and copy its External IP.","position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":43,"offset":4786},"indent":[1]}}],"position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":43,"offset":4786},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":" $ kubectl get svc\n NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n factory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\n kubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\n mongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\n--> traefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h\n traefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":152,"column":1,"offset":4788},"end":{"line":158,"column":109,"offset":5465},"indent":[1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Add this External IP to your DNS server, so it will resolve your domains:","position":{"start":{"line":160,"column":1,"offset":5467},"end":{"line":160,"column":74,"offset":5540},"indent":[]}}],"position":{"start":{"line":160,"column":1,"offset":5467},"end":{"line":160,"column":74,"offset":5540},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"traefik.domain.com (change to your domain)","position":{"start":{"line":162,"column":5,"offset":5546},"end":{"line":162,"column":47,"offset":5588},"indent":[]}}],"position":{"start":{"line":162,"column":5,"offset":5546},"end":{"line":162,"column":47,"offset":5588},"indent":[]}}],"position":{"start":{"line":162,"column":1,"offset":5542},"end":{"line":162,"column":47,"offset":5588},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"factory.domain.com (change to your domain).","position":{"start":{"line":163,"column":5,"offset":5593},"end":{"line":163,"column":48,"offset":5636},"indent":[]}}],"position":{"start":{"line":163,"column":5,"offset":5593},"end":{"line":163,"column":48,"offset":5636},"indent":[]}}],"position":{"start":{"line":163,"column":1,"offset":5589},"end":{"line":163,"column":48,"offset":5636},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"api.factory.domain.com (change to your domain).","position":{"start":{"line":164,"column":5,"offset":5641},"end":{"line":164,"column":52,"offset":5688},"indent":[]}}],"position":{"start":{"line":164,"column":5,"offset":5641},"end":{"line":164,"column":52,"offset":5688},"indent":[]}}],"position":{"start":{"line":164,"column":1,"offset":5637},"end":{"line":164,"column":52,"offset":5688},"indent":[]}}],"position":{"start":{"line":162,"column":1,"offset":5542},"end":{"line":164,"column":52,"offset":5688},"indent":[1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Access the system","position":{"start":{"line":166,"column":4,"offset":5693},"end":{"line":166,"column":21,"offset":5710},"indent":[]}}],"position":{"start":{"line":166,"column":1,"offset":5690},"end":{"line":166,"column":21,"offset":5710},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating","position":{"start":{"line":168,"column":1,"offset":5712},"end":{"line":168,"column":129,"offset":5840},"indent":[]}}],"position":{"start":{"line":168,"column":1,"offset":5712},"end":{"line":168,"column":129,"offset":5840},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":171,"column":1,"offset":5843},"end":{"line":171,"column":31,"offset":5873},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":171,"column":31,"offset":5873}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure your DNS server. Look for the\nTraefik service, and copy its External IP.`}

\n
{`    $ kubectl get svc`}{`\n`}{`    NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`    factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`    kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`    mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`--> traefik              LoadBalancer   10.0.10.97    34.66.138.141   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`    traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n

{`Add this External IP to your DNS server, so it will resolve your domains:`}

\n
    \n
  • {`traefik.domain.com (change to your domain)`}
  • \n
  • {`factory.domain.com (change to your domain).`}
  • \n
  • {`api.factory.domain.com (change to your domain).`}
  • \n
\n

{`Access the system`}

\n

{`Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3b428ae7cc21126ba4ef432146f656f6.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3b428ae7cc21126ba4ef432146f656f6.json deleted file mode 100644 index 4d2c0c3..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3b428ae7cc21126ba4ef432146f656f6.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838682111000,"key":"gatsby-plugin-mdx-entire-payload-a1d5a146de0dd6ab749f61944155849c-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":839},"end":{"line":16,"column":186,"offset":1024},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1029},"end":{"line":18,"column":14,"offset":1039},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1026},"end":{"line":18,"column":14,"offset":1039},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide the high availability and fail over requirements customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape vertically.","position":{"start":{"line":20,"column":1,"offset":1041},"end":{"line":20,"column":237,"offset":1277},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1041},"end":{"line":20,"column":237,"offset":1277},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":23,"column":1,"offset":1280},"end":{"line":23,"column":31,"offset":1310},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":23,"column":31,"offset":1310}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.`}

\n
\n

{`Kubernetes`}

\n

{`To provide the high availability and fail over requirements customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape vertically.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3d928074c6477eb92afcf227412a2773.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3d928074c6477eb92afcf227412a2773.json new file mode 100644 index 0000000..fcdb472 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3d928074c6477eb92afcf227412a2773.json @@ -0,0 +1 @@ +{"expireTime":9007200838836520000,"key":"gatsby-plugin-mdx-entire-payload-464572557204b2ac6d7cd325b06c8b3f-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":107,"column":4,"offset":3144},"end":{"line":107,"column":11,"offset":3151},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":3141},"end":{"line":107,"column":11,"offset":3151},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}}],"position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":112,"column":1,"offset":3398},"end":{"line":112,"column":78,"offset":3475},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":116,"column":1,"offset":3501},"end":{"line":116,"column":8,"offset":3508},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":118,"column":4,"offset":3513},"end":{"line":118,"column":11,"offset":3520},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3510},"end":{"line":118,"column":11,"offset":3520},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":120,"column":74,"offset":3595},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":120,"column":76,"offset":3597},"end":{"line":120,"column":83,"offset":3604},"indent":[]}}],"position":{"start":{"line":120,"column":74,"offset":3595},"end":{"line":120,"column":85,"offset":3606},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":120,"column":85,"offset":3606},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}}],"position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":125,"column":1,"offset":3989},"end":{"line":125,"column":47,"offset":4035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}}],"position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":129,"column":1,"offset":4064},"end":{"line":129,"column":25,"offset":4088},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":131,"column":3,"offset":4092},"end":{"line":131,"column":25,"offset":4114},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":4090},"end":{"line":131,"column":25,"offset":4114},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":135,"column":12,"offset":4222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4223},"end":{"line":136,"column":12,"offset":4234},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4235},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":137,"column":12,"offset":4246},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":141,"column":1,"offset":4275},"end":{"line":145,"column":73,"offset":4587},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":147,"column":4,"offset":4592},"end":{"line":147,"column":21,"offset":4609},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4589},"end":{"line":147,"column":21,"offset":4609},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS. Look for the\nTraefik service, and copy its external ip. Add this IP to your DNS server, so it will resolve traefik.domain.com (change to your domain).","position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":138,"offset":4869},"indent":[1]}}],"position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":138,"offset":4869},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":" $ kubectl get svc\n NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n factory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\n kubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\n mongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\n--> traefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h\n traefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":152,"column":1,"offset":4871},"end":{"line":158,"column":109,"offset":5548},"indent":[1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":161,"column":1,"offset":5551},"end":{"line":161,"column":31,"offset":5581},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":161,"column":31,"offset":5581}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS. Look for the\nTraefik service, and copy its external ip. Add this IP to your DNS server, so it will resolve traefik.domain.com (change to your domain).`}

\n
{`    $ kubectl get svc`}{`\n`}{`    NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`    factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`    kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`    mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`--> traefik              LoadBalancer   10.0.10.97    34.66.138.141   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`    traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3df1c21f1d232d32dafaf22aae80a67e.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3df1c21f1d232d32dafaf22aae80a67e.json new file mode 100644 index 0000000..ab91540 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3df1c21f1d232d32dafaf22aae80a67e.json @@ -0,0 +1 @@ +{"expireTime":9007200838824697000,"key":"gatsby-plugin-mdx-entire-payload-66ba56dfb47fdedc38738eb1e7649c6f-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kerberos factory","position":{"start":{"line":113,"column":4,"offset":3479},"end":{"line":113,"column":20,"offset":3495},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":20,"offset":3495},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":115,"column":1,"offset":3497},"end":{"line":115,"column":74,"offset":3570},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":115,"column":76,"offset":3572},"end":{"line":115,"column":83,"offset":3579},"indent":[]}}],"position":{"start":{"line":115,"column":74,"offset":3570},"end":{"line":115,"column":85,"offset":3581},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":115,"column":85,"offset":3581},"end":{"line":118,"column":76,"offset":3962},"indent":[1,1,1]}}],"position":{"start":{"line":115,"column":1,"offset":3497},"end":{"line":118,"column":76,"offset":3962},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":120,"column":1,"offset":3964},"end":{"line":120,"column":47,"offset":4010},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":123,"column":1,"offset":4013},"end":{"line":123,"column":31,"offset":4043},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":123,"column":31,"offset":4043}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Kerberos factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3eda51512f5a97475506e2e5457fd258.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3eda51512f5a97475506e2e5457fd258.json deleted file mode 100644 index ea6831d..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-3eda51512f5a97475506e2e5457fd258.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838684756000,"key":"gatsby-plugin-mdx-entire-payload-ca1dc7743ed7466dac75a959cbf59892-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).","position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Cloud or on premise","position":{"start":{"line":26,"column":4,"offset":1715},"end":{"line":26,"column":23,"offset":1734},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1712},"end":{"line":26,"column":23,"offset":1734},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster. This means that whatever security policy you have, you can run it where you want.","position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":193,"offset":1928},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":193,"offset":1928},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes-cloud.png","alt":"architecture kubernetes","position":{"start":{"line":30,"column":1,"offset":1930},"end":{"line":30,"column":97,"offset":2026},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":1930},"end":{"line":30,"column":97,"offset":2026},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Licensing","position":{"start":{"line":32,"column":4,"offset":2031},"end":{"line":32,"column":13,"offset":2040},"indent":[]}}],"position":{"start":{"line":32,"column":1,"offset":2028},"end":{"line":32,"column":13,"offset":2040},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is publicly available but requires a license key to operate correctly. A license key can be requested by contactig ","position":{"start":{"line":34,"column":1,"offset":2042},"end":{"line":34,"column":136,"offset":2177},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"cedric@verstraeten.io","position":{"start":{"line":34,"column":138,"offset":2179},"end":{"line":34,"column":159,"offset":2200},"indent":[]}}],"position":{"start":{"line":34,"column":136,"offset":2177},"end":{"line":34,"column":161,"offset":2202},"indent":[]}},{"type":"text","value":", to have more information about pricing.","position":{"start":{"line":34,"column":161,"offset":2202},"end":{"line":34,"column":202,"offset":2243},"indent":[]}}],"position":{"start":{"line":34,"column":1,"offset":2042},"end":{"line":34,"column":202,"offset":2243},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":37,"column":1,"offset":2246},"end":{"line":37,"column":31,"offset":2276},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":37,"column":31,"offset":2276}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n

{`Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).`}

\n

{`Cloud or on premise`}

\n

{`You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster. This means that whatever security policy you have, you can run it where you want.`}

\n

\"architecture

\n

{`Licensing`}

\n

{`Kerberos Enterprise is publicly available but requires a license key to operate correctly. A license key can be requested by contactig `}{`cedric@verstraeten.io`}{`, to have more information about pricing.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-450a4bd793b2dc0c3970d811745eabc6.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-450a4bd793b2dc0c3970d811745eabc6.json new file mode 100644 index 0000000..c47cb32 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-450a4bd793b2dc0c3970d811745eabc6.json @@ -0,0 +1 @@ +{"expireTime":9007200838824272000,"key":"gatsby-plugin-mdx-entire-payload-8c56b1d1963ab3f685105bbf402ba3dd-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC,\nwe need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":29,"offset":727},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":29,"offset":727},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":729},"end":{"line":23,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":772},"end":{"line":26,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":772},"end":{"line":26,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":790},"end":{"line":48,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1380},"end":{"line":51,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1377},"end":{"line":51,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1389},"end":{"line":53,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1387},"end":{"line":53,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1386},"end":{"line":53,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily.\nInstead of writing yaml files yourself, you use so called ","position":{"start":{"line":53,"column":29,"offset":1414},"end":{"line":54,"column":59,"offset":1557},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":61,"offset":1559},"end":{"line":54,"column":67,"offset":1565},"indent":[]}}],"position":{"start":{"line":54,"column":59,"offset":1557},"end":{"line":54,"column":69,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure\nwith configuration files.","position":{"start":{"line":54,"column":69,"offset":1567},"end":{"line":55,"column":26,"offset":1639},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1386},"end":{"line":55,"column":26,"offset":1639},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1641},"end":{"line":57,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1641},"end":{"line":57,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1715},"end":{"line":65,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1826},"end":{"line":67,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1822},"end":{"line":67,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":1841},"end":{"line":70,"column":55,"offset":1997},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":1841},"end":{"line":70,"column":55,"offset":1997},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":1999},"end":{"line":74,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2159},"end":{"line":76,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2159},"end":{"line":76,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2191},"end":{"line":89,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2497},"end":{"line":91,"column":11,"offset":2504},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2494},"end":{"line":91,"column":11,"offset":2504},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2509},"end":{"line":93,"column":11,"offset":2516},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2507},"end":{"line":93,"column":13,"offset":2518},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2506},"end":{"line":93,"column":44,"offset":2549},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.","position":{"start":{"line":93,"column":44,"offset":2549},"end":{"line":94,"column":103,"offset":2709},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2506},"end":{"line":94,"column":103,"offset":2709},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2711},"end":{"line":96,"column":72,"offset":2782},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2784},"end":{"line":98,"column":22,"offset":2805},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2784},"end":{"line":98,"column":22,"offset":2805},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":2807},"end":{"line":105,"column":22,"offset":2931},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":2935},"end":{"line":106,"column":11,"offset":2942},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":2932},"end":{"line":106,"column":11,"offset":2942},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":2944},"end":{"line":109,"column":117,"offset":3194},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":2944},"end":{"line":109,"column":117,"offset":3194},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3196},"end":{"line":111,"column":78,"offset":3273},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kerberos factory","position":{"start":{"line":113,"column":4,"offset":3278},"end":{"line":113,"column":20,"offset":3294},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3275},"end":{"line":113,"column":20,"offset":3294},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":115,"column":1,"offset":3296},"end":{"line":115,"column":74,"offset":3369},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":115,"column":76,"offset":3371},"end":{"line":115,"column":83,"offset":3378},"indent":[]}}],"position":{"start":{"line":115,"column":74,"offset":3369},"end":{"line":115,"column":85,"offset":3380},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating","position":{"start":{"line":115,"column":85,"offset":3380},"end":{"line":115,"column":128,"offset":3423},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":3296},"end":{"line":115,"column":128,"offset":3423},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":117,"column":1,"offset":3425},"end":{"line":117,"column":47,"offset":3471},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":120,"column":1,"offset":3474},"end":{"line":120,"column":31,"offset":3504},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":120,"column":31,"offset":3504}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC,\nwe need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily.\nInstead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure\nwith configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Kerberos factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4de646e20b496fcb22f046c5e40543c9.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4de646e20b496fcb22f046c5e40543c9.json deleted file mode 100644 index a7e3c62..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4de646e20b496fcb22f046c5e40543c9.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838525664000,"key":"gatsby-plugin-mdx-entire-payload-bdf24cff47c55988137e902161fd1a92-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable of you want to monitor dozens of hundreds of them. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a huge amount of surveillance cameras.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":205,"offset":811},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":205,"offset":811},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":17,"column":1,"offset":814},"end":{"line":17,"column":31,"offset":844},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":17,"column":31,"offset":844}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable of you want to monitor dozens of hundreds of them. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a huge amount of surveillance cameras.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4e2c47ea9e629b020fafa1e9c4f1fd6e.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4e2c47ea9e629b020fafa1e9c4f1fd6e.json deleted file mode 100644 index 96da8bc..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4e2c47ea9e629b020fafa1e9c4f1fd6e.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838682382000,"key":"gatsby-plugin-mdx-entire-payload-ee9250d13596cc560361f74372db773f-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide the high availability and fail over requirements our customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and provide a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":310,"offset":1385},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":310,"offset":1385},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":23,"column":1,"offset":1388},"end":{"line":23,"column":31,"offset":1418},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":23,"column":31,"offset":1418}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide the high availability and fail over requirements our customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and provide a never-seen high available video surveillance system.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4e98d933911f4678819dd9830f149258.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4e98d933911f4678819dd9830f149258.json new file mode 100644 index 0000000..34f3dad --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4e98d933911f4678819dd9830f149258.json @@ -0,0 +1 @@ +{"expireTime":9007200838836152000,"key":"gatsby-plugin-mdx-entire-payload-6aa0fb47ee56c3710bfeacae4dacbe79-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":115,"column":1,"offset":3500},"end":{"line":115,"column":8,"offset":3507},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":117,"column":4,"offset":3512},"end":{"line":117,"column":11,"offset":3519},"indent":[]}}],"position":{"start":{"line":117,"column":1,"offset":3509},"end":{"line":117,"column":11,"offset":3519},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":119,"column":1,"offset":3521},"end":{"line":119,"column":74,"offset":3594},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":119,"column":76,"offset":3596},"end":{"line":119,"column":83,"offset":3603},"indent":[]}}],"position":{"start":{"line":119,"column":74,"offset":3594},"end":{"line":119,"column":85,"offset":3605},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":119,"column":85,"offset":3605},"end":{"line":122,"column":76,"offset":3986},"indent":[1,1,1]}}],"position":{"start":{"line":119,"column":1,"offset":3521},"end":{"line":122,"column":76,"offset":3986},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":124,"column":1,"offset":3988},"end":{"line":124,"column":47,"offset":4034},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":126,"column":1,"offset":4036},"end":{"line":126,"column":26,"offset":4061},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":4036},"end":{"line":126,"column":26,"offset":4061},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":128,"column":1,"offset":4063},"end":{"line":128,"column":25,"offset":4087},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":130,"column":3,"offset":4091},"end":{"line":130,"column":25,"offset":4113},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":4089},"end":{"line":130,"column":25,"offset":4113},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":132,"column":1,"offset":4115},"end":{"line":132,"column":94,"offset":4208},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":4115},"end":{"line":132,"column":94,"offset":4208},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":134,"column":5,"offset":4214},"end":{"line":134,"column":12,"offset":4221},"indent":[]}}],"position":{"start":{"line":134,"column":5,"offset":4214},"end":{"line":134,"column":12,"offset":4221},"indent":[]}}],"position":{"start":{"line":134,"column":1,"offset":4210},"end":{"line":134,"column":12,"offset":4221},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":135,"column":5,"offset":4226},"end":{"line":135,"column":12,"offset":4233},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4226},"end":{"line":135,"column":12,"offset":4233},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4222},"end":{"line":135,"column":12,"offset":4233},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":136,"column":5,"offset":4238},"end":{"line":136,"column":12,"offset":4245},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4238},"end":{"line":136,"column":12,"offset":4245},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4234},"end":{"line":136,"column":12,"offset":4245},"indent":[]}}],"position":{"start":{"line":134,"column":1,"offset":4210},"end":{"line":136,"column":12,"offset":4245},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":138,"column":1,"offset":4247},"end":{"line":138,"column":26,"offset":4272},"indent":[]}}],"position":{"start":{"line":138,"column":1,"offset":4247},"end":{"line":138,"column":26,"offset":4272},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":140,"column":1,"offset":4274},"end":{"line":144,"column":73,"offset":4586},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":146,"column":4,"offset":4591},"end":{"line":146,"column":21,"offset":4608},"indent":[]}}],"position":{"start":{"line":146,"column":1,"offset":4588},"end":{"line":146,"column":21,"offset":4608},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS.","position":{"start":{"line":148,"column":1,"offset":4610},"end":{"line":148,"column":108,"offset":4717},"indent":[]}}],"position":{"start":{"line":148,"column":1,"offset":4610},"end":{"line":148,"column":108,"offset":4717},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get svc\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nfactory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\nkubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\nmongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\ntraefik LoadBalancer 10.0.10.97 **34.66.138.141** 443:31683/TCP,80:32053/TCP 4d14h\ntraefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":150,"column":1,"offset":4719},"end":{"line":156,"column":105,"offset":5372},"indent":[1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":159,"column":1,"offset":5375},"end":{"line":159,"column":31,"offset":5405},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":159,"column":31,"offset":5405}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS.`}

\n
{`$ kubectl get svc`}{`\n`}{`NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`traefik              LoadBalancer   10.0.10.97    **34.66.138.141**   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4f29e6fe71137741286340d58a6965c2.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4f29e6fe71137741286340d58a6965c2.json index ffcb76b..e87666e 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4f29e6fe71137741286340d58a6965c2.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4f29e6fe71137741286340d58a6965c2.json @@ -1 +1 @@ -{"expireTime":9007200838510859000,"key":"gatsby-plugin-mdx-entire-payload-09b8db9882da82aa864a9d7f6d7faa1b-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"CC BY-NC-SA 4.0","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":18,"offset":176},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":18,"offset":176},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Summary","position":{"start":{"line":10,"column":4,"offset":181},"end":{"line":10,"column":11,"offset":188},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":178},"end":{"line":10,"column":11,"offset":188},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You are free to:","position":{"start":{"line":12,"column":1,"offset":190},"end":{"line":12,"column":17,"offset":206},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":190},"end":{"line":12,"column":17,"offset":206},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Share — copy and redistribute the material in any medium or format","position":{"start":{"line":14,"column":3,"offset":210},"end":{"line":14,"column":69,"offset":276},"indent":[]}}],"position":{"start":{"line":14,"column":3,"offset":210},"end":{"line":14,"column":69,"offset":276},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":208},"end":{"line":14,"column":69,"offset":276},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Adapt — remix, transform, and build upon the material","position":{"start":{"line":15,"column":3,"offset":279},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":15,"column":3,"offset":279},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":15,"column":1,"offset":277},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":208},"end":{"line":15,"column":56,"offset":332},"indent":[1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"The license","position":{"start":{"line":17,"column":4,"offset":337},"end":{"line":17,"column":15,"offset":348},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":334},"end":{"line":17,"column":15,"offset":348},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License\nBy exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License (\"Public License\"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.","position":{"start":{"line":19,"column":1,"offset":350},"end":{"line":20,"column":567,"offset":1003},"indent":[1]}}],"position":{"start":{"line":19,"column":1,"offset":350},"end":{"line":20,"column":567,"offset":1003},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 1 – Definitions.","position":{"start":{"line":22,"column":5,"offset":1009},"end":{"line":22,"column":29,"offset":1033},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1005},"end":{"line":22,"column":29,"offset":1033},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.\nAdapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.\nBY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.\nCopyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.\nEffective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.\nExceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.\nLicense Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.\nLicensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.\nLicensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.\nLicensor means the individual(s) or entity(ies) granting rights under this Public License.\nNonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.\nShare means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.\nSui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.\nYou means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.","position":{"start":{"line":24,"column":1,"offset":1035},"end":{"line":37,"column":127,"offset":4698},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":24,"column":1,"offset":1035},"end":{"line":37,"column":127,"offset":4698},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 2 – Scope.","position":{"start":{"line":39,"column":5,"offset":4704},"end":{"line":39,"column":23,"offset":4722},"indent":[]}}],"position":{"start":{"line":39,"column":1,"offset":4700},"end":{"line":39,"column":23,"offset":4722},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"License grant.\nSubject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:\nreproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and\nproduce, reproduce, and Share Adapted Material for NonCommercial purposes only.\nExceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.\nTerm. The term of this Public License is specified in Section 6(a).\nMedia and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.\nDownstream recipients.\nOffer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.\nAdditional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.\nNo downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.\nNo endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).\nOther rights.","position":{"start":{"line":41,"column":1,"offset":4724},"end":{"line":53,"column":14,"offset":7185},"indent":[1,1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":41,"column":1,"offset":4724},"end":{"line":53,"column":14,"offset":7185},"indent":[1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.\nPatent and trademark rights are not licensed under this Public License.\nTo the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.","position":{"start":{"line":55,"column":1,"offset":7187},"end":{"line":57,"column":420,"offset":8052},"indent":[1,1]}}],"position":{"start":{"line":55,"column":1,"offset":7187},"end":{"line":57,"column":420,"offset":8052},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 3 – License Conditions.","position":{"start":{"line":59,"column":5,"offset":8058},"end":{"line":59,"column":36,"offset":8089},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":8054},"end":{"line":59,"column":36,"offset":8089},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Your exercise of the Licensed Rights is expressly made subject to the following conditions.","position":{"start":{"line":61,"column":1,"offset":8091},"end":{"line":61,"column":92,"offset":8182},"indent":[]}}],"position":{"start":{"line":61,"column":1,"offset":8091},"end":{"line":61,"column":92,"offset":8182},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Attribution.","position":{"start":{"line":63,"column":1,"offset":8184},"end":{"line":63,"column":13,"offset":8196},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":8184},"end":{"line":63,"column":13,"offset":8196},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If You Share the Licensed Material (including in modified form), You must:","position":{"start":{"line":65,"column":1,"offset":8198},"end":{"line":65,"column":75,"offset":8272},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":8198},"end":{"line":65,"column":75,"offset":8272},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"retain the following if it is supplied by the Licensor with the Licensed Material:\nidentification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);\na copyright notice;\na notice that refers to this Public License;\na notice that refers to the disclaimer of warranties;\na URI or hyperlink to the Licensed Material to the extent reasonably practicable;\nindicate if You modified the Licensed Material and retain an indication of any previous modifications; and\nindicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.\nYou may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.\nIf requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.\nShareAlike.\nIn addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.","position":{"start":{"line":67,"column":1,"offset":8274},"end":{"line":78,"column":127,"offset":9587},"indent":[1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":67,"column":1,"offset":8274},"end":{"line":78,"column":127,"offset":9587},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.\nYou must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.\nYou may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.","position":{"start":{"line":80,"column":1,"offset":9589},"end":{"line":82,"column":231,"offset":10199},"indent":[1,1]}}],"position":{"start":{"line":80,"column":1,"offset":9589},"end":{"line":82,"column":231,"offset":10199},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 4 – Sui Generis Database Rights.","position":{"start":{"line":84,"column":5,"offset":10205},"end":{"line":84,"column":45,"offset":10245},"indent":[]}}],"position":{"start":{"line":84,"column":1,"offset":10201},"end":{"line":84,"column":45,"offset":10245},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:","position":{"start":{"line":86,"column":1,"offset":10247},"end":{"line":86,"column":111,"offset":10357},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":10247},"end":{"line":86,"column":111,"offset":10357},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;\nif You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and\nYou must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.\nFor the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.","position":{"start":{"line":88,"column":1,"offset":10359},"end":{"line":91,"column":189,"offset":11166},"indent":[1,1,1]}}],"position":{"start":{"line":88,"column":1,"offset":10359},"end":{"line":91,"column":189,"offset":11166},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 5 – Disclaimer of Warranties and Limitation of Liability.","position":{"start":{"line":93,"column":5,"offset":11172},"end":{"line":93,"column":70,"offset":11237},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":11168},"end":{"line":93,"column":70,"offset":11237},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.\nTo the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.\nThe disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.","position":{"start":{"line":95,"column":1,"offset":11239},"end":{"line":97,"column":213,"offset":12637},"indent":[1,1]}}],"position":{"start":{"line":95,"column":1,"offset":11239},"end":{"line":97,"column":213,"offset":12637},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 6 – Term and Termination.","position":{"start":{"line":99,"column":5,"offset":12643},"end":{"line":99,"column":38,"offset":12676},"indent":[]}}],"position":{"start":{"line":99,"column":1,"offset":12639},"end":{"line":99,"column":38,"offset":12676},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.\nWhere Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:","position":{"start":{"line":101,"column":1,"offset":12678},"end":{"line":102,"column":96,"offset":12990},"indent":[1]}}],"position":{"start":{"line":101,"column":1,"offset":12678},"end":{"line":102,"column":96,"offset":12990},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or\nupon express reinstatement by the Licensor.\nFor the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.\nFor the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.\nSections 1, 5, 6, 7, and 8 survive termination of this Public License.","position":{"start":{"line":104,"column":1,"offset":12992},"end":{"line":108,"column":71,"offset":13616},"indent":[1,1,1,1]}}],"position":{"start":{"line":104,"column":1,"offset":12992},"end":{"line":108,"column":71,"offset":13616},"indent":[1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 7 – Other Terms and Conditions.","position":{"start":{"line":110,"column":5,"offset":13622},"end":{"line":110,"column":44,"offset":13661},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":13618},"end":{"line":110,"column":44,"offset":13661},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.\nAny arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.","position":{"start":{"line":112,"column":1,"offset":13663},"end":{"line":113,"column":184,"offset":13974},"indent":[1]}}],"position":{"start":{"line":112,"column":1,"offset":13663},"end":{"line":113,"column":184,"offset":13974},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 8 – Interpretation.","position":{"start":{"line":115,"column":5,"offset":13980},"end":{"line":115,"column":32,"offset":14007},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":13976},"end":{"line":115,"column":32,"offset":14007},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.\nTo the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.\nNo term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.\nNothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.","position":{"start":{"line":117,"column":1,"offset":14009},"end":{"line":120,"column":235,"offset":14969},"indent":[1,1,1]}}],"position":{"start":{"line":117,"column":1,"offset":14009},"end":{"line":120,"column":235,"offset":14969},"indent":[1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":123,"column":1,"offset":14972},"end":{"line":123,"column":31,"offset":15002},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":123,"column":31,"offset":15002}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`CC BY-NC-SA 4.0`}

\n

{`Summary`}

\n

{`You are free to:`}

\n
    \n
  • {`Share — copy and redistribute the material in any medium or format`}
  • \n
  • {`Adapt — remix, transform, and build upon the material`}
  • \n
\n

{`The license`}

\n

{`Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License\nBy exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License (\"Public License\"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.`}

\n

{`Section 1 – Definitions.`}

\n

{`Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.\nAdapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.\nBY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.\nCopyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.\nEffective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.\nExceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.\nLicense Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.\nLicensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.\nLicensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.\nLicensor means the individual(s) or entity(ies) granting rights under this Public License.\nNonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.\nShare means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.\nSui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.\nYou means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.`}

\n

{`Section 2 – Scope.`}

\n

{`License grant.\nSubject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:\nreproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and\nproduce, reproduce, and Share Adapted Material for NonCommercial purposes only.\nExceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.\nTerm. The term of this Public License is specified in Section 6(a).\nMedia and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.\nDownstream recipients.\nOffer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.\nAdditional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.\nNo downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.\nNo endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).\nOther rights.`}

\n

{`Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.\nPatent and trademark rights are not licensed under this Public License.\nTo the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.`}

\n

{`Section 3 – License Conditions.`}

\n

{`Your exercise of the Licensed Rights is expressly made subject to the following conditions.`}

\n

{`Attribution.`}

\n

{`If You Share the Licensed Material (including in modified form), You must:`}

\n

{`retain the following if it is supplied by the Licensor with the Licensed Material:\nidentification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);\na copyright notice;\na notice that refers to this Public License;\na notice that refers to the disclaimer of warranties;\na URI or hyperlink to the Licensed Material to the extent reasonably practicable;\nindicate if You modified the Licensed Material and retain an indication of any previous modifications; and\nindicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.\nYou may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.\nIf requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.\nShareAlike.\nIn addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.`}

\n

{`The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.\nYou must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.\nYou may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.`}

\n

{`Section 4 – Sui Generis Database Rights.`}

\n

{`Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:`}

\n

{`for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;\nif You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and\nYou must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.\nFor the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.`}

\n

{`Section 5 – Disclaimer of Warranties and Limitation of Liability.`}

\n

{`Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.\nTo the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.\nThe disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.`}

\n

{`Section 6 – Term and Termination.`}

\n

{`This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.\nWhere Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:`}

\n

{`automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or\nupon express reinstatement by the Licensor.\nFor the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.\nFor the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.\nSections 1, 5, 6, 7, and 8 survive termination of this Public License.`}

\n

{`Section 7 – Other Terms and Conditions.`}

\n

{`The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.\nAny arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.`}

\n

{`Section 8 – Interpretation.`}

\n

{`For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.\nTo the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.\nNo term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.\nNothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760428000,"key":"gatsby-plugin-mdx-entire-payload-09b8db9882da82aa864a9d7f6d7faa1b-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"CC BY-NC-SA 4.0","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":18,"offset":176},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":18,"offset":176},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Summary","position":{"start":{"line":10,"column":4,"offset":181},"end":{"line":10,"column":11,"offset":188},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":178},"end":{"line":10,"column":11,"offset":188},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You are free to:","position":{"start":{"line":12,"column":1,"offset":190},"end":{"line":12,"column":17,"offset":206},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":190},"end":{"line":12,"column":17,"offset":206},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Share — copy and redistribute the material in any medium or format","position":{"start":{"line":14,"column":3,"offset":210},"end":{"line":14,"column":69,"offset":276},"indent":[]}}],"position":{"start":{"line":14,"column":3,"offset":210},"end":{"line":14,"column":69,"offset":276},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":208},"end":{"line":14,"column":69,"offset":276},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Adapt — remix, transform, and build upon the material","position":{"start":{"line":15,"column":3,"offset":279},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":15,"column":3,"offset":279},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":15,"column":1,"offset":277},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":208},"end":{"line":15,"column":56,"offset":332},"indent":[1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"The license","position":{"start":{"line":17,"column":4,"offset":337},"end":{"line":17,"column":15,"offset":348},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":334},"end":{"line":17,"column":15,"offset":348},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License\nBy exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License (\"Public License\"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.","position":{"start":{"line":19,"column":1,"offset":350},"end":{"line":20,"column":567,"offset":1003},"indent":[1]}}],"position":{"start":{"line":19,"column":1,"offset":350},"end":{"line":20,"column":567,"offset":1003},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 1 – Definitions.","position":{"start":{"line":22,"column":5,"offset":1009},"end":{"line":22,"column":29,"offset":1033},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1005},"end":{"line":22,"column":29,"offset":1033},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.\nAdapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.\nBY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.\nCopyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.\nEffective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.\nExceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.\nLicense Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.\nLicensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.\nLicensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.\nLicensor means the individual(s) or entity(ies) granting rights under this Public License.\nNonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.\nShare means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.\nSui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.\nYou means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.","position":{"start":{"line":24,"column":1,"offset":1035},"end":{"line":37,"column":127,"offset":4698},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":24,"column":1,"offset":1035},"end":{"line":37,"column":127,"offset":4698},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 2 – Scope.","position":{"start":{"line":39,"column":5,"offset":4704},"end":{"line":39,"column":23,"offset":4722},"indent":[]}}],"position":{"start":{"line":39,"column":1,"offset":4700},"end":{"line":39,"column":23,"offset":4722},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"License grant.\nSubject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:\nreproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and\nproduce, reproduce, and Share Adapted Material for NonCommercial purposes only.\nExceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.\nTerm. The term of this Public License is specified in Section 6(a).\nMedia and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.\nDownstream recipients.\nOffer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.\nAdditional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.\nNo downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.\nNo endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).\nOther rights.","position":{"start":{"line":41,"column":1,"offset":4724},"end":{"line":53,"column":14,"offset":7185},"indent":[1,1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":41,"column":1,"offset":4724},"end":{"line":53,"column":14,"offset":7185},"indent":[1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.\nPatent and trademark rights are not licensed under this Public License.\nTo the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.","position":{"start":{"line":55,"column":1,"offset":7187},"end":{"line":57,"column":420,"offset":8052},"indent":[1,1]}}],"position":{"start":{"line":55,"column":1,"offset":7187},"end":{"line":57,"column":420,"offset":8052},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 3 – License Conditions.","position":{"start":{"line":59,"column":5,"offset":8058},"end":{"line":59,"column":36,"offset":8089},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":8054},"end":{"line":59,"column":36,"offset":8089},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Your exercise of the Licensed Rights is expressly made subject to the following conditions.","position":{"start":{"line":61,"column":1,"offset":8091},"end":{"line":61,"column":92,"offset":8182},"indent":[]}}],"position":{"start":{"line":61,"column":1,"offset":8091},"end":{"line":61,"column":92,"offset":8182},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Attribution.","position":{"start":{"line":63,"column":1,"offset":8184},"end":{"line":63,"column":13,"offset":8196},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":8184},"end":{"line":63,"column":13,"offset":8196},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If You Share the Licensed Material (including in modified form), You must:","position":{"start":{"line":65,"column":1,"offset":8198},"end":{"line":65,"column":75,"offset":8272},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":8198},"end":{"line":65,"column":75,"offset":8272},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"retain the following if it is supplied by the Licensor with the Licensed Material:\nidentification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);\na copyright notice;\na notice that refers to this Public License;\na notice that refers to the disclaimer of warranties;\na URI or hyperlink to the Licensed Material to the extent reasonably practicable;\nindicate if You modified the Licensed Material and retain an indication of any previous modifications; and\nindicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.\nYou may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.\nIf requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.\nShareAlike.\nIn addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.","position":{"start":{"line":67,"column":1,"offset":8274},"end":{"line":78,"column":127,"offset":9587},"indent":[1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":67,"column":1,"offset":8274},"end":{"line":78,"column":127,"offset":9587},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.\nYou must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.\nYou may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.","position":{"start":{"line":80,"column":1,"offset":9589},"end":{"line":82,"column":231,"offset":10199},"indent":[1,1]}}],"position":{"start":{"line":80,"column":1,"offset":9589},"end":{"line":82,"column":231,"offset":10199},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 4 – Sui Generis Database Rights.","position":{"start":{"line":84,"column":5,"offset":10205},"end":{"line":84,"column":45,"offset":10245},"indent":[]}}],"position":{"start":{"line":84,"column":1,"offset":10201},"end":{"line":84,"column":45,"offset":10245},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:","position":{"start":{"line":86,"column":1,"offset":10247},"end":{"line":86,"column":111,"offset":10357},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":10247},"end":{"line":86,"column":111,"offset":10357},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;\nif You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and\nYou must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.\nFor the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.","position":{"start":{"line":88,"column":1,"offset":10359},"end":{"line":91,"column":189,"offset":11166},"indent":[1,1,1]}}],"position":{"start":{"line":88,"column":1,"offset":10359},"end":{"line":91,"column":189,"offset":11166},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 5 – Disclaimer of Warranties and Limitation of Liability.","position":{"start":{"line":93,"column":5,"offset":11172},"end":{"line":93,"column":70,"offset":11237},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":11168},"end":{"line":93,"column":70,"offset":11237},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.\nTo the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.\nThe disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.","position":{"start":{"line":95,"column":1,"offset":11239},"end":{"line":97,"column":213,"offset":12637},"indent":[1,1]}}],"position":{"start":{"line":95,"column":1,"offset":11239},"end":{"line":97,"column":213,"offset":12637},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 6 – Term and Termination.","position":{"start":{"line":99,"column":5,"offset":12643},"end":{"line":99,"column":38,"offset":12676},"indent":[]}}],"position":{"start":{"line":99,"column":1,"offset":12639},"end":{"line":99,"column":38,"offset":12676},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.\nWhere Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:","position":{"start":{"line":101,"column":1,"offset":12678},"end":{"line":102,"column":96,"offset":12990},"indent":[1]}}],"position":{"start":{"line":101,"column":1,"offset":12678},"end":{"line":102,"column":96,"offset":12990},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or\nupon express reinstatement by the Licensor.\nFor the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.\nFor the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.\nSections 1, 5, 6, 7, and 8 survive termination of this Public License.","position":{"start":{"line":104,"column":1,"offset":12992},"end":{"line":108,"column":71,"offset":13616},"indent":[1,1,1,1]}}],"position":{"start":{"line":104,"column":1,"offset":12992},"end":{"line":108,"column":71,"offset":13616},"indent":[1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 7 – Other Terms and Conditions.","position":{"start":{"line":110,"column":5,"offset":13622},"end":{"line":110,"column":44,"offset":13661},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":13618},"end":{"line":110,"column":44,"offset":13661},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.\nAny arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.","position":{"start":{"line":112,"column":1,"offset":13663},"end":{"line":113,"column":184,"offset":13974},"indent":[1]}}],"position":{"start":{"line":112,"column":1,"offset":13663},"end":{"line":113,"column":184,"offset":13974},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 8 – Interpretation.","position":{"start":{"line":115,"column":5,"offset":13980},"end":{"line":115,"column":32,"offset":14007},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":13976},"end":{"line":115,"column":32,"offset":14007},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.\nTo the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.\nNo term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.\nNothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.","position":{"start":{"line":117,"column":1,"offset":14009},"end":{"line":120,"column":235,"offset":14969},"indent":[1,1,1]}}],"position":{"start":{"line":117,"column":1,"offset":14009},"end":{"line":120,"column":235,"offset":14969},"indent":[1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":123,"column":1,"offset":14972},"end":{"line":123,"column":31,"offset":15002},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":123,"column":31,"offset":15002}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`CC BY-NC-SA 4.0`}

\n

{`Summary`}

\n

{`You are free to:`}

\n
    \n
  • {`Share — copy and redistribute the material in any medium or format`}
  • \n
  • {`Adapt — remix, transform, and build upon the material`}
  • \n
\n

{`The license`}

\n

{`Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License\nBy exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License (\"Public License\"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.`}

\n

{`Section 1 – Definitions.`}

\n

{`Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.\nAdapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.\nBY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.\nCopyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.\nEffective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.\nExceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.\nLicense Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.\nLicensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.\nLicensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.\nLicensor means the individual(s) or entity(ies) granting rights under this Public License.\nNonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.\nShare means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.\nSui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.\nYou means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.`}

\n

{`Section 2 – Scope.`}

\n

{`License grant.\nSubject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:\nreproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and\nproduce, reproduce, and Share Adapted Material for NonCommercial purposes only.\nExceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.\nTerm. The term of this Public License is specified in Section 6(a).\nMedia and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.\nDownstream recipients.\nOffer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.\nAdditional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.\nNo downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.\nNo endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).\nOther rights.`}

\n

{`Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.\nPatent and trademark rights are not licensed under this Public License.\nTo the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.`}

\n

{`Section 3 – License Conditions.`}

\n

{`Your exercise of the Licensed Rights is expressly made subject to the following conditions.`}

\n

{`Attribution.`}

\n

{`If You Share the Licensed Material (including in modified form), You must:`}

\n

{`retain the following if it is supplied by the Licensor with the Licensed Material:\nidentification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);\na copyright notice;\na notice that refers to this Public License;\na notice that refers to the disclaimer of warranties;\na URI or hyperlink to the Licensed Material to the extent reasonably practicable;\nindicate if You modified the Licensed Material and retain an indication of any previous modifications; and\nindicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.\nYou may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.\nIf requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.\nShareAlike.\nIn addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.`}

\n

{`The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.\nYou must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.\nYou may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.`}

\n

{`Section 4 – Sui Generis Database Rights.`}

\n

{`Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:`}

\n

{`for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;\nif You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and\nYou must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.\nFor the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.`}

\n

{`Section 5 – Disclaimer of Warranties and Limitation of Liability.`}

\n

{`Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.\nTo the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.\nThe disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.`}

\n

{`Section 6 – Term and Termination.`}

\n

{`This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.\nWhere Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:`}

\n

{`automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or\nupon express reinstatement by the Licensor.\nFor the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.\nFor the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.\nSections 1, 5, 6, 7, and 8 survive termination of this Public License.`}

\n

{`Section 7 – Other Terms and Conditions.`}

\n

{`The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.\nAny arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.`}

\n

{`Section 8 – Interpretation.`}

\n

{`For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.\nTo the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.\nNo term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.\nNothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4f42fbd8a078999f5a042225f8bc85ae.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4f42fbd8a078999f5a042225f8bc85ae.json deleted file mode 100644 index 392c48c..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-4f42fbd8a078999f5a042225f8bc85ae.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838525517000,"key":"gatsby-plugin-mdx-entire-payload-834badbc4524f6d48b67284023b65893-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but is not scalable of you want to monitor dozens. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":75,"offset":658},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":75,"offset":658},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":17,"column":1,"offset":661},"end":{"line":17,"column":31,"offset":691},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":17,"column":31,"offset":691}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but is not scalable of you want to monitor dozens. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-5281f4070cf65b2b8ab891bcf7590813.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-5281f4070cf65b2b8ab891bcf7590813.json new file mode 100644 index 0000000..e8ff741 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-5281f4070cf65b2b8ab891bcf7590813.json @@ -0,0 +1 @@ +{"expireTime":9007200838760428000,"key":"gatsby-plugin-mdx-entire-payload-b61e336f3354974ccd88c9bd9674a8ed-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Release notes","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":16,"offset":174},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":16,"offset":174},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.0","position":{"start":{"line":10,"column":5,"offset":180},"end":{"line":10,"column":10,"offset":185},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":10,"offset":185},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Factory","position":{"start":{"line":12,"column":6,"offset":192},"end":{"line":12,"column":13,"offset":199},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":187},"end":{"line":12,"column":13,"offset":199},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"React application using the Kubernetes Golang SDK.","position":{"start":{"line":14,"column":3,"offset":203},"end":{"line":14,"column":53,"offset":253},"indent":[]}}],"position":{"start":{"line":14,"column":3,"offset":203},"end":{"line":14,"column":53,"offset":253},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":201},"end":{"line":14,"column":53,"offset":253},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Possibility to add deployments one by one or in bulk (Excel).","position":{"start":{"line":15,"column":3,"offset":256},"end":{"line":15,"column":64,"offset":317},"indent":[]}}],"position":{"start":{"line":15,"column":3,"offset":256},"end":{"line":15,"column":64,"offset":317},"indent":[]}}],"position":{"start":{"line":15,"column":1,"offset":254},"end":{"line":15,"column":64,"offset":317},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Configure machinery deployments: select a region of interest, specify recording time (pre, andd post recording), specify time interval.","position":{"start":{"line":16,"column":3,"offset":320},"end":{"line":16,"column":138,"offset":455},"indent":[]}}],"position":{"start":{"line":16,"column":3,"offset":320},"end":{"line":16,"column":138,"offset":455},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":318},"end":{"line":16,"column":138,"offset":455},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":201},"end":{"line":16,"column":138,"offset":455},"indent":[1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":19,"column":1,"offset":458},"end":{"line":19,"column":31,"offset":488},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":19,"column":31,"offset":488}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Release notes`}

\n

{`1.0.0`}

\n

{`Factory`}

\n
    \n
  • {`React application using the Kubernetes Golang SDK.`}
  • \n
  • {`Possibility to add deployments one by one or in bulk (Excel).`}
  • \n
  • {`Configure machinery deployments: select a region of interest, specify recording time (pre, andd post recording), specify time interval.`}
  • \n
\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-599bc30edfcb33b4dad5ff3bccebfc78.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-599bc30edfcb33b4dad5ff3bccebfc78.json deleted file mode 100644 index 82a7225..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-599bc30edfcb33b4dad5ff3bccebfc78.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838682086000,"key":"gatsby-plugin-mdx-entire-payload-68187c15a33539fb7808173c6ff2e1bd-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":839},"end":{"line":16,"column":186,"offset":1024},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1029},"end":{"line":18,"column":14,"offset":1039},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1026},"end":{"line":18,"column":14,"offset":1039},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide the high-availability and fail over requirements customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape vertically.","position":{"start":{"line":20,"column":1,"offset":1041},"end":{"line":20,"column":237,"offset":1277},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1041},"end":{"line":20,"column":237,"offset":1277},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":23,"column":1,"offset":1280},"end":{"line":23,"column":31,"offset":1310},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":23,"column":31,"offset":1310}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.`}

\n
\n

{`Kubernetes`}

\n

{`To provide the high-availability and fail over requirements customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape vertically.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-5ffb5ccaea1427be0aca5e8c9a347100.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-5ffb5ccaea1427be0aca5e8c9a347100.json new file mode 100644 index 0000000..bd34937 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-5ffb5ccaea1427be0aca5e8c9a347100.json @@ -0,0 +1 @@ +{"expireTime":9007200838831156000,"key":"gatsby-plugin-mdx-entire-payload-32f04cfa4f8465018d38c7e0c5e828d9-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":115,"column":1,"offset":3500},"end":{"line":115,"column":8,"offset":3507},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":117,"column":4,"offset":3512},"end":{"line":117,"column":11,"offset":3519},"indent":[]}}],"position":{"start":{"line":117,"column":1,"offset":3509},"end":{"line":117,"column":11,"offset":3519},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":119,"column":1,"offset":3521},"end":{"line":119,"column":74,"offset":3594},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":119,"column":76,"offset":3596},"end":{"line":119,"column":83,"offset":3603},"indent":[]}}],"position":{"start":{"line":119,"column":74,"offset":3594},"end":{"line":119,"column":85,"offset":3605},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":119,"column":85,"offset":3605},"end":{"line":122,"column":76,"offset":3986},"indent":[1,1,1]}}],"position":{"start":{"line":119,"column":1,"offset":3521},"end":{"line":122,"column":76,"offset":3986},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":124,"column":1,"offset":3988},"end":{"line":124,"column":47,"offset":4034},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":126,"column":1,"offset":4036},"end":{"line":126,"column":26,"offset":4061},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":4036},"end":{"line":126,"column":26,"offset":4061},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":128,"column":1,"offset":4063},"end":{"line":128,"column":25,"offset":4087},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Running","position":{"start":{"line":130,"column":3,"offset":4091},"end":{"line":130,"column":10,"offset":4098},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":4089},"end":{"line":130,"column":10,"offset":4098},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":132,"column":1,"offset":4100},"end":{"line":132,"column":94,"offset":4193},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":4100},"end":{"line":132,"column":94,"offset":4193},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":134,"column":5,"offset":4199},"end":{"line":134,"column":12,"offset":4206},"indent":[]}}],"position":{"start":{"line":134,"column":5,"offset":4199},"end":{"line":134,"column":12,"offset":4206},"indent":[]}}],"position":{"start":{"line":134,"column":1,"offset":4195},"end":{"line":134,"column":12,"offset":4206},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":135,"column":5,"offset":4211},"end":{"line":135,"column":12,"offset":4218},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4211},"end":{"line":135,"column":12,"offset":4218},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4207},"end":{"line":135,"column":12,"offset":4218},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":136,"column":5,"offset":4223},"end":{"line":136,"column":12,"offset":4230},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4223},"end":{"line":136,"column":12,"offset":4230},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4219},"end":{"line":136,"column":12,"offset":4230},"indent":[]}}],"position":{"start":{"line":134,"column":1,"offset":4195},"end":{"line":136,"column":12,"offset":4230},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":138,"column":1,"offset":4232},"end":{"line":138,"column":26,"offset":4257},"indent":[]}}],"position":{"start":{"line":138,"column":1,"offset":4232},"end":{"line":138,"column":26,"offset":4257},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":140,"column":1,"offset":4259},"end":{"line":144,"column":73,"offset":4571},"indent":[1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":147,"column":1,"offset":4574},"end":{"line":147,"column":31,"offset":4604},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":147,"column":31,"offset":4604}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Running`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-624046d78bb6cbefc64c89c4b1c505a9.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-624046d78bb6cbefc64c89c4b1c505a9.json deleted file mode 100644 index b075d4b..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-624046d78bb6cbefc64c89c4b1c505a9.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838683680000,"key":"gatsby-plugin-mdx-entire-payload-82679a785fb340e7a3b87cc58df73951-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale them across your nodes (VM's/Baremetal). ","position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":209,"offset":1696},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":209,"offset":1696},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":27,"column":1,"offset":1699},"end":{"line":27,"column":31,"offset":1729},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":27,"column":31,"offset":1729}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n

{`Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale them across your nodes (VM's/Baremetal). `}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-63b018dce1ea299800d11ba4baf3f0d7.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-63b018dce1ea299800d11ba4baf3f0d7.json index 3af8fac..54e5395 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-63b018dce1ea299800d11ba4baf3f0d7.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-63b018dce1ea299800d11ba4baf3f0d7.json @@ -1 +1 @@ -{"expireTime":9007200838510906000,"key":"gatsby-plugin-mdx-entire-payload-3268934987db5f9117642459e604986d-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import { Playground, Props } from 'docz'","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":41,"offset":199},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":10,"column":3,"offset":203},"end":{"line":10,"column":12,"offset":212},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":201},"end":{"line":10,"column":12,"offset":212},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The machinery is the processing engine of Kerberos Open Source. It's an image processing framework, written in C++, who benefits from other third party libraries (OpenCV, etc). It takes images from the type of camera (USB-, IP- or RPi-camera) you've configured in the configuration files and executes one ore more algorithms and post-processes (e.g. save a snapshot). The configuration files allow you to define the type of camera, post-processes, conditions and much more; it's highly configurable. It's important to note that the machinery, out-of-the-box, can handle only one camera at a time.","position":{"start":{"line":12,"column":1,"offset":214},"end":{"line":12,"column":597,"offset":810},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":214},"end":{"line":12,"column":597,"offset":810},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Project structure","position":{"start":{"line":14,"column":4,"offset":815},"end":{"line":14,"column":21,"offset":832},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":812},"end":{"line":14,"column":21,"offset":832},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The machinery is an image processing framework which is devided into four steps:","position":{"start":{"line":16,"column":1,"offset":834},"end":{"line":16,"column":81,"offset":914},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":834},"end":{"line":16,"column":81,"offset":914},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"condition","position":{"start":{"line":18,"column":3,"offset":918},"end":{"line":18,"column":12,"offset":927},"indent":[]}}],"position":{"start":{"line":18,"column":3,"offset":918},"end":{"line":18,"column":12,"offset":927},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":916},"end":{"line":18,"column":12,"offset":927},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"algorithm","position":{"start":{"line":19,"column":3,"offset":930},"end":{"line":19,"column":12,"offset":939},"indent":[]}}],"position":{"start":{"line":19,"column":3,"offset":930},"end":{"line":19,"column":12,"offset":939},"indent":[]}}],"position":{"start":{"line":19,"column":1,"offset":928},"end":{"line":19,"column":12,"offset":939},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"expositor","position":{"start":{"line":20,"column":3,"offset":942},"end":{"line":20,"column":12,"offset":951},"indent":[]}}],"position":{"start":{"line":20,"column":3,"offset":942},"end":{"line":20,"column":12,"offset":951},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":940},"end":{"line":20,"column":12,"offset":951},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"heuristic","position":{"start":{"line":21,"column":3,"offset":954},"end":{"line":21,"column":12,"offset":963},"indent":[]}}],"position":{"start":{"line":21,"column":3,"offset":954},"end":{"line":21,"column":12,"offset":963},"indent":[]}}],"position":{"start":{"line":21,"column":1,"offset":952},"end":{"line":21,"column":12,"offset":963},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":916},"end":{"line":21,"column":12,"offset":963},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"The steps belong to a four passway; illustrated on the image below. In each cycle a sequence of images is processed. Each step will process the sequence, and will return some result to the next step. For example: an algorithm will process the images and returns an array to the Expositor, which contains boolean values. The steps are loosly coupled, so they have simple conventions, just like the example before.","position":{"start":{"line":23,"column":1,"offset":965},"end":{"line":23,"column":413,"offset":1377},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":965},"end":{"line":23,"column":413,"offset":1377},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Thanks to the loosly coupling, each step can be developed indepently. So algorithms, expositors, heuristics and conditions can be switched on the fly. This makes it easier for other developers who want to contribute to the machinery. They can create a new algorithm without knowing how a specific expositor or heuristic works. They just need to be aware of the convention an algorithm should meet.","position":{"start":{"line":25,"column":1,"offset":1379},"end":{"line":25,"column":398,"offset":1776},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":1379},"end":{"line":25,"column":398,"offset":1776},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/machinery/project_structure.png","alt":"machinery project structure","position":{"start":{"line":27,"column":1,"offset":1778},"end":{"line":27,"column":84,"offset":1861},"indent":[]}}],"position":{"start":{"line":27,"column":1,"offset":1778},"end":{"line":27,"column":84,"offset":1861},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"These different steps can be configured by editing a couple of configurationn files located at ","position":{"start":{"line":29,"column":1,"offset":1863},"end":{"line":29,"column":96,"offset":1958},"indent":[]}},{"type":"inlineCode","value":"config/","position":{"start":{"line":29,"column":96,"offset":1958},"end":{"line":29,"column":105,"offset":1967},"indent":[]}},{"type":"text","value":". The main configuration file ","position":{"start":{"line":29,"column":105,"offset":1967},"end":{"line":29,"column":135,"offset":1997},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":29,"column":135,"offset":1997},"end":{"line":29,"column":154,"offset":2016},"indent":[]}},{"type":"text","value":" looks like this:","position":{"start":{"line":29,"column":154,"offset":2016},"end":{"line":29,"column":171,"offset":2033},"indent":[]}}],"position":{"start":{"line":29,"column":1,"offset":1863},"end":{"line":29,"column":171,"offset":2033},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n frontdoor\n false\n Europe-Brussels\n RaspiCamera\n Mjpg\n Enabled\n DifferentialCollins\n Hull\n Sequence\n Video\n S3\n \n","position":{"start":{"line":31,"column":1,"offset":2035},"end":{"line":48,"column":4,"offset":2690},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Capture","position":{"start":{"line":50,"column":4,"offset":2695},"end":{"line":50,"column":11,"offset":2702},"indent":[]}}],"position":{"start":{"line":50,"column":1,"offset":2692},"end":{"line":50,"column":11,"offset":2702},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can choose which capture device you will be using, you can use your old USB webcam, the popular Raspberry Pi camera or a state-of-the-art IP camera. The capture device will take pictures and deliver them to the algorithm if the conditions (the first step of the four passway) are valid.","position":{"start":{"line":52,"column":1,"offset":2704},"end":{"line":52,"column":291,"offset":2994},"indent":[]}}],"position":{"start":{"line":52,"column":1,"offset":2704},"end":{"line":52,"column":291,"offset":2994},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can change the capture device by changing the ","position":{"start":{"line":54,"column":1,"offset":2996},"end":{"line":54,"column":51,"offset":3046},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":54,"column":51,"offset":3046},"end":{"line":54,"column":70,"offset":3065},"indent":[]}},{"type":"text","value":" file, and choose one of the following:","position":{"start":{"line":54,"column":70,"offset":3065},"end":{"line":54,"column":109,"offset":3104},"indent":[]}}],"position":{"start":{"line":54,"column":1,"offset":2996},"end":{"line":54,"column":109,"offset":3104},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"USBCamera","position":{"start":{"line":55,"column":3,"offset":3107},"end":{"line":55,"column":12,"offset":3116},"indent":[]}}],"position":{"start":{"line":55,"column":3,"offset":3107},"end":{"line":55,"column":12,"offset":3116},"indent":[]}}],"position":{"start":{"line":55,"column":1,"offset":3105},"end":{"line":55,"column":12,"offset":3116},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"RaspiCamera","position":{"start":{"line":56,"column":3,"offset":3119},"end":{"line":56,"column":14,"offset":3130},"indent":[]}}],"position":{"start":{"line":56,"column":3,"offset":3119},"end":{"line":56,"column":14,"offset":3130},"indent":[]}}],"position":{"start":{"line":56,"column":1,"offset":3117},"end":{"line":56,"column":14,"offset":3130},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"IPCamera","position":{"start":{"line":57,"column":3,"offset":3133},"end":{"line":57,"column":11,"offset":3141},"indent":[]}}],"position":{"start":{"line":57,"column":3,"offset":3133},"end":{"line":57,"column":11,"offset":3141},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":3131},"end":{"line":57,"column":11,"offset":3141},"indent":[]}}],"position":{"start":{"line":55,"column":1,"offset":3105},"end":{"line":57,"column":11,"offset":3141},"indent":[1,1]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n RaspiCamera\n ...\n \n","position":{"start":{"line":59,"column":1,"offset":3143},"end":{"line":68,"column":4,"offset":3295},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"USB camera","position":{"start":{"line":70,"column":5,"offset":3301},"end":{"line":70,"column":15,"offset":3311},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":3297},"end":{"line":70,"column":15,"offset":3311},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The machinery supports a whole range of USB cameras. You will find a complete list here. Make sure you have updated the web interface, to make the machinery aware you will be using an USB camera.","position":{"start":{"line":72,"column":1,"offset":3313},"end":{"line":72,"column":196,"offset":3508},"indent":[]}}],"position":{"start":{"line":72,"column":1,"offset":3313},"end":{"line":72,"column":196,"offset":3508},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":74,"column":6,"offset":3515},"end":{"line":74,"column":16,"offset":3525},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":3510},"end":{"line":74,"column":16,"offset":3525},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the USB camera can be found in the ","position":{"start":{"line":76,"column":1,"offset":3527},"end":{"line":76,"column":54,"offset":3580},"indent":[]}},{"type":"inlineCode","value":"config/capture.xml","position":{"start":{"line":76,"column":54,"offset":3580},"end":{"line":76,"column":74,"offset":3600},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":76,"column":74,"offset":3600},"end":{"line":76,"column":179,"offset":3705},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":3527},"end":{"line":76,"column":179,"offset":3705},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 1280\n 720\n 0\n 0\n 0\n \n","position":{"start":{"line":78,"column":1,"offset":3707},"end":{"line":88,"column":4,"offset":3985},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Framewidth and -height","position":{"start":{"line":90,"column":7,"offset":3993},"end":{"line":90,"column":29,"offset":4015},"indent":[]}}],"position":{"start":{"line":90,"column":1,"offset":3987},"end":{"line":90,"column":29,"offset":4015},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can set the resolution of the capture device, make sure the resolution you've defined is valid with your camera. Please check the specs of the USB camera you're using.","position":{"start":{"line":92,"column":1,"offset":4017},"end":{"line":92,"column":172,"offset":4188},"indent":[]}}],"position":{"start":{"line":92,"column":1,"offset":4017},"end":{"line":92,"column":172,"offset":4188},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Device number","position":{"start":{"line":94,"column":7,"offset":4196},"end":{"line":94,"column":20,"offset":4209},"indent":[]}}],"position":{"start":{"line":94,"column":1,"offset":4190},"end":{"line":94,"column":20,"offset":4209},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If more than one device is connected, you can specify the index of the USB-camera. The index is an integer (1-5).","position":{"start":{"line":96,"column":1,"offset":4211},"end":{"line":96,"column":114,"offset":4324},"indent":[]}}],"position":{"start":{"line":96,"column":1,"offset":4211},"end":{"line":96,"column":114,"offset":4324},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Delay","position":{"start":{"line":98,"column":7,"offset":4332},"end":{"line":98,"column":12,"offset":4337},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":4326},"end":{"line":98,"column":12,"offset":4337},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can provide a delay/interval (milliseconds) between two captures.","position":{"start":{"line":100,"column":1,"offset":4339},"end":{"line":100,"column":70,"offset":4408},"indent":[]}}],"position":{"start":{"line":100,"column":1,"offset":4339},"end":{"line":100,"column":70,"offset":4408},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Angle","position":{"start":{"line":102,"column":7,"offset":4416},"end":{"line":102,"column":12,"offset":4421},"indent":[]}}],"position":{"start":{"line":102,"column":1,"offset":4410},"end":{"line":102,"column":12,"offset":4421},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.","position":{"start":{"line":104,"column":1,"offset":4423},"end":{"line":104,"column":218,"offset":4640},"indent":[]}}],"position":{"start":{"line":104,"column":1,"offset":4423},"end":{"line":104,"column":218,"offset":4640},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Raspberry Pi Camera Module","position":{"start":{"line":106,"column":5,"offset":4646},"end":{"line":106,"column":31,"offset":4672},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":4642},"end":{"line":106,"column":31,"offset":4672},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can use the Raspberry Pi Camera Module with the machinery. You just need to attach the camera module and you're ready to go. The Raspberry Pi Camera Module is enabled by default in the web.","position":{"start":{"line":108,"column":1,"offset":4674},"end":{"line":108,"column":194,"offset":4867},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":4674},"end":{"line":108,"column":194,"offset":4867},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":110,"column":6,"offset":4874},"end":{"line":110,"column":16,"offset":4884},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":4869},"end":{"line":110,"column":16,"offset":4884},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Raspberry Pi Camera Module can be found in the config/capture.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":112,"column":1,"offset":4886},"end":{"line":112,"column":193,"offset":5078},"indent":[]}}],"position":{"start":{"line":112,"column":1,"offset":4886},"end":{"line":112,"column":193,"offset":5078},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 640\n 480\n 1400\n 0\n 30\n 0\n 0\n 0\n 50\n \n","position":{"start":{"line":114,"column":1,"offset":5080},"end":{"line":128,"column":4,"offset":5534},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Framewidth and -height","position":{"start":{"line":130,"column":7,"offset":5542},"end":{"line":130,"column":29,"offset":5564},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":5536},"end":{"line":130,"column":29,"offset":5564},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can set the resolution of the camera module, make sure the resolution you've defined is valid.","position":{"start":{"line":132,"column":1,"offset":5566},"end":{"line":132,"column":99,"offset":5664},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":5566},"end":{"line":132,"column":99,"offset":5664},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Delay","position":{"start":{"line":134,"column":7,"offset":5672},"end":{"line":134,"column":12,"offset":5677},"indent":[]}}],"position":{"start":{"line":134,"column":1,"offset":5666},"end":{"line":134,"column":12,"offset":5677},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can provide a delay/interval (milliseconds) between two captures.","position":{"start":{"line":136,"column":1,"offset":5679},"end":{"line":136,"column":70,"offset":5748},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":5679},"end":{"line":136,"column":70,"offset":5748},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Angle","position":{"start":{"line":138,"column":7,"offset":5756},"end":{"line":138,"column":12,"offset":5761},"indent":[]}}],"position":{"start":{"line":138,"column":1,"offset":5750},"end":{"line":138,"column":12,"offset":5761},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.","position":{"start":{"line":140,"column":1,"offset":5763},"end":{"line":140,"column":218,"offset":5980},"indent":[]}}],"position":{"start":{"line":140,"column":1,"offset":5763},"end":{"line":140,"column":218,"offset":5980},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Framerate","position":{"start":{"line":142,"column":7,"offset":5988},"end":{"line":142,"column":16,"offset":5997},"indent":[]}}],"position":{"start":{"line":142,"column":1,"offset":5982},"end":{"line":142,"column":16,"offset":5997},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The number of frames captures per second. Please note that this parameter will also be used if you're recording video. E.g. if you set this parameter to 20, you're recorded videos will also be 20 FPS.","position":{"start":{"line":144,"column":1,"offset":5999},"end":{"line":144,"column":201,"offset":6199},"indent":[]}}],"position":{"start":{"line":144,"column":1,"offset":5999},"end":{"line":144,"column":201,"offset":6199},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Sharpness, saturation, contrast, brightness","position":{"start":{"line":146,"column":7,"offset":6207},"end":{"line":146,"column":50,"offset":6250},"indent":[]}}],"position":{"start":{"line":146,"column":1,"offset":6201},"end":{"line":146,"column":50,"offset":6250},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Camera properties which you can specify to tune the settings to your needs.","position":{"start":{"line":148,"column":1,"offset":6252},"end":{"line":148,"column":76,"offset":6327},"indent":[]}}],"position":{"start":{"line":148,"column":1,"offset":6252},"end":{"line":148,"column":76,"offset":6327},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"IP camera","position":{"start":{"line":150,"column":5,"offset":6333},"end":{"line":150,"column":14,"offset":6342},"indent":[]}}],"position":{"start":{"line":150,"column":1,"offset":6329},"end":{"line":150,"column":14,"offset":6342},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The machinery can be used with any IP camera, that provides a RTSP (or MJPEG) stream. Make sure that you know the correct URL of your IP camera, you can ","position":{"start":{"line":152,"column":1,"offset":6344},"end":{"line":152,"column":154,"offset":6497},"indent":[]}},{"type":"link","title":null,"url":"http://www.ispyconnect.com/sources.aspx","children":[{"type":"text","value":"find a list here","position":{"start":{"line":152,"column":155,"offset":6498},"end":{"line":152,"column":171,"offset":6514},"indent":[]}}],"position":{"start":{"line":152,"column":154,"offset":6497},"end":{"line":152,"column":213,"offset":6556},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":152,"column":213,"offset":6556},"end":{"line":152,"column":214,"offset":6557},"indent":[]}}],"position":{"start":{"line":152,"column":1,"offset":6344},"end":{"line":152,"column":214,"offset":6557},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":154,"column":6,"offset":6564},"end":{"line":154,"column":16,"offset":6574},"indent":[]}}],"position":{"start":{"line":154,"column":1,"offset":6559},"end":{"line":154,"column":16,"offset":6574},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the IP capture device can be found in the ","position":{"start":{"line":156,"column":1,"offset":6576},"end":{"line":156,"column":61,"offset":6636},"indent":[]}},{"type":"inlineCode","value":"config/capture.xml","position":{"start":{"line":156,"column":61,"offset":6636},"end":{"line":156,"column":81,"offset":6656},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":156,"column":81,"offset":6656},"end":{"line":156,"column":186,"offset":6761},"indent":[]}}],"position":{"start":{"line":156,"column":1,"offset":6576},"end":{"line":156,"column":186,"offset":6761},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n http://username:password@ipaddress/image.jpg\n 800\n 640\n 0\n 0\n \n","position":{"start":{"line":158,"column":1,"offset":6763},"end":{"line":168,"column":4,"offset":7061},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"URL","position":{"start":{"line":170,"column":7,"offset":7069},"end":{"line":170,"column":10,"offset":7072},"indent":[]}}],"position":{"start":{"line":170,"column":1,"offset":7063},"end":{"line":170,"column":10,"offset":7072},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To use your IP camera, you should provide a valid RTSP (or MJPEG) URL. The machinery will take snapshots from this stream.","position":{"start":{"line":172,"column":1,"offset":7074},"end":{"line":172,"column":123,"offset":7196},"indent":[]}}],"position":{"start":{"line":172,"column":1,"offset":7074},"end":{"line":172,"column":123,"offset":7196},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Framewidth and -height","position":{"start":{"line":174,"column":7,"offset":7204},"end":{"line":174,"column":29,"offset":7226},"indent":[]}}],"position":{"start":{"line":174,"column":1,"offset":7198},"end":{"line":174,"column":29,"offset":7226},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can set the resolution of the capture device, make sure the resolution you've defined is equal to the resolution you've defined in your IP-camera software.","position":{"start":{"line":176,"column":1,"offset":7228},"end":{"line":176,"column":160,"offset":7387},"indent":[]}}],"position":{"start":{"line":176,"column":1,"offset":7228},"end":{"line":176,"column":160,"offset":7387},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Delay","position":{"start":{"line":178,"column":7,"offset":7395},"end":{"line":178,"column":12,"offset":7400},"indent":[]}}],"position":{"start":{"line":178,"column":1,"offset":7389},"end":{"line":178,"column":12,"offset":7400},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can provide a delay/interval (milliseconds) between two captures.","position":{"start":{"line":180,"column":1,"offset":7402},"end":{"line":180,"column":70,"offset":7471},"indent":[]}}],"position":{"start":{"line":180,"column":1,"offset":7402},"end":{"line":180,"column":70,"offset":7471},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Angle","position":{"start":{"line":182,"column":7,"offset":7479},"end":{"line":182,"column":12,"offset":7484},"indent":[]}}],"position":{"start":{"line":182,"column":1,"offset":7473},"end":{"line":182,"column":12,"offset":7484},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.","position":{"start":{"line":184,"column":1,"offset":7486},"end":{"line":184,"column":218,"offset":7703},"indent":[]}}],"position":{"start":{"line":184,"column":1,"offset":7486},"end":{"line":184,"column":218,"offset":7703},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Condition","position":{"start":{"line":186,"column":4,"offset":7708},"end":{"line":186,"column":13,"offset":7717},"indent":[]}}],"position":{"start":{"line":186,"column":1,"offset":7705},"end":{"line":186,"column":13,"offset":7717},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The condition is the first step of the four passway. In this step the machinery will determine if it's allowed to proceed to the next step. For example a condition can be a time constraint, a brightness threshold, etc; multiple conditions can be selected.","position":{"start":{"line":188,"column":1,"offset":7719},"end":{"line":188,"column":256,"offset":7974},"indent":[]}}],"position":{"start":{"line":188,"column":1,"offset":7719},"end":{"line":188,"column":256,"offset":7974},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n Enabled\n ...\n \n","position":{"start":{"line":190,"column":1,"offset":7976},"end":{"line":199,"column":4,"offset":8146},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Enabled","position":{"start":{"line":201,"column":5,"offset":8152},"end":{"line":201,"column":12,"offset":8159},"indent":[]}}],"position":{"start":{"line":201,"column":1,"offset":8148},"end":{"line":201,"column":12,"offset":8159},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It can be helpful to enable or disable the machinery at specific times. Therefore the time condition makes it possible to select a time range for each day of the week. When the current time is within the time range, the machinery will be enabled.","position":{"start":{"line":203,"column":1,"offset":8161},"end":{"line":203,"column":247,"offset":8407},"indent":[]}}],"position":{"start":{"line":203,"column":1,"offset":8161},"end":{"line":203,"column":247,"offset":8407},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":205,"column":6,"offset":8414},"end":{"line":205,"column":16,"offset":8424},"indent":[]}}],"position":{"start":{"line":205,"column":1,"offset":8409},"end":{"line":205,"column":16,"offset":8424},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Enabled condition can be found in the ","position":{"start":{"line":207,"column":1,"offset":8426},"end":{"line":207,"column":61,"offset":8486},"indent":[]}},{"type":"inlineCode","value":"config/condition.xml","position":{"start":{"line":207,"column":61,"offset":8486},"end":{"line":207,"column":83,"offset":8508},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":207,"column":83,"offset":8508},"end":{"line":207,"column":188,"offset":8613},"indent":[]}}],"position":{"start":{"line":207,"column":1,"offset":8426},"end":{"line":207,"column":188,"offset":8613},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n true\n 5000\n \n","position":{"start":{"line":209,"column":1,"offset":8615},"end":{"line":216,"column":4,"offset":8753},"indent":[1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Active","position":{"start":{"line":218,"column":7,"offset":8761},"end":{"line":218,"column":13,"offset":8767},"indent":[]}}],"position":{"start":{"line":218,"column":1,"offset":8755},"end":{"line":218,"column":13,"offset":8767},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The active field is boolean value (true/false). When the active field is true, the machinery is enabled, if not it's disabled.","position":{"start":{"line":220,"column":1,"offset":8769},"end":{"line":220,"column":127,"offset":8895},"indent":[]}}],"position":{"start":{"line":220,"column":1,"offset":8769},"end":{"line":220,"column":127,"offset":8895},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Delay","position":{"start":{"line":222,"column":7,"offset":8903},"end":{"line":222,"column":12,"offset":8908},"indent":[]}}],"position":{"start":{"line":222,"column":1,"offset":8897},"end":{"line":222,"column":12,"offset":8908},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The delay value is used when the condition failed, so when the current time isn't in the selected time range for that day. In that case the machinery will idle for the specified delay time. The value of the delay is expressed in miliseconds.","position":{"start":{"line":224,"column":1,"offset":8910},"end":{"line":224,"column":242,"offset":9151},"indent":[]}}],"position":{"start":{"line":224,"column":1,"offset":8910},"end":{"line":224,"column":242,"offset":9151},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Time","position":{"start":{"line":226,"column":5,"offset":9157},"end":{"line":226,"column":9,"offset":9161},"indent":[]}}],"position":{"start":{"line":226,"column":1,"offset":9153},"end":{"line":226,"column":9,"offset":9161},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It can be helpful to enable or disable the machinery at specific times. Therefore the time condition makes it possible to select a time range for each day of the week. When the current time is within the time range, the machinery will be enabled.","position":{"start":{"line":228,"column":1,"offset":9163},"end":{"line":228,"column":247,"offset":9409},"indent":[]}}],"position":{"start":{"line":228,"column":1,"offset":9163},"end":{"line":228,"column":247,"offset":9409},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":230,"column":6,"offset":9416},"end":{"line":230,"column":16,"offset":9426},"indent":[]}}],"position":{"start":{"line":230,"column":1,"offset":9411},"end":{"line":230,"column":16,"offset":9426},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Time condition can be found in the ","position":{"start":{"line":232,"column":1,"offset":9428},"end":{"line":232,"column":58,"offset":9485},"indent":[]}},{"type":"inlineCode","value":"config/condition.xml","position":{"start":{"line":232,"column":58,"offset":9485},"end":{"line":232,"column":80,"offset":9507},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":232,"column":80,"offset":9507},"end":{"line":232,"column":185,"offset":9612},"indent":[]}}],"position":{"start":{"line":232,"column":1,"offset":9428},"end":{"line":232,"column":185,"offset":9612},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n","position":{"start":{"line":234,"column":1,"offset":9614},"end":{"line":241,"column":4,"offset":9813},"indent":[1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Times","position":{"start":{"line":243,"column":7,"offset":9821},"end":{"line":243,"column":12,"offset":9826},"indent":[]}}],"position":{"start":{"line":243,"column":1,"offset":9815},"end":{"line":243,"column":12,"offset":9826},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The times property contains a list of times, delimited by a \"-\". The first item in the list will specify the time range for the first day of the week (Monday), the last item for the last day of the week (Sunday). The begin- and end-time, for a specific day, are delimited by a \",\" where the first element will specify that start time and the second one specifies the end time.","position":{"start":{"line":245,"column":1,"offset":9828},"end":{"line":245,"column":377,"offset":10204},"indent":[]}}],"position":{"start":{"line":245,"column":1,"offset":9828},"end":{"line":245,"column":377,"offset":10204},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Delay","position":{"start":{"line":247,"column":7,"offset":10212},"end":{"line":247,"column":12,"offset":10217},"indent":[]}}],"position":{"start":{"line":247,"column":1,"offset":10206},"end":{"line":247,"column":12,"offset":10217},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The delay value is used when the condition failed, so when the current time isn't in the selected time range for that day. In that case the machinery will idle for the specified delay time. The value of the delay is expressed in miliseconds.","position":{"start":{"line":249,"column":1,"offset":10219},"end":{"line":249,"column":242,"offset":10460},"indent":[]}}],"position":{"start":{"line":249,"column":1,"offset":10219},"end":{"line":249,"column":242,"offset":10460},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Algorithm","position":{"start":{"line":251,"column":4,"offset":10465},"end":{"line":251,"column":13,"offset":10474},"indent":[]}}],"position":{"start":{"line":251,"column":1,"offset":10462},"end":{"line":251,"column":13,"offset":10474},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The algorithm is the second step of the four passway. An algorithm will execute some kind of function on a sequence of images, and end up with a black and white image; just like the image below. An example of an algorithm would be one that does motion detection or one that would detect cats or dogs (using TensorFlow, ar any other Deep Learning framework).","position":{"start":{"line":253,"column":1,"offset":10476},"end":{"line":253,"column":358,"offset":10833},"indent":[]}}],"position":{"start":{"line":253,"column":1,"offset":10476},"end":{"line":253,"column":358,"offset":10833},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/machinery/algorithm.png","alt":"machinery algorithm","position":{"start":{"line":255,"column":1,"offset":10835},"end":{"line":255,"column":68,"offset":10902},"indent":[]}}],"position":{"start":{"line":255,"column":1,"offset":10835},"end":{"line":255,"column":68,"offset":10902},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The white pixels on the image will indicate the object of interest. For example, when looking for motion, the pixels that have been changed; it depends on what the algorithm is looking for. The black pixels are background pixels.","position":{"start":{"line":257,"column":1,"offset":10904},"end":{"line":257,"column":230,"offset":11133},"indent":[]}}],"position":{"start":{"line":257,"column":1,"offset":10904},"end":{"line":257,"column":230,"offset":11133},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The only convention that an algorithm should meet is that it should return a black and white image to the next step; the expositor. And of course that it requires a sequence of images as a parameter. Besides those conventions, an algorithm can do everything it wants to do. So you could create your own cat detection algorithm, marker detection, etc.","position":{"start":{"line":259,"column":1,"offset":11135},"end":{"line":259,"column":351,"offset":11485},"indent":[]}}],"position":{"start":{"line":259,"column":1,"offset":11135},"end":{"line":259,"column":351,"offset":11485},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can select the algortihm in the ","position":{"start":{"line":261,"column":1,"offset":11487},"end":{"line":261,"column":37,"offset":11523},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":261,"column":37,"offset":11523},"end":{"line":261,"column":56,"offset":11542},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":261,"column":56,"offset":11542},"end":{"line":261,"column":57,"offset":11543},"indent":[]}}],"position":{"start":{"line":261,"column":1,"offset":11487},"end":{"line":261,"column":57,"offset":11543},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n DifferentialCollins\n ...\n \n","position":{"start":{"line":263,"column":1,"offset":11545},"end":{"line":272,"column":4,"offset":11711},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Differential images","position":{"start":{"line":274,"column":5,"offset":11717},"end":{"line":274,"column":24,"offset":11736},"indent":[]}}],"position":{"start":{"line":274,"column":1,"offset":11713},"end":{"line":274,"column":24,"offset":11736},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This algorithm is a very simple method to detect motion; in terms of understanding but also processing. Just like the name says, it's the result of comparing images. When the images are compared, we know the pixels that have been changed and if the amount of pixels that changed is big enough, one can say that something happened and thus motion was detected.","position":{"start":{"line":276,"column":1,"offset":11738},"end":{"line":276,"column":360,"offset":12097},"indent":[]}}],"position":{"start":{"line":276,"column":1,"offset":11738},"end":{"line":276,"column":360,"offset":12097},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To get a more technical explanation: the algoritm will substract 2 or more images, and once that is done it will end up with a black and white image. The white pixels will mark the pixels that where different/changed and the black pixels are the pixels that have not changed; background pixels. Please note that there are several different combinations of substracting images. However for the machinery, we will use the method of Collins et al. as this method erases the phenomenon \"ghosting\".","position":{"start":{"line":278,"column":1,"offset":12099},"end":{"line":278,"column":494,"offset":12592},"indent":[]}}],"position":{"start":{"line":278,"column":1,"offset":12099},"end":{"line":278,"column":494,"offset":12592},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/machinery/differential_images.png","alt":"machinery differential","position":{"start":{"line":280,"column":1,"offset":12594},"end":{"line":280,"column":81,"offset":12674},"indent":[]}}],"position":{"start":{"line":280,"column":1,"offset":12594},"end":{"line":280,"column":81,"offset":12674},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"In the image above the method of Collins et al. is illustrated. For this method we will process three images. The images are a sequence (from left to right), so the first (A) image was taken before the second (B) one, and the second (B) before the third (C) one. Next we will do a first comparision (C-B) of the third (C) image and the second (B) image, and after that we will do a second comparison (C-A) of the third (C) image and first (A) image.","position":{"start":{"line":282,"column":1,"offset":12676},"end":{"line":282,"column":450,"offset":13125},"indent":[]}}],"position":{"start":{"line":282,"column":1,"offset":12676},"end":{"line":282,"column":450,"offset":13125},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"After the comparison we will end up with two difference images (C-B) and (C-A); both will mark the white pixels as changed pixels and black as non-changed pixels. To finish the algorithm we will do a logical AND-operation of the two difference images; this will give us the final black and white image ((C-B)&&(C-A)).","position":{"start":{"line":284,"column":1,"offset":13127},"end":{"line":284,"column":318,"offset":13444},"indent":[]}}],"position":{"start":{"line":284,"column":1,"offset":13127},"end":{"line":284,"column":318,"offset":13444},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The main idea of the Colins et al. method, is that it will erase \"ghosting\". In the last step we are doing a logical AND-operation, by doing this we will only keep the pixels, that changed in the first two images; therefore we can elimante false positives.","position":{"start":{"line":286,"column":1,"offset":13446},"end":{"line":286,"column":257,"offset":13702},"indent":[]}}],"position":{"start":{"line":286,"column":1,"offset":13446},"end":{"line":286,"column":257,"offset":13702},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":288,"column":6,"offset":13709},"end":{"line":288,"column":16,"offset":13719},"indent":[]}}],"position":{"start":{"line":288,"column":1,"offset":13704},"end":{"line":288,"column":16,"offset":13719},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Differential images algorithm can be found in the config/algorithm.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":290,"column":1,"offset":13721},"end":{"line":290,"column":198,"offset":13918},"indent":[]}}],"position":{"start":{"line":290,"column":1,"offset":13721},"end":{"line":290,"column":198,"offset":13918},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 5\n 20\n \n","position":{"start":{"line":292,"column":1,"offset":13920},"end":{"line":299,"column":4,"offset":14085},"indent":[1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Erode","position":{"start":{"line":301,"column":7,"offset":14093},"end":{"line":301,"column":12,"offset":14098},"indent":[]}}],"position":{"start":{"line":301,"column":1,"offset":14087},"end":{"line":301,"column":12,"offset":14098},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The erode parameter represents a structural element (a morphological operation), which will be used to minimize the changed pixels; more information about eroding can be found here. The idea of the eroding is that pixels which are isolated will be removed; this means that when only one pixel changed, that pixel will reverted to the non-changed state. But for example when a large change happens and a lot of adjacent pixels are changed, the eroding will not be able to revert them.","position":{"start":{"line":303,"column":1,"offset":14100},"end":{"line":303,"column":484,"offset":14583},"indent":[]}}],"position":{"start":{"line":303,"column":1,"offset":14100},"end":{"line":303,"column":484,"offset":14583},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The higher the number of the erode parameter, the more aggressive the eroding will be. So high erode values, will make it possible that also large changes will be reverted to the non-changed state.","position":{"start":{"line":305,"column":1,"offset":14585},"end":{"line":305,"column":198,"offset":14782},"indent":[]}}],"position":{"start":{"line":305,"column":1,"offset":14585},"end":{"line":305,"column":198,"offset":14782},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Threshold","position":{"start":{"line":307,"column":7,"offset":14790},"end":{"line":307,"column":16,"offset":14799},"indent":[]}}],"position":{"start":{"line":307,"column":1,"offset":14784},"end":{"line":307,"column":16,"offset":14799},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When doing the comparison of two images, we won't end up with a clean black and white image. In most of the cases the values will be between 0 and 255; so gray values. This means that the value 0 will mean that both pixels where the same in both image, and values 255 mean that both pixels where totally different in both images. Of course we will also have values between 0-255, so pixels that are a little bit different in both images. So to make the resulting black and white image, we will need to apply a threshold value.","position":{"start":{"line":309,"column":1,"offset":14801},"end":{"line":309,"column":527,"offset":15327},"indent":[]}}],"position":{"start":{"line":309,"column":1,"offset":14801},"end":{"line":309,"column":527,"offset":15327},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The threshold will specify how much a pixel has to be different in the two images. So for example when the threshold is 30, it means that the difference between two pixels has to be equal or more then 30. The higher the threshold the more the pixel needs to be different, to be marked as changed.","position":{"start":{"line":311,"column":1,"offset":15329},"end":{"line":311,"column":297,"offset":15625},"indent":[]}}],"position":{"start":{"line":311,"column":1,"offset":15329},"end":{"line":311,"column":297,"offset":15625},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Expositor","position":{"start":{"line":313,"column":4,"offset":15630},"end":{"line":313,"column":13,"offset":15639},"indent":[]}}],"position":{"start":{"line":313,"column":1,"offset":15627},"end":{"line":313,"column":13,"offset":15639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"After the algorithm is executed, the expositor will determine, a region, where the changes were detected. An expositor can constrain a region in terms of selecting a hull or defining a rectangle.","position":{"start":{"line":315,"column":1,"offset":15641},"end":{"line":315,"column":196,"offset":15836},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":15641},"end":{"line":315,"column":196,"offset":15836},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"An expositor receives a black and white image as parameter and should modify a JSON object with all the information it processed. The JSON object must include: the bounding rectangle(s) of the positions where the pixels of interest are located and the number of pixels of interest. But can also include other optional parameters.","position":{"start":{"line":317,"column":1,"offset":15838},"end":{"line":317,"column":330,"offset":16167},"indent":[]}}],"position":{"start":{"line":317,"column":1,"offset":15838},"end":{"line":317,"column":330,"offset":16167},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can change the expositor by changing the ","position":{"start":{"line":319,"column":1,"offset":16169},"end":{"line":319,"column":46,"offset":16214},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":319,"column":46,"offset":16214},"end":{"line":319,"column":65,"offset":16233},"indent":[]}},{"type":"text","value":" file, and choose one of the following:","position":{"start":{"line":319,"column":65,"offset":16233},"end":{"line":319,"column":104,"offset":16272},"indent":[]}}],"position":{"start":{"line":319,"column":1,"offset":16169},"end":{"line":319,"column":104,"offset":16272},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Hull","position":{"start":{"line":320,"column":3,"offset":16275},"end":{"line":320,"column":7,"offset":16279},"indent":[]}}],"position":{"start":{"line":320,"column":3,"offset":16275},"end":{"line":320,"column":7,"offset":16279},"indent":[]}}],"position":{"start":{"line":320,"column":1,"offset":16273},"end":{"line":320,"column":7,"offset":16279},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Rectangle","position":{"start":{"line":321,"column":3,"offset":16282},"end":{"line":321,"column":12,"offset":16291},"indent":[]}}],"position":{"start":{"line":321,"column":3,"offset":16282},"end":{"line":321,"column":12,"offset":16291},"indent":[]}}],"position":{"start":{"line":321,"column":1,"offset":16280},"end":{"line":321,"column":12,"offset":16291},"indent":[]}}],"position":{"start":{"line":320,"column":1,"offset":16273},"end":{"line":321,"column":12,"offset":16291},"indent":[1]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n Hull\n ...\n \n","position":{"start":{"line":323,"column":1,"offset":16293},"end":{"line":332,"column":4,"offset":16444},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Rectangle","position":{"start":{"line":334,"column":5,"offset":16450},"end":{"line":334,"column":14,"offset":16459},"indent":[]}}],"position":{"start":{"line":334,"column":1,"offset":16446},"end":{"line":334,"column":14,"offset":16459},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This is a trivial expositor. A rectangle region can be defined to constrain the locations of pixels of interest. The rectangle repositor will return the region of the pixels of interest.","position":{"start":{"line":336,"column":1,"offset":16461},"end":{"line":336,"column":187,"offset":16647},"indent":[]}}],"position":{"start":{"line":336,"column":1,"offset":16461},"end":{"line":336,"column":187,"offset":16647},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":338,"column":6,"offset":16654},"end":{"line":338,"column":16,"offset":16664},"indent":[]}}],"position":{"start":{"line":338,"column":1,"offset":16649},"end":{"line":338,"column":16,"offset":16664},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the rectangle expositor can be found in the config/expositor.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":340,"column":1,"offset":16666},"end":{"line":340,"column":188,"offset":16853},"indent":[]}}],"position":{"start":{"line":340,"column":1,"offset":16666},"end":{"line":340,"column":188,"offset":16853},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n \n 0\n 0\n 1280\n 720\n \n \n","position":{"start":{"line":342,"column":1,"offset":16855},"end":{"line":353,"column":4,"offset":17077},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Region","position":{"start":{"line":355,"column":7,"offset":17085},"end":{"line":355,"column":13,"offset":17091},"indent":[]}}],"position":{"start":{"line":355,"column":1,"offset":17079},"end":{"line":355,"column":13,"offset":17091},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The region parameter contains 4 values; x1, y1, x2 and y2 respectively. The values x1 and y1 indicate the x- and y-coordinate of the left upper starting point. The values x2 and y2 are the bottom right coordinates. A virtual rectangle will be drawn from (x1,y1) to (x2,y2). Pixels of interest that lie within this rectangle are valid pixels; if not they are invalid.","position":{"start":{"line":357,"column":1,"offset":17093},"end":{"line":357,"column":367,"offset":17459},"indent":[]}}],"position":{"start":{"line":357,"column":1,"offset":17093},"end":{"line":357,"column":367,"offset":17459},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Hull","position":{"start":{"line":359,"column":5,"offset":17465},"end":{"line":359,"column":9,"offset":17469},"indent":[]}}],"position":{"start":{"line":359,"column":1,"offset":17461},"end":{"line":359,"column":9,"offset":17469},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This hull is a more complex expositor than the rectangle. A hull can be selected with the web, you can select one or more coordinates to create a flexible region. The coordinates can be adjusted afterwards and be removed by double clicking on the coordinate. You can expand the hull by removing the start coordinate, which is marked by the white bullet.","position":{"start":{"line":361,"column":1,"offset":17471},"end":{"line":361,"column":354,"offset":17824},"indent":[]}}],"position":{"start":{"line":361,"column":1,"offset":17471},"end":{"line":361,"column":354,"offset":17824},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/machinery/hull.png","alt":"machinery hull","position":{"start":{"line":363,"column":1,"offset":17826},"end":{"line":363,"column":58,"offset":17883},"indent":[]}}],"position":{"start":{"line":363,"column":1,"offset":17826},"end":{"line":363,"column":58,"offset":17883},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":365,"column":6,"offset":17890},"end":{"line":365,"column":16,"offset":17900},"indent":[]}}],"position":{"start":{"line":365,"column":1,"offset":17885},"end":{"line":365,"column":16,"offset":17900},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the hull expositor can be found in the config/expositor.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":367,"column":1,"offset":17902},"end":{"line":367,"column":183,"offset":18084},"indent":[]}}],"position":{"start":{"line":367,"column":1,"offset":17902},"end":{"line":367,"column":183,"offset":18084},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 347,361|627,266|975,328|1091,328|1148,413|1158,516|1121,534|962,567|699,648|531,700|243,613|423,550|665,453|850,470|666,361|467,385|325,460|165,372\n \n","position":{"start":{"line":369,"column":1,"offset":18086},"end":{"line":375,"column":4,"offset":18332},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Region","position":{"start":{"line":377,"column":7,"offset":18340},"end":{"line":377,"column":13,"offset":18346},"indent":[]}}],"position":{"start":{"line":377,"column":1,"offset":18334},"end":{"line":377,"column":13,"offset":18346},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The region parameter contains n values. Each value represents a coordinate (x,y) and are seperated by the \"|\" delimiter. These coordinates are used to calculate the concave hull. Pixels of interest that lie within the concave hull are valid pixels; if not they are invalid.","position":{"start":{"line":378,"column":1,"offset":18347},"end":{"line":378,"column":274,"offset":18620},"indent":[]}}],"position":{"start":{"line":378,"column":1,"offset":18347},"end":{"line":378,"column":274,"offset":18620},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Heuristic","position":{"start":{"line":380,"column":4,"offset":18625},"end":{"line":380,"column":13,"offset":18634},"indent":[]}}],"position":{"start":{"line":380,"column":1,"offset":18622},"end":{"line":380,"column":13,"offset":18634},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The heuristic is the last step in the four passway which will decide if the detection is valid or not. It will do this by using information from the previous steps (the expositor and the algorithm); e.g. number of changed pixels.","position":{"start":{"line":382,"column":1,"offset":18636},"end":{"line":382,"column":230,"offset":18865},"indent":[]}}],"position":{"start":{"line":382,"column":1,"offset":18636},"end":{"line":382,"column":230,"offset":18865},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can change the heuristic by changing the ","position":{"start":{"line":384,"column":1,"offset":18867},"end":{"line":384,"column":46,"offset":18912},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":384,"column":46,"offset":18912},"end":{"line":384,"column":65,"offset":18931},"indent":[]}},{"type":"text","value":" file, and choose one of the following:","position":{"start":{"line":384,"column":65,"offset":18931},"end":{"line":384,"column":104,"offset":18970},"indent":[]}}],"position":{"start":{"line":384,"column":1,"offset":18867},"end":{"line":384,"column":104,"offset":18970},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Sequence","position":{"start":{"line":385,"column":3,"offset":18973},"end":{"line":385,"column":11,"offset":18981},"indent":[]}}],"position":{"start":{"line":385,"column":3,"offset":18973},"end":{"line":385,"column":11,"offset":18981},"indent":[]}}],"position":{"start":{"line":385,"column":1,"offset":18971},"end":{"line":385,"column":11,"offset":18981},"indent":[]}}],"position":{"start":{"line":385,"column":1,"offset":18971},"end":{"line":385,"column":11,"offset":18981},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n Sequence\n ...\n \n","position":{"start":{"line":387,"column":1,"offset":18983},"end":{"line":396,"column":4,"offset":19138},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Sequence","position":{"start":{"line":398,"column":5,"offset":19144},"end":{"line":398,"column":13,"offset":19152},"indent":[]}}],"position":{"start":{"line":398,"column":1,"offset":19140},"end":{"line":398,"column":13,"offset":19152},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This is a trivial heuristic. The sequence heuristic will store a single integer in memory, that will count the numbers of valid detections. When the heuristic will detect a false detection, it will decrease the count. The sequence heuristic will return true, if a threshold is reached; for example when something was detected three times in a row.","position":{"start":{"line":400,"column":1,"offset":19154},"end":{"line":400,"column":348,"offset":19501},"indent":[]}}],"position":{"start":{"line":400,"column":1,"offset":19154},"end":{"line":400,"column":348,"offset":19501},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":402,"column":6,"offset":19508},"end":{"line":402,"column":16,"offset":19518},"indent":[]}}],"position":{"start":{"line":402,"column":1,"offset":19503},"end":{"line":402,"column":16,"offset":19518},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Sequence heuristic can be found in the config/heuristic.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":404,"column":1,"offset":19520},"end":{"line":404,"column":187,"offset":19706},"indent":[]}}],"position":{"start":{"line":404,"column":1,"offset":19520},"end":{"line":404,"column":187,"offset":19706},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n 1\n 1\n 2000\n \n","position":{"start":{"line":406,"column":1,"offset":19708},"end":{"line":414,"column":4,"offset":19940},"indent":[1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Minimum changes","position":{"start":{"line":416,"column":7,"offset":19948},"end":{"line":416,"column":22,"offset":19963},"indent":[]}}],"position":{"start":{"line":416,"column":1,"offset":19942},"end":{"line":416,"column":22,"offset":19963},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The heuristic will only return true if enough changes have been detected. The minimum of changes indicates the minimum number of pixels that have to been changed, to be a valid detection.","position":{"start":{"line":418,"column":1,"offset":19965},"end":{"line":418,"column":188,"offset":20152},"indent":[]}}],"position":{"start":{"line":418,"column":1,"offset":19965},"end":{"line":418,"column":188,"offset":20152},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Minimum durations","position":{"start":{"line":420,"column":7,"offset":20160},"end":{"line":420,"column":24,"offset":20177},"indent":[]}}],"position":{"start":{"line":420,"column":1,"offset":20154},"end":{"line":420,"column":24,"offset":20177},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The minimum number of detections in a row to be a valid detection.","position":{"start":{"line":422,"column":1,"offset":20179},"end":{"line":422,"column":67,"offset":20245},"indent":[]}}],"position":{"start":{"line":422,"column":1,"offset":20179},"end":{"line":422,"column":67,"offset":20245},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"No motion delay time","position":{"start":{"line":424,"column":7,"offset":20253},"end":{"line":424,"column":27,"offset":20273},"indent":[]}}],"position":{"start":{"line":424,"column":1,"offset":20247},"end":{"line":424,"column":27,"offset":20273},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When the heuristic failed, due to not enough pixels changed or not x detections in a row, the heuristic will idle for some time.","position":{"start":{"line":426,"column":1,"offset":20275},"end":{"line":426,"column":129,"offset":20403},"indent":[]}}],"position":{"start":{"line":426,"column":1,"offset":20275},"end":{"line":426,"column":129,"offset":20403},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Output","position":{"start":{"line":428,"column":4,"offset":20408},"end":{"line":428,"column":10,"offset":20414},"indent":[]}}],"position":{"start":{"line":428,"column":1,"offset":20405},"end":{"line":428,"column":10,"offset":20414},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If the heuristic determined that the evaluation was valid, one or more output operations can be executed. You configure which ooutput operations that will be executed, by modifying the configuration file or using the web interface.","position":{"start":{"line":430,"column":1,"offset":20416},"end":{"line":430,"column":232,"offset":20647},"indent":[]}}],"position":{"start":{"line":430,"column":1,"offset":20416},"end":{"line":430,"column":232,"offset":20647},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n Video\n ...\n \n","position":{"start":{"line":432,"column":1,"offset":20649},"end":{"line":441,"column":4,"offset":20796},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"You can choose which output devices you will be using. If you select multiple outputs, seperate them with an ","position":{"start":{"line":443,"column":1,"offset":20798},"end":{"line":443,"column":110,"offset":20907},"indent":[]}},{"type":"inlineCode","value":",","position":{"start":{"line":443,"column":110,"offset":20907},"end":{"line":443,"column":113,"offset":20910},"indent":[]}},{"type":"text","value":". You can change the output device by changing the ","position":{"start":{"line":443,"column":113,"offset":20910},"end":{"line":443,"column":164,"offset":20961},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":443,"column":164,"offset":20961},"end":{"line":443,"column":183,"offset":20980},"indent":[]}},{"type":"text","value":" file, and choose one of the following:","position":{"start":{"line":443,"column":183,"offset":20980},"end":{"line":443,"column":222,"offset":21019},"indent":[]}}],"position":{"start":{"line":443,"column":1,"offset":20798},"end":{"line":443,"column":222,"offset":21019},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disk","position":{"start":{"line":444,"column":3,"offset":21022},"end":{"line":444,"column":7,"offset":21026},"indent":[]}}],"position":{"start":{"line":444,"column":3,"offset":21022},"end":{"line":444,"column":7,"offset":21026},"indent":[]}}],"position":{"start":{"line":444,"column":1,"offset":21020},"end":{"line":444,"column":7,"offset":21026},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Video","position":{"start":{"line":445,"column":3,"offset":21029},"end":{"line":445,"column":8,"offset":21034},"indent":[]}}],"position":{"start":{"line":445,"column":3,"offset":21029},"end":{"line":445,"column":8,"offset":21034},"indent":[]}}],"position":{"start":{"line":445,"column":1,"offset":21027},"end":{"line":445,"column":8,"offset":21034},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"GPIO","position":{"start":{"line":446,"column":3,"offset":21037},"end":{"line":446,"column":7,"offset":21041},"indent":[]}}],"position":{"start":{"line":446,"column":3,"offset":21037},"end":{"line":446,"column":7,"offset":21041},"indent":[]}}],"position":{"start":{"line":446,"column":1,"offset":21035},"end":{"line":446,"column":7,"offset":21041},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"TCPSocket","position":{"start":{"line":447,"column":3,"offset":21044},"end":{"line":447,"column":12,"offset":21053},"indent":[]}}],"position":{"start":{"line":447,"column":3,"offset":21044},"end":{"line":447,"column":12,"offset":21053},"indent":[]}}],"position":{"start":{"line":447,"column":1,"offset":21042},"end":{"line":447,"column":12,"offset":21053},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Webhook","position":{"start":{"line":448,"column":3,"offset":21056},"end":{"line":448,"column":10,"offset":21063},"indent":[]}}],"position":{"start":{"line":448,"column":3,"offset":21056},"end":{"line":448,"column":10,"offset":21063},"indent":[]}}],"position":{"start":{"line":448,"column":1,"offset":21054},"end":{"line":448,"column":10,"offset":21063},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MQTT","position":{"start":{"line":449,"column":3,"offset":21066},"end":{"line":449,"column":7,"offset":21070},"indent":[]}}],"position":{"start":{"line":449,"column":3,"offset":21066},"end":{"line":449,"column":7,"offset":21070},"indent":[]}}],"position":{"start":{"line":449,"column":1,"offset":21064},"end":{"line":449,"column":7,"offset":21070},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Script","position":{"start":{"line":450,"column":3,"offset":21073},"end":{"line":450,"column":9,"offset":21079},"indent":[]}}],"position":{"start":{"line":450,"column":3,"offset":21073},"end":{"line":450,"column":9,"offset":21079},"indent":[]}}],"position":{"start":{"line":450,"column":1,"offset":21071},"end":{"line":450,"column":9,"offset":21079},"indent":[]}}],"position":{"start":{"line":444,"column":1,"offset":21020},"end":{"line":450,"column":9,"offset":21079},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Disk","position":{"start":{"line":452,"column":5,"offset":21085},"end":{"line":452,"column":9,"offset":21089},"indent":[]}}],"position":{"start":{"line":452,"column":1,"offset":21081},"end":{"line":452,"column":9,"offset":21089},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"An image can be saved to disk.","position":{"start":{"line":454,"column":1,"offset":21091},"end":{"line":454,"column":31,"offset":21121},"indent":[]}}],"position":{"start":{"line":454,"column":1,"offset":21091},"end":{"line":454,"column":31,"offset":21121},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":456,"column":6,"offset":21128},"end":{"line":456,"column":16,"offset":21138},"indent":[]}}],"position":{"start":{"line":456,"column":1,"offset":21123},"end":{"line":456,"column":16,"offset":21138},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Disk output device can be found in the ","position":{"start":{"line":458,"column":1,"offset":21140},"end":{"line":458,"column":62,"offset":21201},"indent":[]}},{"type":"inlineCode","value":"config/io.xml","position":{"start":{"line":458,"column":62,"offset":21201},"end":{"line":458,"column":77,"offset":21216},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":458,"column":77,"offset":21216},"end":{"line":458,"column":182,"offset":21321},"indent":[]}}],"position":{"start":{"line":458,"column":1,"offset":21140},"end":{"line":458,"column":182,"offset":21321},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n timestamp_microseconds_instanceName_regionCoordinates_numberOfChanges_token.jpg\n /etc/opt/kerberosio/capture/\n false\n white\n false\n 0\n \n","position":{"start":{"line":460,"column":1,"offset":21323},"end":{"line":471,"column":4,"offset":21754},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"File format","position":{"start":{"line":473,"column":7,"offset":21762},"end":{"line":473,"column":18,"offset":21773},"indent":[]}}],"position":{"start":{"line":473,"column":1,"offset":21756},"end":{"line":473,"column":18,"offset":21773},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The format that will be used for the name of the image. One or more variables can be defined and will be replaced by the machinery. Note that when you're using a variables name in the file format, that this name should be defined in the JSON object.","position":{"start":{"line":475,"column":1,"offset":21775},"end":{"line":475,"column":250,"offset":22024},"indent":[]}}],"position":{"start":{"line":475,"column":1,"offset":21775},"end":{"line":475,"column":250,"offset":22024},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Directory","position":{"start":{"line":477,"column":7,"offset":22032},"end":{"line":477,"column":16,"offset":22041},"indent":[]}}],"position":{"start":{"line":477,"column":1,"offset":22026},"end":{"line":477,"column":16,"offset":22041},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The directory where the image will be saved to. By default images are saved to the /etc/opt/kerberosio/capture directory.","position":{"start":{"line":479,"column":1,"offset":22043},"end":{"line":479,"column":122,"offset":22164},"indent":[]}}],"position":{"start":{"line":479,"column":1,"offset":22043},"end":{"line":479,"column":122,"offset":22164},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Mark with timestamp","position":{"start":{"line":481,"column":7,"offset":22172},"end":{"line":481,"column":26,"offset":22191},"indent":[]}}],"position":{"start":{"line":481,"column":1,"offset":22166},"end":{"line":481,"column":26,"offset":22191},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When this settings is set to true, the image is marked with a timestamp.","position":{"start":{"line":483,"column":1,"offset":22193},"end":{"line":483,"column":73,"offset":22265},"indent":[]}}],"position":{"start":{"line":483,"column":1,"offset":22193},"end":{"line":483,"column":73,"offset":22265},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Timestamp color","position":{"start":{"line":485,"column":7,"offset":22273},"end":{"line":485,"column":22,"offset":22288},"indent":[]}}],"position":{"start":{"line":485,"column":1,"offset":22267},"end":{"line":485,"column":22,"offset":22288},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A color can be defined for timestamp: white, black, red, green and blue.","position":{"start":{"line":486,"column":1,"offset":22289},"end":{"line":486,"column":73,"offset":22361},"indent":[]}}],"position":{"start":{"line":486,"column":1,"offset":22289},"end":{"line":486,"column":73,"offset":22361},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Privacy","position":{"start":{"line":488,"column":7,"offset":22369},"end":{"line":488,"column":14,"offset":22376},"indent":[]}}],"position":{"start":{"line":488,"column":1,"offset":22363},"end":{"line":488,"column":14,"offset":22376},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The privacy mode can be activated to remove some parts from the image. This especially helpful if you want to filter out public areas. When this option is enabled you will seee that after configuring the Hull expositor, you'll see that the pixels outside your region of interest (Hull) are made black.","position":{"start":{"line":489,"column":1,"offset":22377},"end":{"line":489,"column":303,"offset":22679},"indent":[]}}],"position":{"start":{"line":489,"column":1,"offset":22377},"end":{"line":489,"column":303,"offset":22679},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":491,"column":7,"offset":22687},"end":{"line":491,"column":16,"offset":22696},"indent":[]}}],"position":{"start":{"line":491,"column":1,"offset":22681},"end":{"line":491,"column":16,"offset":22696},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Disk will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":492,"column":1,"offset":22697},"end":{"line":492,"column":187,"offset":22883},"indent":[]}}],"position":{"start":{"line":492,"column":1,"offset":22697},"end":{"line":492,"column":187,"offset":22883},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Video","position":{"start":{"line":494,"column":5,"offset":22889},"end":{"line":494,"column":10,"offset":22894},"indent":[]}}],"position":{"start":{"line":494,"column":1,"offset":22885},"end":{"line":494,"column":10,"offset":22894},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When a valid event is detected, a video will be recorded for x seconds. When more valid events are detected, while a video is recording, the video file will further record for x seconds; so no new video file be recorded, but the existing one will be expanded.","position":{"start":{"line":495,"column":1,"offset":22895},"end":{"line":495,"column":260,"offset":23154},"indent":[]}}],"position":{"start":{"line":495,"column":1,"offset":22895},"end":{"line":495,"column":260,"offset":23154},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":497,"column":6,"offset":23161},"end":{"line":497,"column":16,"offset":23171},"indent":[]}}],"position":{"start":{"line":497,"column":1,"offset":23156},"end":{"line":497,"column":16,"offset":23171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Video output device can be found in the ","position":{"start":{"line":498,"column":1,"offset":23172},"end":{"line":498,"column":63,"offset":23234},"indent":[]}},{"type":"inlineCode","value":"config/io.xml","position":{"start":{"line":498,"column":63,"offset":23234},"end":{"line":498,"column":78,"offset":23249},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":498,"column":78,"offset":23249},"end":{"line":498,"column":183,"offset":23354},"indent":[]}}],"position":{"start":{"line":498,"column":1,"offset":23172},"end":{"line":498,"column":183,"offset":23354},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n","position":{"start":{"line":500,"column":1,"offset":23356},"end":{"line":518,"column":4,"offset":24146},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"FPS","position":{"start":{"line":520,"column":7,"offset":24154},"end":{"line":520,"column":10,"offset":24157},"indent":[]}}],"position":{"start":{"line":520,"column":1,"offset":24148},"end":{"line":520,"column":10,"offset":24157},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The frames per second of the video being recorded. Please note that this number is limited and depends heavily on your hardware setup. You'll be receiving following warning in the systems logs, if the machinery can't write the desired FPS.","position":{"start":{"line":521,"column":1,"offset":24158},"end":{"line":521,"column":240,"offset":24397},"indent":[]}}],"position":{"start":{"line":521,"column":1,"offset":24158},"end":{"line":521,"column":240,"offset":24397},"indent":[]}},{"type":"code","lang":"text","meta":null,"value":"[trivial] IoVideo: framerate is too fast, can't record video at this speed (8/FPS)","position":{"start":{"line":523,"column":1,"offset":24399},"end":{"line":525,"column":4,"offset":24493},"indent":[1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Record after","position":{"start":{"line":526,"column":7,"offset":24500},"end":{"line":526,"column":19,"offset":24512},"indent":[]}}],"position":{"start":{"line":526,"column":1,"offset":24494},"end":{"line":526,"column":19,"offset":24512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The number of seconds recorded after the last valid event was detected. This means that when a video is already recording, and a valid event was detected, the video will be expanded with x more seconds.","position":{"start":{"line":527,"column":1,"offset":24513},"end":{"line":527,"column":203,"offset":24715},"indent":[]}}],"position":{"start":{"line":527,"column":1,"offset":24513},"end":{"line":527,"column":203,"offset":24715},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Extensions","position":{"start":{"line":529,"column":7,"offset":24723},"end":{"line":529,"column":17,"offset":24733},"indent":[]}}],"position":{"start":{"line":529,"column":1,"offset":24717},"end":{"line":529,"column":17,"offset":24733},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The extension or container of the video file. We highly recommend to use the MP4 container if you want cross-browser support. Leave this setting by default, if you don't know what you're doing.","position":{"start":{"line":530,"column":1,"offset":24734},"end":{"line":530,"column":194,"offset":24927},"indent":[]}}],"position":{"start":{"line":530,"column":1,"offset":24734},"end":{"line":530,"column":194,"offset":24927},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Codec","position":{"start":{"line":532,"column":7,"offset":24935},"end":{"line":532,"column":12,"offset":24940},"indent":[]}}],"position":{"start":{"line":532,"column":1,"offset":24929},"end":{"line":532,"column":12,"offset":24940},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The codec that is used to encode the video file.","position":{"start":{"line":533,"column":1,"offset":24941},"end":{"line":533,"column":49,"offset":24989},"indent":[]}}],"position":{"start":{"line":533,"column":1,"offset":24941},"end":{"line":533,"column":49,"offset":24989},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"File format","position":{"start":{"line":535,"column":7,"offset":24997},"end":{"line":535,"column":18,"offset":25008},"indent":[]}}],"position":{"start":{"line":535,"column":1,"offset":24991},"end":{"line":535,"column":18,"offset":25008},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The format that will be used for the name of the image. One or more variables can be defined and will be replaced by the machinery. Note that when you're using a variables name in the file format, that this name should be defined in the JSON object.","position":{"start":{"line":536,"column":1,"offset":25009},"end":{"line":536,"column":250,"offset":25258},"indent":[]}}],"position":{"start":{"line":536,"column":1,"offset":25009},"end":{"line":536,"column":250,"offset":25258},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Directory","position":{"start":{"line":538,"column":7,"offset":25266},"end":{"line":538,"column":16,"offset":25275},"indent":[]}}],"position":{"start":{"line":538,"column":1,"offset":25260},"end":{"line":538,"column":16,"offset":25275},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The directory where the videos will be saved. By default videos are saved to the /etc/opt/kerberosio/capture directory.","position":{"start":{"line":539,"column":1,"offset":25276},"end":{"line":539,"column":120,"offset":25395},"indent":[]}}],"position":{"start":{"line":539,"column":1,"offset":25276},"end":{"line":539,"column":120,"offset":25395},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Hardware directory","position":{"start":{"line":541,"column":7,"offset":25403},"end":{"line":541,"column":25,"offset":25421},"indent":[]}}],"position":{"start":{"line":541,"column":1,"offset":25397},"end":{"line":541,"column":25,"offset":25421},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When using onboard hardware encoding (e.g. with Raspberry Pi camera), h264 video files are generated and stored in this directory. Afterwards these h264 files will be containerized to mp4 files, and stored in the Directory path.","position":{"start":{"line":542,"column":1,"offset":25422},"end":{"line":542,"column":229,"offset":25650},"indent":[]}}],"position":{"start":{"line":542,"column":1,"offset":25422},"end":{"line":542,"column":229,"offset":25650},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Enable Hardware encoding","position":{"start":{"line":544,"column":7,"offset":25658},"end":{"line":544,"column":31,"offset":25682},"indent":[]}}],"position":{"start":{"line":544,"column":1,"offset":25652},"end":{"line":544,"column":31,"offset":25682},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A boolean which can enable or disable hardware encoding. Please note that this option is enabled by default, but does not mean that it will work if you choose to use an USB camera.","position":{"start":{"line":545,"column":1,"offset":25683},"end":{"line":545,"column":181,"offset":25863},"indent":[]}}],"position":{"start":{"line":545,"column":1,"offset":25683},"end":{"line":545,"column":181,"offset":25863},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Mark with timestamp","position":{"start":{"line":547,"column":7,"offset":25871},"end":{"line":547,"column":26,"offset":25890},"indent":[]}}],"position":{"start":{"line":547,"column":1,"offset":25865},"end":{"line":547,"column":26,"offset":25890},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When this settings is set to true, the video is marked with a timestamp (similar to the Disk device).","position":{"start":{"line":548,"column":1,"offset":25891},"end":{"line":548,"column":102,"offset":25992},"indent":[]}}],"position":{"start":{"line":548,"column":1,"offset":25891},"end":{"line":548,"column":102,"offset":25992},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Timestamp color","position":{"start":{"line":550,"column":7,"offset":26000},"end":{"line":550,"column":22,"offset":26015},"indent":[]}}],"position":{"start":{"line":550,"column":1,"offset":25994},"end":{"line":550,"column":22,"offset":26015},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A color can be defined for timestamp: white, black, red, green and blue.","position":{"start":{"line":551,"column":1,"offset":26016},"end":{"line":551,"column":73,"offset":26088},"indent":[]}}],"position":{"start":{"line":551,"column":1,"offset":26016},"end":{"line":551,"column":73,"offset":26088},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Privacy","position":{"start":{"line":553,"column":7,"offset":26096},"end":{"line":553,"column":14,"offset":26103},"indent":[]}}],"position":{"start":{"line":553,"column":1,"offset":26090},"end":{"line":553,"column":14,"offset":26103},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The privacy mode can be activated to remove some parts from the video. This especially helpful if you want to filter out public areas.","position":{"start":{"line":554,"column":1,"offset":26104},"end":{"line":554,"column":135,"offset":26238},"indent":[]}}],"position":{"start":{"line":554,"column":1,"offset":26104},"end":{"line":554,"column":135,"offset":26238},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Video privacy","position":{"start":{"line":556,"column":7,"offset":26246},"end":{"line":556,"column":20,"offset":26259},"indent":[]}}],"position":{"start":{"line":556,"column":1,"offset":26240},"end":{"line":556,"column":20,"offset":26259},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"After updating the configuration, you'll see that the pixels outside your region of interest (ROI) are made black; the image below illustrates this.","position":{"start":{"line":557,"column":1,"offset":26260},"end":{"line":557,"column":149,"offset":26408},"indent":[]}}],"position":{"start":{"line":557,"column":1,"offset":26260},"end":{"line":557,"column":149,"offset":26408},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":559,"column":7,"offset":26416},"end":{"line":559,"column":16,"offset":26425},"indent":[]}}],"position":{"start":{"line":559,"column":1,"offset":26410},"end":{"line":559,"column":16,"offset":26425},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Video will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":560,"column":1,"offset":26426},"end":{"line":560,"column":188,"offset":26613},"indent":[]}}],"position":{"start":{"line":560,"column":1,"offset":26426},"end":{"line":560,"column":188,"offset":26613},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"TCP/IP client","position":{"start":{"line":562,"column":5,"offset":26619},"end":{"line":562,"column":18,"offset":26632},"indent":[]}}],"position":{"start":{"line":562,"column":1,"offset":26615},"end":{"line":562,"column":18,"offset":26632},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The TCP/IP client will send a TCP packet to a server.","position":{"start":{"line":564,"column":1,"offset":26634},"end":{"line":564,"column":54,"offset":26687},"indent":[]}}],"position":{"start":{"line":564,"column":1,"offset":26634},"end":{"line":564,"column":54,"offset":26687},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":566,"column":6,"offset":26694},"end":{"line":566,"column":16,"offset":26704},"indent":[]}}],"position":{"start":{"line":566,"column":1,"offset":26689},"end":{"line":566,"column":16,"offset":26704},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the TCP/IP client can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":567,"column":1,"offset":26705},"end":{"line":567,"column":175,"offset":26879},"indent":[]}}],"position":{"start":{"line":567,"column":1,"offset":26705},"end":{"line":567,"column":175,"offset":26879},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 127.0.0.1\n 1337\n it's so fluffy\n 0\n \n","position":{"start":{"line":569,"column":1,"offset":26881},"end":{"line":578,"column":4,"offset":27107},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Server","position":{"start":{"line":580,"column":7,"offset":27115},"end":{"line":580,"column":13,"offset":27121},"indent":[]}}],"position":{"start":{"line":580,"column":1,"offset":27109},"end":{"line":580,"column":13,"offset":27121},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The IP of the TCP server.","position":{"start":{"line":581,"column":1,"offset":27122},"end":{"line":581,"column":26,"offset":27147},"indent":[]}}],"position":{"start":{"line":581,"column":1,"offset":27122},"end":{"line":581,"column":26,"offset":27147},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Port","position":{"start":{"line":583,"column":7,"offset":27155},"end":{"line":583,"column":11,"offset":27159},"indent":[]}}],"position":{"start":{"line":583,"column":1,"offset":27149},"end":{"line":583,"column":11,"offset":27159},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This is the port of the TCP server.","position":{"start":{"line":584,"column":1,"offset":27160},"end":{"line":584,"column":36,"offset":27195},"indent":[]}}],"position":{"start":{"line":584,"column":1,"offset":27160},"end":{"line":584,"column":36,"offset":27195},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Message","position":{"start":{"line":586,"column":7,"offset":27203},"end":{"line":586,"column":14,"offset":27210},"indent":[]}}],"position":{"start":{"line":586,"column":1,"offset":27197},"end":{"line":586,"column":14,"offset":27210},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can send some data to a TCP server.","position":{"start":{"line":587,"column":1,"offset":27211},"end":{"line":587,"column":40,"offset":27250},"indent":[]}}],"position":{"start":{"line":587,"column":1,"offset":27211},"end":{"line":587,"column":40,"offset":27250},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":589,"column":7,"offset":27258},"end":{"line":589,"column":16,"offset":27267},"indent":[]}}],"position":{"start":{"line":589,"column":1,"offset":27252},"end":{"line":589,"column":16,"offset":27267},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the TCP will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":590,"column":1,"offset":27268},"end":{"line":590,"column":186,"offset":27453},"indent":[]}}],"position":{"start":{"line":590,"column":1,"offset":27268},"end":{"line":590,"column":186,"offset":27453},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"GPIO","position":{"start":{"line":592,"column":5,"offset":27459},"end":{"line":592,"column":9,"offset":27463},"indent":[]}}],"position":{"start":{"line":592,"column":1,"offset":27455},"end":{"line":592,"column":9,"offset":27463},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A GPIO pin can be set as output device.","position":{"start":{"line":593,"column":1,"offset":27464},"end":{"line":593,"column":40,"offset":27503},"indent":[]}}],"position":{"start":{"line":593,"column":1,"offset":27464},"end":{"line":593,"column":40,"offset":27503},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":595,"column":6,"offset":27510},"end":{"line":595,"column":16,"offset":27520},"indent":[]}}],"position":{"start":{"line":595,"column":1,"offset":27505},"end":{"line":595,"column":16,"offset":27520},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the GPIO pin can be found in the ","position":{"start":{"line":596,"column":1,"offset":27521},"end":{"line":596,"column":52,"offset":27572},"indent":[]}},{"type":"inlineCode","value":"config/io.xml","position":{"start":{"line":596,"column":52,"offset":27572},"end":{"line":596,"column":67,"offset":27587},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":596,"column":67,"offset":27587},"end":{"line":596,"column":172,"offset":27692},"indent":[]}}],"position":{"start":{"line":596,"column":1,"offset":27521},"end":{"line":596,"column":172,"offset":27692},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 17\n 5\n 100000\n 0\n \n","position":{"start":{"line":598,"column":1,"offset":27694},"end":{"line":607,"column":4,"offset":27900},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Pin","position":{"start":{"line":609,"column":7,"offset":27908},"end":{"line":609,"column":10,"offset":27911},"indent":[]}}],"position":{"start":{"line":609,"column":1,"offset":27902},"end":{"line":609,"column":10,"offset":27911},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The pin that will be triggered.","position":{"start":{"line":610,"column":1,"offset":27912},"end":{"line":610,"column":32,"offset":27943},"indent":[]}}],"position":{"start":{"line":610,"column":1,"offset":27912},"end":{"line":610,"column":32,"offset":27943},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Periods","position":{"start":{"line":612,"column":7,"offset":27951},"end":{"line":612,"column":14,"offset":27958},"indent":[]}}],"position":{"start":{"line":612,"column":1,"offset":27945},"end":{"line":612,"column":14,"offset":27958},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The number of times the pin will be triggered.","position":{"start":{"line":613,"column":1,"offset":27959},"end":{"line":613,"column":47,"offset":28005},"indent":[]}}],"position":{"start":{"line":613,"column":1,"offset":27959},"end":{"line":613,"column":47,"offset":28005},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Period time","position":{"start":{"line":615,"column":7,"offset":28013},"end":{"line":615,"column":18,"offset":28024},"indent":[]}}],"position":{"start":{"line":615,"column":1,"offset":28007},"end":{"line":615,"column":18,"offset":28024},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The time in microseconds that the pin will be set high.","position":{"start":{"line":616,"column":1,"offset":28025},"end":{"line":616,"column":56,"offset":28080},"indent":[]}}],"position":{"start":{"line":616,"column":1,"offset":28025},"end":{"line":616,"column":56,"offset":28080},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":618,"column":7,"offset":28088},"end":{"line":618,"column":16,"offset":28097},"indent":[]}}],"position":{"start":{"line":618,"column":1,"offset":28082},"end":{"line":618,"column":16,"offset":28097},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the GPIO will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":619,"column":1,"offset":28098},"end":{"line":619,"column":187,"offset":28284},"indent":[]}}],"position":{"start":{"line":619,"column":1,"offset":28098},"end":{"line":619,"column":187,"offset":28284},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Webhook","position":{"start":{"line":621,"column":6,"offset":28291},"end":{"line":621,"column":13,"offset":28298},"indent":[]}}],"position":{"start":{"line":621,"column":1,"offset":28286},"end":{"line":621,"column":13,"offset":28298},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Detailed information (a JSON object) is send as a POST request to a webhook. The JSON object contains the number of changes, the region, the URL of the image, etc. This is useful if you want to integrate with your own application.","position":{"start":{"line":622,"column":1,"offset":28299},"end":{"line":622,"column":231,"offset":28529},"indent":[]}}],"position":{"start":{"line":622,"column":1,"offset":28299},"end":{"line":622,"column":231,"offset":28529},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Make sure that the Webhook comes after the Disk device, otherwise the URL of the image is not included.","position":{"start":{"line":624,"column":1,"offset":28531},"end":{"line":624,"column":104,"offset":28634},"indent":[]}}],"position":{"start":{"line":624,"column":1,"offset":28531},"end":{"line":624,"column":104,"offset":28634},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":626,"column":6,"offset":28641},"end":{"line":626,"column":16,"offset":28651},"indent":[]}}],"position":{"start":{"line":626,"column":1,"offset":28636},"end":{"line":626,"column":16,"offset":28651},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the webhook can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":627,"column":1,"offset":28652},"end":{"line":627,"column":169,"offset":28820},"indent":[]}}],"position":{"start":{"line":627,"column":1,"offset":28652},"end":{"line":627,"column":169,"offset":28820},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n http://kerberos.web/api/v1/webhook\n 0\n \n","position":{"start":{"line":629,"column":1,"offset":28822},"end":{"line":636,"column":4,"offset":28975},"indent":[1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Url","position":{"start":{"line":638,"column":7,"offset":28983},"end":{"line":638,"column":10,"offset":28986},"indent":[]}}],"position":{"start":{"line":638,"column":1,"offset":28977},"end":{"line":638,"column":10,"offset":28986},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This is the URL, to which the machinery will send a JSON object (as a POST request).","position":{"start":{"line":639,"column":1,"offset":28987},"end":{"line":639,"column":85,"offset":29071},"indent":[]}}],"position":{"start":{"line":639,"column":1,"offset":28987},"end":{"line":639,"column":85,"offset":29071},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":641,"column":7,"offset":29079},"end":{"line":641,"column":16,"offset":29088},"indent":[]}}],"position":{"start":{"line":641,"column":1,"offset":29073},"end":{"line":641,"column":16,"offset":29088},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Webhook will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":642,"column":1,"offset":29089},"end":{"line":642,"column":190,"offset":29278},"indent":[]}}],"position":{"start":{"line":642,"column":1,"offset":29089},"end":{"line":642,"column":190,"offset":29278},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Output","position":{"start":{"line":644,"column":7,"offset":29286},"end":{"line":644,"column":13,"offset":29292},"indent":[]}}],"position":{"start":{"line":644,"column":1,"offset":29280},"end":{"line":644,"column":13,"offset":29292},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A JSON object is POSTed to the url you've defined.","position":{"start":{"line":645,"column":1,"offset":29293},"end":{"line":645,"column":51,"offset":29343},"indent":[]}}],"position":{"start":{"line":645,"column":1,"offset":29293},"end":{"line":645,"column":51,"offset":29343},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"[\n 'regionCoordinates' : [618, 317, 703, 493],\n 'numberOfChanges' : 5446,\n 'timestamp' : '1465894497',\n 'microseconds' : '5-97451',\n 'token' : 695,\n 'pathToImage' : '1465894497_5-97451_frontdoor_618-317-703-493_5446_695.jpg',\n 'instanceName' : 'frontdoor',\n]","position":{"start":{"line":647,"column":1,"offset":29345},"end":{"line":657,"column":4,"offset":29622},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Script","position":{"start":{"line":659,"column":5,"offset":29628},"end":{"line":659,"column":11,"offset":29634},"indent":[]}}],"position":{"start":{"line":659,"column":1,"offset":29624},"end":{"line":659,"column":11,"offset":29634},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A bash script can be executed after a valid event was detected. A JSON object is send in the first parameter to the script you've defined.","position":{"start":{"line":660,"column":1,"offset":29635},"end":{"line":660,"column":139,"offset":29773},"indent":[]}}],"position":{"start":{"line":660,"column":1,"offset":29635},"end":{"line":660,"column":139,"offset":29773},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":662,"column":6,"offset":29780},"end":{"line":662,"column":16,"offset":29790},"indent":[]}}],"position":{"start":{"line":662,"column":1,"offset":29775},"end":{"line":662,"column":16,"offset":29790},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Script output device can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":663,"column":1,"offset":29791},"end":{"line":663,"column":182,"offset":29972},"indent":[]}}],"position":{"start":{"line":663,"column":1,"offset":29791},"end":{"line":663,"column":182,"offset":29972},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n","position":{"start":{"line":665,"column":1,"offset":29974},"end":{"line":672,"column":4,"offset":30127},"indent":[1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Path","position":{"start":{"line":674,"column":7,"offset":30135},"end":{"line":674,"column":11,"offset":30139},"indent":[]}}],"position":{"start":{"line":674,"column":1,"offset":30129},"end":{"line":674,"column":11,"offset":30139},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The location of the script that will be executed on detection.","position":{"start":{"line":675,"column":1,"offset":30140},"end":{"line":675,"column":63,"offset":30202},"indent":[]}}],"position":{"start":{"line":675,"column":1,"offset":30140},"end":{"line":675,"column":63,"offset":30202},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":677,"column":7,"offset":30210},"end":{"line":677,"column":16,"offset":30219},"indent":[]}}],"position":{"start":{"line":677,"column":1,"offset":30204},"end":{"line":677,"column":16,"offset":30219},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Script will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":678,"column":1,"offset":30220},"end":{"line":678,"column":189,"offset":30408},"indent":[]}}],"position":{"start":{"line":678,"column":1,"offset":30220},"end":{"line":678,"column":189,"offset":30408},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Example","position":{"start":{"line":680,"column":7,"offset":30416},"end":{"line":680,"column":14,"offset":30423},"indent":[]}}],"position":{"start":{"line":680,"column":1,"offset":30410},"end":{"line":680,"column":14,"offset":30423},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By default the script will point to /etc/opt/kerberosio/scripts/run.sh, which contains a template how you should start your script. Note that when using KiOS, this script will be read-only, copy it to the /data folder and change the path parameter.","position":{"start":{"line":681,"column":1,"offset":30424},"end":{"line":681,"column":249,"offset":30672},"indent":[]}}],"position":{"start":{"line":681,"column":1,"offset":30424},"end":{"line":681,"column":249,"offset":30672},"indent":[]}},{"type":"code","lang":"python","meta":null,"value":"#!/bin/bash\n# -------------------------------------------\n# This is an example script which illustrates\n# how to use the Script IO device.\n#\n# --------------------------------------\n# The first parameter is the JSON object\n#\n# e.g. {\"regionCoordinates\":[308,250,346,329],\"numberOfChanges\":194,\"timestamp\":\"1486049622\",\"microseconds\":\"6-161868\",\"token\":344,\"pathToImage\":\"1486049622_6-161868_frontdoor_308-250-346-329_194_344.jpg\",\"instanceName\":\"frontdoor\"}\nJSON=$1\n# -------------------------------------------\n# You can use python to parse the JSON object\n# and get the required fields\nname=$(echo $JSON | python -c \"import sys, json; print json.load(sys.stdin)['instanceName']\")\ncoordinates=$(echo $JSON | python -c \"import sys, json; print json.load(sys.stdin)['regionCoordinates']\")\nchanges=$(echo $JSON | pythfon -c \"import sys, json; print json.load(sys.stdin)['numberOfChanges']\")\nimage=$(echo $JSON | python -c \"import sys, json; print json.load(sys.stdin)['pathToImage']\")\nThe idea is that you can use Python in your bash script, to parse the JSON object send as first parameter. Afterwards you can do with the output what you want.","position":{"start":{"line":683,"column":1,"offset":30674},"end":{"line":702,"column":4,"offset":31830},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"MQTT","position":{"start":{"line":704,"column":5,"offset":31836},"end":{"line":704,"column":9,"offset":31840},"indent":[]}}],"position":{"start":{"line":704,"column":1,"offset":31832},"end":{"line":704,"column":9,"offset":31840},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"MQTT protocol is a light-weight Machine to Machine (M2M) protocol widely used in Internet of things.\nDetailed information (a JSON object) is published to an MQTT topic. The JSON object contains the number of changes, the region, the URL of the image, etc.","position":{"start":{"line":705,"column":1,"offset":31841},"end":{"line":706,"column":155,"offset":32096},"indent":[1]}}],"position":{"start":{"line":705,"column":1,"offset":31841},"end":{"line":706,"column":155,"offset":32096},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":708,"column":6,"offset":32103},"end":{"line":708,"column":16,"offset":32113},"indent":[]}}],"position":{"start":{"line":708,"column":1,"offset":32098},"end":{"line":708,"column":16,"offset":32113},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the MQTT output can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":709,"column":1,"offset":32114},"end":{"line":709,"column":173,"offset":32286},"indent":[]}}],"position":{"start":{"line":709,"column":1,"offset":32114},"end":{"line":709,"column":173,"offset":32286},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n false\n false\n 127.0.0.1\n 1883\n kios/mqtt\n \n \n 0\n \n","position":{"start":{"line":711,"column":1,"offset":32288},"end":{"line":724,"column":4,"offset":32652},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Secure","position":{"start":{"line":726,"column":7,"offset":32660},"end":{"line":726,"column":13,"offset":32666},"indent":[]}}],"position":{"start":{"line":726,"column":1,"offset":32654},"end":{"line":726,"column":13,"offset":32666},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If checked, enable SSL/TLS support. Please note that when SSL/TLS support is enabled, the server certificate issuer is verified against the CA (Certification Authority) files available in /etc/ssl/certs.","position":{"start":{"line":727,"column":1,"offset":32667},"end":{"line":727,"column":204,"offset":32870},"indent":[]}}],"position":{"start":{"line":727,"column":1,"offset":32667},"end":{"line":727,"column":204,"offset":32870},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Verifycn","position":{"start":{"line":729,"column":7,"offset":32878},"end":{"line":729,"column":15,"offset":32886},"indent":[]}}],"position":{"start":{"line":729,"column":1,"offset":32872},"end":{"line":729,"column":15,"offset":32886},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If checked, the MQTT server FQDN or ip address must match the CN (Common Name) of the server certificate.","position":{"start":{"line":730,"column":1,"offset":32887},"end":{"line":730,"column":106,"offset":32992},"indent":[]}}],"position":{"start":{"line":730,"column":1,"offset":32887},"end":{"line":730,"column":106,"offset":32992},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Server","position":{"start":{"line":732,"column":7,"offset":33000},"end":{"line":732,"column":13,"offset":33006},"indent":[]}}],"position":{"start":{"line":732,"column":1,"offset":32994},"end":{"line":732,"column":13,"offset":33006},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"IP address or FQDN of the MQTT broker.","position":{"start":{"line":733,"column":1,"offset":33007},"end":{"line":733,"column":39,"offset":33045},"indent":[]}}],"position":{"start":{"line":733,"column":1,"offset":33007},"end":{"line":733,"column":39,"offset":33045},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Port","position":{"start":{"line":735,"column":7,"offset":33053},"end":{"line":735,"column":11,"offset":33057},"indent":[]}}],"position":{"start":{"line":735,"column":1,"offset":33047},"end":{"line":735,"column":11,"offset":33057},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"TCP port of the MQTT broker.","position":{"start":{"line":736,"column":1,"offset":33058},"end":{"line":736,"column":29,"offset":33086},"indent":[]}}],"position":{"start":{"line":736,"column":1,"offset":33058},"end":{"line":736,"column":29,"offset":33086},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Topic","position":{"start":{"line":738,"column":7,"offset":33094},"end":{"line":738,"column":12,"offset":33099},"indent":[]}}],"position":{"start":{"line":738,"column":1,"offset":33088},"end":{"line":738,"column":12,"offset":33099},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The topic to publish to.","position":{"start":{"line":739,"column":1,"offset":33100},"end":{"line":739,"column":25,"offset":33124},"indent":[]}}],"position":{"start":{"line":739,"column":1,"offset":33100},"end":{"line":739,"column":25,"offset":33124},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Username","position":{"start":{"line":741,"column":7,"offset":33132},"end":{"line":741,"column":15,"offset":33140},"indent":[]}}],"position":{"start":{"line":741,"column":1,"offset":33126},"end":{"line":741,"column":15,"offset":33140},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The username for authenticating to the MQTT broker. This is only supported by brokers that implement the MQTT spec v3.1. If username is not set (empty), the password argument is ignored. This is only needed if the MQTT broker is configured for authentication.","position":{"start":{"line":742,"column":1,"offset":33141},"end":{"line":742,"column":260,"offset":33400},"indent":[]}}],"position":{"start":{"line":742,"column":1,"offset":33141},"end":{"line":742,"column":260,"offset":33400},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Password","position":{"start":{"line":744,"column":7,"offset":33408},"end":{"line":744,"column":15,"offset":33416},"indent":[]}}],"position":{"start":{"line":744,"column":1,"offset":33402},"end":{"line":744,"column":15,"offset":33416},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The password to use, together with the username, for authenticating to the MQTT broker. This is only supported by brokers that implement the MQTT spec v3.1. This is only needed if the MQTT broker is configured for authentication.","position":{"start":{"line":745,"column":1,"offset":33417},"end":{"line":745,"column":230,"offset":33646},"indent":[]}}],"position":{"start":{"line":745,"column":1,"offset":33417},"end":{"line":745,"column":230,"offset":33646},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":747,"column":7,"offset":33654},"end":{"line":747,"column":16,"offset":33663},"indent":[]}}],"position":{"start":{"line":747,"column":1,"offset":33648},"end":{"line":747,"column":16,"offset":33663},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the MQTT will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":748,"column":1,"offset":33664},"end":{"line":748,"column":187,"offset":33850},"indent":[]}}],"position":{"start":{"line":748,"column":1,"offset":33664},"end":{"line":748,"column":187,"offset":33850},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Output","position":{"start":{"line":750,"column":7,"offset":33858},"end":{"line":750,"column":13,"offset":33864},"indent":[]}}],"position":{"start":{"line":750,"column":1,"offset":33852},"end":{"line":750,"column":13,"offset":33864},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A JSON object is published to the topic of the MQTT broker you have configured.","position":{"start":{"line":751,"column":1,"offset":33865},"end":{"line":751,"column":80,"offset":33944},"indent":[]}}],"position":{"start":{"line":751,"column":1,"offset":33865},"end":{"line":751,"column":80,"offset":33944},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"[\n 'regionCoordinates' : [618, 317, 703, 493],\n 'numberOfChanges' : 5446,\n 'timestamp' : '1465894497',\n 'microseconds' : '5-97451',\n 'token' : 695,\n 'pathToImage' : '1465894497_5-97451_frontdoor_618-317-703-493_5446_695.jpg',\n 'instanceName' : 'frontdoor',\n]","position":{"start":{"line":753,"column":1,"offset":33946},"end":{"line":763,"column":4,"offset":34223},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Example","position":{"start":{"line":765,"column":7,"offset":34231},"end":{"line":765,"column":14,"offset":34238},"indent":[]}}],"position":{"start":{"line":765,"column":1,"offset":34225},"end":{"line":765,"column":14,"offset":34238},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It is possible to subscribe multiple distributed IoT devices to the same MQTT topic and perform specific actions upon the detection of a motion. Devices with more resources could fetch the image to perform further elaboration.","position":{"start":{"line":766,"column":1,"offset":34239},"end":{"line":766,"column":227,"offset":34465},"indent":[]}}],"position":{"start":{"line":766,"column":1,"offset":34239},"end":{"line":766,"column":227,"offset":34465},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Streaming","position":{"start":{"line":768,"column":4,"offset":34470},"end":{"line":768,"column":13,"offset":34479},"indent":[]}}],"position":{"start":{"line":768,"column":1,"offset":34467},"end":{"line":768,"column":13,"offset":34479},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The machinery has the ability to stream your capture device as a MJPG stream.","position":{"start":{"line":770,"column":1,"offset":34481},"end":{"line":770,"column":78,"offset":34558},"indent":[]}}],"position":{"start":{"line":770,"column":1,"offset":34481},"end":{"line":770,"column":78,"offset":34558},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":772,"column":5,"offset":34564},"end":{"line":772,"column":15,"offset":34574},"indent":[]}}],"position":{"start":{"line":772,"column":1,"offset":34560},"end":{"line":772,"column":15,"offset":34574},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters for the supported streaming protocols can be found in the ","position":{"start":{"line":774,"column":1,"offset":34576},"end":{"line":774,"column":74,"offset":34649},"indent":[]}},{"type":"inlineCode","value":"config/stream.xml","position":{"start":{"line":774,"column":74,"offset":34649},"end":{"line":774,"column":93,"offset":34668},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file; at the moment of writing only a MJPG stream is supported.","position":{"start":{"line":774,"column":93,"offset":34668},"end":{"line":774,"column":256,"offset":34831},"indent":[]}}],"position":{"start":{"line":774,"column":1,"offset":34576},"end":{"line":774,"column":256,"offset":34831},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\t\n \ttrue\n \t8889\n \t75\n \t\n \t75\n \n","position":{"start":{"line":776,"column":1,"offset":34833},"end":{"line":786,"column":4,"offset":35099},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Enabled","position":{"start":{"line":788,"column":6,"offset":35106},"end":{"line":788,"column":13,"offset":35113},"indent":[]}}],"position":{"start":{"line":788,"column":1,"offset":35101},"end":{"line":788,"column":13,"offset":35113},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A boolean which turns ON/OFF the stream. This is interesting when working with IP cameras, where you already have an RTSP/MJPG stream from the camera itself.","position":{"start":{"line":790,"column":1,"offset":35115},"end":{"line":790,"column":158,"offset":35272},"indent":[]}}],"position":{"start":{"line":790,"column":1,"offset":35115},"end":{"line":790,"column":158,"offset":35272},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Stream Port","position":{"start":{"line":792,"column":6,"offset":35279},"end":{"line":792,"column":17,"offset":35290},"indent":[]}}],"position":{"start":{"line":792,"column":1,"offset":35274},"end":{"line":792,"column":17,"offset":35290},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The port on which the stream is available.","position":{"start":{"line":794,"column":1,"offset":35292},"end":{"line":794,"column":43,"offset":35334},"indent":[]}}],"position":{"start":{"line":794,"column":1,"offset":35292},"end":{"line":794,"column":43,"offset":35334},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Quality","position":{"start":{"line":796,"column":6,"offset":35341},"end":{"line":796,"column":13,"offset":35348},"indent":[]}}],"position":{"start":{"line":796,"column":1,"offset":35336},"end":{"line":796,"column":13,"offset":35348},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The quality is a value between ","position":{"start":{"line":798,"column":1,"offset":35350},"end":{"line":798,"column":32,"offset":35381},"indent":[]}},{"type":"linkReference","identifier":"0-100","label":"0-100","referenceType":"shortcut","children":[{"type":"text","value":"0-100","position":{"start":{"line":798,"column":33,"offset":35382},"end":{"line":798,"column":38,"offset":35387},"indent":[]}}],"position":{"start":{"line":798,"column":32,"offset":35381},"end":{"line":798,"column":39,"offset":35388},"indent":[]}},{"type":"text","value":". The lower the quality, the more the image will be compressed. If you're using the RaspberryPi Camera module, this option will be ignored.","position":{"start":{"line":798,"column":39,"offset":35388},"end":{"line":798,"column":178,"offset":35527},"indent":[]}}],"position":{"start":{"line":798,"column":1,"offset":35350},"end":{"line":798,"column":178,"offset":35527},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Username/password","position":{"start":{"line":800,"column":6,"offset":35534},"end":{"line":800,"column":23,"offset":35551},"indent":[]}}],"position":{"start":{"line":800,"column":1,"offset":35529},"end":{"line":800,"column":23,"offset":35551},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can secure the MJPEG streaming with a username and password. These credentials will be used to authorize your requests using Basic Authentication. Please note that once enabled, the live stream on the dashboard page can fail; however it will work if you open it directly in your browser or ip camera client. The format of the streaming url, after authentication enabled, will look as following:","position":{"start":{"line":802,"column":1,"offset":35553},"end":{"line":802,"column":399,"offset":35951},"indent":[]}}],"position":{"start":{"line":802,"column":1,"offset":35553},"end":{"line":802,"column":399,"offset":35951},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"http://username:password@ip-camera:8899","position":{"start":{"line":804,"column":1,"offset":35953},"end":{"line":806,"column":4,"offset":36002},"indent":[1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":809,"column":1,"offset":36005},"end":{"line":809,"column":31,"offset":36035},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":809,"column":31,"offset":36035}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport { Playground, Props } from 'docz'\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Machinery`}

\n

{`The machinery is the processing engine of Kerberos Open Source. It's an image processing framework, written in C++, who benefits from other third party libraries (OpenCV, etc). It takes images from the type of camera (USB-, IP- or RPi-camera) you've configured in the configuration files and executes one ore more algorithms and post-processes (e.g. save a snapshot). The configuration files allow you to define the type of camera, post-processes, conditions and much more; it's highly configurable. It's important to note that the machinery, out-of-the-box, can handle only one camera at a time.`}

\n

{`Project structure`}

\n

{`The machinery is an image processing framework which is devided into four steps:`}

\n
    \n
  • {`condition`}
  • \n
  • {`algorithm`}
  • \n
  • {`expositor`}
  • \n
  • {`heuristic`}
  • \n
\n

{`The steps belong to a four passway; illustrated on the image below. In each cycle a sequence of images is processed. Each step will process the sequence, and will return some result to the next step. For example: an algorithm will process the images and returns an array to the Expositor, which contains boolean values. The steps are loosly coupled, so they have simple conventions, just like the example before.`}

\n

{`Thanks to the loosly coupling, each step can be developed indepently. So algorithms, expositors, heuristics and conditions can be switched on the fly. This makes it easier for other developers who want to contribute to the machinery. They can create a new algorithm without knowing how a specific expositor or heuristic works. They just need to be aware of the convention an algorithm should meet.`}

\n

\"machinery

\n

{`These different steps can be configured by editing a couple of configurationn files located at `}{`config/`}{`. The main configuration file `}{`config/config.xml`}{` looks like this:`}

\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    `}{`<`}{`name`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`frontdoor`}{`{`name`}{`>`}{`\n`}{`    `}{`<`}{`logging`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`logging`}{`>`}{`\n`}{`    `}{`<`}{`timezone`}{` `}{`type`}{`=`}{`\"timezone\"`}{`>`}{`Europe-Brussels`}{`{`timezone`}{`>`}{`\n`}{`    `}{`<`}{`capture`}{` `}{`file`}{`=`}{`\"capture.xml\"`}{`>`}{`RaspiCamera`}{`{`capture`}{`>`}{`\n`}{`    `}{`<`}{`stream`}{` `}{`file`}{`=`}{`\"stream.xml\"`}{`>`}{`Mjpg`}{`{`stream`}{`>`}{`\n`}{`    `}{`<`}{`condition`}{` `}{`file`}{`=`}{`\"condition.xml\"`}{` `}{`type`}{`=`}{`\"multiple\"`}{`>`}{`Enabled`}{`{`condition`}{`>`}{`\n`}{`    `}{`<`}{`algorithm`}{` `}{`file`}{`=`}{`\"algorithm.xml\"`}{`>`}{`DifferentialCollins`}{`{`algorithm`}{`>`}{`\n`}{`    `}{`<`}{`expositor`}{` `}{`file`}{`=`}{`\"expositor.xml\"`}{`>`}{`Hull`}{`{`expositor`}{`>`}{`\n`}{`    `}{`<`}{`heuristic`}{` `}{`file`}{`=`}{`\"heuristic.xml\"`}{`>`}{`Sequence`}{`{`heuristic`}{`>`}{`\n`}{`    `}{`<`}{`io`}{` `}{`file`}{`=`}{`\"io.xml\"`}{` `}{`type`}{`=`}{`\"multiple\"`}{`>`}{`Video`}{`{`io`}{`>`}{`\n`}{`    `}{`<`}{`cloud`}{` `}{`file`}{`=`}{`\"cloud.xml\"`}{`>`}{`S3`}{`{`cloud`}{`>`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`Capture`}

\n

{`You can choose which capture device you will be using, you can use your old USB webcam, the popular Raspberry Pi camera or a state-of-the-art IP camera. The capture device will take pictures and deliver them to the algorithm if the conditions (the first step of the four passway) are valid.`}

\n

{`You can change the capture device by changing the `}{`config/config.xml`}{` file, and choose one of the following:`}

\n
    \n
  • {`USBCamera`}
  • \n
  • {`RaspiCamera`}
  • \n
  • {`IPCamera`}
  • \n
\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`capture`}{` `}{`file`}{`=`}{`\"capture.xml\"`}{`>`}{`RaspiCamera`}{`{`capture`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`USB camera`}

\n

{`The machinery supports a whole range of USB cameras. You will find a complete list here. Make sure you have updated the web interface, to make the machinery aware you will be using an USB camera.`}

\n

{`Parameters`}

\n

{`The parameters of the USB camera can be found in the `}{`config/capture.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`captures`}{`>`}{`\n`}{`  `}{`<`}{`USBCamera`}{`>`}{`\n`}{`    `}{`<`}{`frameWidth`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1280`}{`{`frameWidth`}{`>`}{`\n`}{`    `}{`<`}{`frameHeight`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`720`}{`{`frameHeight`}{`>`}{`\n`}{`    `}{`<`}{`deviceNumber`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`deviceNumber`}{`>`}{`\n`}{`    `}{`<`}{`delay`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`delay`}{`>`}{`\n`}{`    `}{`<`}{`angle`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`angle`}{`>`}{`\n`}{`  `}{`{`USBCamera`}{`>`}{`\n`}{`{`captures`}{`>`}
\n
{`Framewidth and -height`}
\n

{`You can set the resolution of the capture device, make sure the resolution you've defined is valid with your camera. Please check the specs of the USB camera you're using.`}

\n
{`Device number`}
\n

{`If more than one device is connected, you can specify the index of the USB-camera. The index is an integer (1-5).`}

\n
{`Delay`}
\n

{`You can provide a delay/interval (milliseconds) between two captures.`}

\n
{`Angle`}
\n

{`By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.`}

\n

{`Raspberry Pi Camera Module`}

\n

{`You can use the Raspberry Pi Camera Module with the machinery. You just need to attach the camera module and you're ready to go. The Raspberry Pi Camera Module is enabled by default in the web.`}

\n

{`Parameters`}

\n

{`The parameters of the Raspberry Pi Camera Module can be found in the config/capture.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`captures`}{`>`}{`\n`}{`  `}{`<`}{`RaspiCamera`}{`>`}{`\n`}{`    `}{`<`}{`frameWidth`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`640`}{`{`frameWidth`}{`>`}{`\n`}{`    `}{`<`}{`frameHeight`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`480`}{`{`frameHeight`}{`>`}{`\n`}{`    `}{`<`}{`delay`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1400`}{`{`delay`}{`>`}{`\n`}{`    `}{`<`}{`angle`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`angle`}{`>`}{`\n`}{`    `}{`<`}{`framerate`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`30`}{`{`framerate`}{`>`}{`\n`}{`    `}{`<`}{`sharpness`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`sharpness`}{`>`}{`\n`}{`    `}{`<`}{`saturation`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`saturation`}{`>`}{`\n`}{`    `}{`<`}{`contrast`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`contrast`}{`>`}{`\n`}{`    `}{`<`}{`brightness`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`50`}{`{`brightness`}{`>`}{`\n`}{`  `}{`{`RaspiCamera`}{`>`}{`\n`}{`{`captures`}{`>`}
\n
{`Framewidth and -height`}
\n

{`You can set the resolution of the camera module, make sure the resolution you've defined is valid.`}

\n
{`Delay`}
\n

{`You can provide a delay/interval (milliseconds) between two captures.`}

\n
{`Angle`}
\n

{`By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.`}

\n
{`Framerate`}
\n

{`The number of frames captures per second. Please note that this parameter will also be used if you're recording video. E.g. if you set this parameter to 20, you're recorded videos will also be 20 FPS.`}

\n
{`Sharpness, saturation, contrast, brightness`}
\n

{`Camera properties which you can specify to tune the settings to your needs.`}

\n

{`IP camera`}

\n

{`The machinery can be used with any IP camera, that provides a RTSP (or MJPEG) stream. Make sure that you know the correct URL of your IP camera, you can `}{`find a list here`}{`.`}

\n

{`Parameters`}

\n

{`The parameters of the IP capture device can be found in the `}{`config/capture.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`captures`}{`>`}{`\n`}{`  `}{`<`}{`IPCamera`}{`>`}{`\n`}{`    `}{`<`}{`url`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`http://username:password@ipaddress/image.jpg`}{`{`url`}{`>`}{`\n`}{`    `}{`<`}{`frameWidth`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`800`}{`{`frameWidth`}{`>`}{`\n`}{`    `}{`<`}{`frameHeight`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`640`}{`{`frameHeight`}{`>`}{`\n`}{`    `}{`<`}{`delay`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`delay`}{`>`}{`\n`}{`    `}{`<`}{`angle`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`angle`}{`>`}{`\n`}{`  `}{`{`IPCamera`}{`>`}{`\n`}{`{`captures`}{`>`}
\n
{`URL`}
\n

{`To use your IP camera, you should provide a valid RTSP (or MJPEG) URL. The machinery will take snapshots from this stream.`}

\n
{`Framewidth and -height`}
\n

{`You can set the resolution of the capture device, make sure the resolution you've defined is equal to the resolution you've defined in your IP-camera software.`}

\n
{`Delay`}
\n

{`You can provide a delay/interval (milliseconds) between two captures.`}

\n
{`Angle`}
\n

{`By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.`}

\n

{`Condition`}

\n

{`The condition is the first step of the four passway. In this step the machinery will determine if it's allowed to proceed to the next step. For example a condition can be a time constraint, a brightness threshold, etc; multiple conditions can be selected.`}

\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`condition`}{` `}{`file`}{`=`}{`\"condition.xml\"`}{` `}{`type`}{`=`}{`\"multiple\"`}{`>`}{`Enabled`}{`{`condition`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`Enabled`}

\n

{`It can be helpful to enable or disable the machinery at specific times. Therefore the time condition makes it possible to select a time range for each day of the week. When the current time is within the time range, the machinery will be enabled.`}

\n

{`Parameters`}

\n

{`The parameters of the Enabled condition can be found in the `}{`config/condition.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`conditions`}{`>`}{`\n`}{`  `}{`<`}{`Enabled`}{`>`}{`\n`}{`    `}{`<`}{`active`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`true`}{`{`active`}{`>`}{`\n`}{`    `}{`<`}{`delay`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`5000`}{`{`delay`}{`>`}{`\n`}{`  `}{`{`Enabled`}{`>`}{`\n`}{`{`conditions`}{`>`}
\n
{`Active`}
\n

{`The active field is boolean value (true/false). When the active field is true, the machinery is enabled, if not it's disabled.`}

\n
{`Delay`}
\n

{`The delay value is used when the condition failed, so when the current time isn't in the selected time range for that day. In that case the machinery will idle for the specified delay time. The value of the delay is expressed in miliseconds.`}

\n

{`Time`}

\n

{`It can be helpful to enable or disable the machinery at specific times. Therefore the time condition makes it possible to select a time range for each day of the week. When the current time is within the time range, the machinery will be enabled.`}

\n

{`Parameters`}

\n

{`The parameters of the Time condition can be found in the `}{`config/condition.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`conditions`}{`>`}{`\n`}{`  `}{`<`}{`Time`}{`>`}{`\n`}{`    `}{`<`}{`times`}{` `}{`type`}{`=`}{`\"timeselection\"`}{`>`}{`13:00,15:00-0:01,20:58-0:01,20:59-0:01,19:20-0:01,21:59-0,0-0,0`}{`{`times`}{`>`}{`\n`}{`    `}{`<`}{`delay`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`10000`}{`{`delay`}{`>`}{`\n`}{`  `}{`{`Time`}{`>`}{`\n`}{`{`conditions`}{`>`}
\n
{`Times`}
\n

{`The times property contains a list of times, delimited by a \"-\". The first item in the list will specify the time range for the first day of the week (Monday), the last item for the last day of the week (Sunday). The begin- and end-time, for a specific day, are delimited by a \",\" where the first element will specify that start time and the second one specifies the end time.`}

\n
{`Delay`}
\n

{`The delay value is used when the condition failed, so when the current time isn't in the selected time range for that day. In that case the machinery will idle for the specified delay time. The value of the delay is expressed in miliseconds.`}

\n

{`Algorithm`}

\n

{`The algorithm is the second step of the four passway. An algorithm will execute some kind of function on a sequence of images, and end up with a black and white image; just like the image below. An example of an algorithm would be one that does motion detection or one that would detect cats or dogs (using TensorFlow, ar any other Deep Learning framework).`}

\n

\"machinery

\n

{`The white pixels on the image will indicate the object of interest. For example, when looking for motion, the pixels that have been changed; it depends on what the algorithm is looking for. The black pixels are background pixels.`}

\n

{`The only convention that an algorithm should meet is that it should return a black and white image to the next step; the expositor. And of course that it requires a sequence of images as a parameter. Besides those conventions, an algorithm can do everything it wants to do. So you could create your own cat detection algorithm, marker detection, etc.`}

\n

{`You can select the algortihm in the `}{`config/config.xml`}{`.`}

\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`algorithm`}{` `}{`file`}{`=`}{`\"algorithm.xml\"`}{`>`}{`DifferentialCollins`}{`{`algorithm`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`Differential images`}

\n

{`This algorithm is a very simple method to detect motion; in terms of understanding but also processing. Just like the name says, it's the result of comparing images. When the images are compared, we know the pixels that have been changed and if the amount of pixels that changed is big enough, one can say that something happened and thus motion was detected.`}

\n

{`To get a more technical explanation: the algoritm will substract 2 or more images, and once that is done it will end up with a black and white image. The white pixels will mark the pixels that where different/changed and the black pixels are the pixels that have not changed; background pixels. Please note that there are several different combinations of substracting images. However for the machinery, we will use the method of Collins et al. as this method erases the phenomenon \"ghosting\".`}

\n

\"machinery

\n

{`In the image above the method of Collins et al. is illustrated. For this method we will process three images. The images are a sequence (from left to right), so the first (A) image was taken before the second (B) one, and the second (B) before the third (C) one. Next we will do a first comparision (C-B) of the third (C) image and the second (B) image, and after that we will do a second comparison (C-A) of the third (C) image and first (A) image.`}

\n

{`After the comparison we will end up with two difference images (C-B) and (C-A); both will mark the white pixels as changed pixels and black as non-changed pixels. To finish the algorithm we will do a logical AND-operation of the two difference images; this will give us the final black and white image ((C-B)&&(C-A)).`}

\n

{`The main idea of the Colins et al. method, is that it will erase \"ghosting\". In the last step we are doing a logical AND-operation, by doing this we will only keep the pixels, that changed in the first two images; therefore we can elimante false positives.`}

\n

{`Parameters`}

\n

{`The parameters of the Differential images algorithm can be found in the config/algorithm.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`algorithms`}{`>`}{`\n`}{`  `}{`<`}{`DifferentialCollins`}{`>`}{`\n`}{`    `}{`<`}{`erode`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`5`}{`{`erode`}{`>`}{`\n`}{`    `}{`<`}{`threshold`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`20`}{`{`threshold`}{`>`}{`\n`}{`  `}{`{`DifferentialCollins`}{`>`}{`\n`}{`{`algorithms`}{`>`}
\n
{`Erode`}
\n

{`The erode parameter represents a structural element (a morphological operation), which will be used to minimize the changed pixels; more information about eroding can be found here. The idea of the eroding is that pixels which are isolated will be removed; this means that when only one pixel changed, that pixel will reverted to the non-changed state. But for example when a large change happens and a lot of adjacent pixels are changed, the eroding will not be able to revert them.`}

\n

{`The higher the number of the erode parameter, the more aggressive the eroding will be. So high erode values, will make it possible that also large changes will be reverted to the non-changed state.`}

\n
{`Threshold`}
\n

{`When doing the comparison of two images, we won't end up with a clean black and white image. In most of the cases the values will be between 0 and 255; so gray values. This means that the value 0 will mean that both pixels where the same in both image, and values 255 mean that both pixels where totally different in both images. Of course we will also have values between 0-255, so pixels that are a little bit different in both images. So to make the resulting black and white image, we will need to apply a threshold value.`}

\n

{`The threshold will specify how much a pixel has to be different in the two images. So for example when the threshold is 30, it means that the difference between two pixels has to be equal or more then 30. The higher the threshold the more the pixel needs to be different, to be marked as changed.`}

\n

{`Expositor`}

\n

{`After the algorithm is executed, the expositor will determine, a region, where the changes were detected. An expositor can constrain a region in terms of selecting a hull or defining a rectangle.`}

\n

{`An expositor receives a black and white image as parameter and should modify a JSON object with all the information it processed. The JSON object must include: the bounding rectangle(s) of the positions where the pixels of interest are located and the number of pixels of interest. But can also include other optional parameters.`}

\n

{`You can change the expositor by changing the `}{`config/config.xml`}{` file, and choose one of the following:`}

\n
    \n
  • {`Hull`}
  • \n
  • {`Rectangle`}
  • \n
\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`expositor`}{` `}{`file`}{`=`}{`\"expositor.xml\"`}{`>`}{`Hull`}{`{`expositor`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`Rectangle`}

\n

{`This is a trivial expositor. A rectangle region can be defined to constrain the locations of pixels of interest. The rectangle repositor will return the region of the pixels of interest.`}

\n

{`Parameters`}

\n

{`The parameters of the rectangle expositor can be found in the config/expositor.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`expositors`}{`>`}{`\n`}{`  `}{`<`}{`Rectangle`}{`>`}{`\n`}{`    `}{`<`}{`region`}{`>`}{`\n`}{`      `}{`<`}{`x1`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`x1`}{`>`}{`\n`}{`      `}{`<`}{`y1`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`y1`}{`>`}{`\n`}{`      `}{`<`}{`x2`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1280`}{`{`x2`}{`>`}{`\n`}{`      `}{`<`}{`y2`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`720`}{`{`y2`}{`>`}{`\n`}{`    `}{`{`region`}{`>`}{`\n`}{`  `}{`{`Rectangle`}{`>`}{`\n`}{`{`expositors`}{`>`}
\n
{`Region`}
\n

{`The region parameter contains 4 values; x1, y1, x2 and y2 respectively. The values x1 and y1 indicate the x- and y-coordinate of the left upper starting point. The values x2 and y2 are the bottom right coordinates. A virtual rectangle will be drawn from (x1,y1) to (x2,y2). Pixels of interest that lie within this rectangle are valid pixels; if not they are invalid.`}

\n

{`Hull`}

\n

{`This hull is a more complex expositor than the rectangle. A hull can be selected with the web, you can select one or more coordinates to create a flexible region. The coordinates can be adjusted afterwards and be removed by double clicking on the coordinate. You can expand the hull by removing the start coordinate, which is marked by the white bullet.`}

\n

\"machinery

\n

{`Parameters`}

\n

{`The parameters of the hull expositor can be found in the config/expositor.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`expositors`}{`>`}{`\n`}{`  `}{`<`}{`Hull`}{`>`}{`\n`}{`    `}{`<`}{`region`}{` `}{`type`}{`=`}{`\"hullselection\"`}{`>`}{`347,361|627,266|975,328|1091,328|1148,413|1158,516|1121,534|962,567|699,648|531,700|243,613|423,550|665,453|850,470|666,361|467,385|325,460|165,372`}{`{`region`}{`>`}{`\n`}{`  `}{`{`Hull`}{`>`}{`\n`}{`{`expositors`}{`>`}
\n
{`Region`}
\n

{`The region parameter contains n values. Each value represents a coordinate (x,y) and are seperated by the \"|\" delimiter. These coordinates are used to calculate the concave hull. Pixels of interest that lie within the concave hull are valid pixels; if not they are invalid.`}

\n

{`Heuristic`}

\n

{`The heuristic is the last step in the four passway which will decide if the detection is valid or not. It will do this by using information from the previous steps (the expositor and the algorithm); e.g. number of changed pixels.`}

\n

{`You can change the heuristic by changing the `}{`config/config.xml`}{` file, and choose one of the following:`}

\n
    \n
  • {`Sequence`}
  • \n
\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`heuristic`}{` `}{`file`}{`=`}{`\"heuristic.xml\"`}{`>`}{`Sequence`}{`{`heuristic`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`Sequence`}

\n

{`This is a trivial heuristic. The sequence heuristic will store a single integer in memory, that will count the numbers of valid detections. When the heuristic will detect a false detection, it will decrease the count. The sequence heuristic will return true, if a threshold is reached; for example when something was detected three times in a row.`}

\n

{`Parameters`}

\n

{`The parameters of the Sequence heuristic can be found in the config/heuristic.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`heuristics`}{`>`}{`\n`}{`<`}{`Sequence`}{`>`}{`\n`}{`    `}{`<`}{`minimumChanges`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1`}{`{`minimumChanges`}{`>`}{`\n`}{`    `}{`<`}{`minimumDuration`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1`}{`{`minimumDuration`}{`>`}{`\n`}{`    `}{`<`}{`noMotionDelayTime`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`2000`}{`{`noMotionDelayTime`}{`>`}{`\n`}{`  `}{`{`Sequence`}{`>`}{`\n`}{`{`heuristics`}{`>`}
\n
{`Minimum changes`}
\n

{`The heuristic will only return true if enough changes have been detected. The minimum of changes indicates the minimum number of pixels that have to been changed, to be a valid detection.`}

\n
{`Minimum durations`}
\n

{`The minimum number of detections in a row to be a valid detection.`}

\n
{`No motion delay time`}
\n

{`When the heuristic failed, due to not enough pixels changed or not x detections in a row, the heuristic will idle for some time.`}

\n

{`Output`}

\n

{`If the heuristic determined that the evaluation was valid, one or more output operations can be executed. You configure which ooutput operations that will be executed, by modifying the configuration file or using the web interface.`}

\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`io`}{` `}{`file`}{`=`}{`\"io.xml\"`}{` `}{`type`}{`=`}{`\"multiple\"`}{`>`}{`Video`}{`{`io`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`You can choose which output devices you will be using. If you select multiple outputs, seperate them with an `}{`,`}{`. You can change the output device by changing the `}{`config/config.xml`}{` file, and choose one of the following:`}

\n
    \n
  • {`Disk`}
  • \n
  • {`Video`}
  • \n
  • {`GPIO`}
  • \n
  • {`TCPSocket`}
  • \n
  • {`Webhook`}
  • \n
  • {`MQTT`}
  • \n
  • {`Script`}
  • \n
\n

{`Disk`}

\n

{`An image can be saved to disk.`}

\n

{`Parameters`}

\n

{`The parameters of the Disk output device can be found in the `}{`config/io.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`Disk`}{`>`}{`\n`}{`    `}{`<`}{`fileFormat`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`timestamp_microseconds_instanceName_regionCoordinates_numberOfChanges_token.jpg`}{`{`fileFormat`}{`>`}{`\n`}{`    `}{`<`}{`directory`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`/etc/opt/kerberosio/capture/`}{`{`directory`}{`>`}{`\n`}{`    `}{`<`}{`markWithTimestamp`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`markWithTimestamp`}{`>`}{`\n`}{`    `}{`<`}{`timestampColor`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`white`}{`{`timestampColor`}{`>`}{`\n`}{`    `}{`<`}{`privacy`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`privacy`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`Disk`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`File format`}
\n

{`The format that will be used for the name of the image. One or more variables can be defined and will be replaced by the machinery. Note that when you're using a variables name in the file format, that this name should be defined in the JSON object.`}

\n
{`Directory`}
\n

{`The directory where the image will be saved to. By default images are saved to the /etc/opt/kerberosio/capture directory.`}

\n
{`Mark with timestamp`}
\n

{`When this settings is set to true, the image is marked with a timestamp.`}

\n
{`Timestamp color`}
\n

{`A color can be defined for timestamp: white, black, red, green and blue.`}

\n
{`Privacy`}
\n

{`The privacy mode can be activated to remove some parts from the image. This especially helpful if you want to filter out public areas. When this option is enabled you will seee that after configuring the Hull expositor, you'll see that the pixels outside your region of interest (Hull) are made black.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Disk will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n

{`Video`}

\n

{`When a valid event is detected, a video will be recorded for x seconds. When more valid events are detected, while a video is recording, the video file will further record for x seconds; so no new video file be recorded, but the existing one will be expanded.`}

\n

{`Parameters`}

\n

{`The parameters of the Video output device can be found in the `}{`config/io.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`Video`}{`>`}{`\n`}{`    `}{`<`}{`fps`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`3`}{`{`fps`}{`>`}{`\n`}{`    `}{`<`}{`recordAfter`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`5`}{`{`recordAfter`}{`>`}{`\n`}{`    `}{`<`}{`maxDuration`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`120`}{`{`maxDuration`}{`>`}{`\n`}{`    `}{`<`}{`extension`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`mp4`}{`{`extension`}{`>`}{`\n`}{`    `}{`<`}{`codec`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`h264`}{`{`codec`}{`>`}{`\n`}{`    `}{`<`}{`fileFormat`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`timestamp_microseconds_instanceName_regionCoordinates_numberOfChanges_token`}{`{`fileFormat`}{`>`}{`\n`}{`    `}{`<`}{`directory`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`/etc/opt/kerberosio/capture/`}{`{`directory`}{`>`}{`\n`}{`    `}{`<`}{`hardwareDirectory`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`/etc/opt/kerberosio/h264/`}{`{`hardwareDirectory`}{`>`}{`\n`}{`    `}{`<`}{`enableHardwareEncoding`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`true`}{`{`enableHardwareEncoding`}{`>`}{`\n`}{`    `}{`<`}{`markWithTimestamp`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`markWithTimestamp`}{`>`}{`\n`}{`    `}{`<`}{`timestampColor`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`white`}{`{`timestampColor`}{`>`}{`\n`}{`    `}{`<`}{`privacy`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`privacy`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`Video`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`FPS`}
\n

{`The frames per second of the video being recorded. Please note that this number is limited and depends heavily on your hardware setup. You'll be receiving following warning in the systems logs, if the machinery can't write the desired FPS.`}

\n
{`[trivial] IoVideo: framerate is too fast, can't record video at this speed (8/FPS)`}
\n
{`Record after`}
\n

{`The number of seconds recorded after the last valid event was detected. This means that when a video is already recording, and a valid event was detected, the video will be expanded with x more seconds.`}

\n
{`Extensions`}
\n

{`The extension or container of the video file. We highly recommend to use the MP4 container if you want cross-browser support. Leave this setting by default, if you don't know what you're doing.`}

\n
{`Codec`}
\n

{`The codec that is used to encode the video file.`}

\n
{`File format`}
\n

{`The format that will be used for the name of the image. One or more variables can be defined and will be replaced by the machinery. Note that when you're using a variables name in the file format, that this name should be defined in the JSON object.`}

\n
{`Directory`}
\n

{`The directory where the videos will be saved. By default videos are saved to the /etc/opt/kerberosio/capture directory.`}

\n
{`Hardware directory`}
\n

{`When using onboard hardware encoding (e.g. with Raspberry Pi camera), h264 video files are generated and stored in this directory. Afterwards these h264 files will be containerized to mp4 files, and stored in the Directory path.`}

\n
{`Enable Hardware encoding`}
\n

{`A boolean which can enable or disable hardware encoding. Please note that this option is enabled by default, but does not mean that it will work if you choose to use an USB camera.`}

\n
{`Mark with timestamp`}
\n

{`When this settings is set to true, the video is marked with a timestamp (similar to the Disk device).`}

\n
{`Timestamp color`}
\n

{`A color can be defined for timestamp: white, black, red, green and blue.`}

\n
{`Privacy`}
\n

{`The privacy mode can be activated to remove some parts from the video. This especially helpful if you want to filter out public areas.`}

\n
{`Video privacy`}
\n

{`After updating the configuration, you'll see that the pixels outside your region of interest (ROI) are made black; the image below illustrates this.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Video will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n

{`TCP/IP client`}

\n

{`The TCP/IP client will send a TCP packet to a server.`}

\n

{`Parameters`}

\n

{`The parameters of the TCP/IP client can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`TCPSocket`}{`>`}{`\n`}{`    `}{`<`}{`server`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`127.0.0.1`}{`{`server`}{`>`}{`\n`}{`    `}{`<`}{`port`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1337`}{`{`port`}{`>`}{`\n`}{`    `}{`<`}{`message`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`it's so fluffy`}{`{`message`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`TCPSocket`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`Server`}
\n

{`The IP of the TCP server.`}

\n
{`Port`}
\n

{`This is the port of the TCP server.`}

\n
{`Message`}
\n

{`You can send some data to a TCP server.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the TCP will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n

{`GPIO`}

\n

{`A GPIO pin can be set as output device.`}

\n

{`Parameters`}

\n

{`The parameters of the GPIO pin can be found in the `}{`config/io.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`GPIO`}{`>`}{`\n`}{`    `}{`<`}{`pin`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`17`}{`{`pin`}{`>`}{`\n`}{`    `}{`<`}{`periods`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`5`}{`{`periods`}{`>`}{`\n`}{`    `}{`<`}{`periodTime`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`100000`}{`{`periodTime`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`GPIO`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`Pin`}
\n

{`The pin that will be triggered.`}

\n
{`Periods`}
\n

{`The number of times the pin will be triggered.`}

\n
{`Period time`}
\n

{`The time in microseconds that the pin will be set high.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the GPIO will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n

{`Webhook`}

\n

{`Detailed information (a JSON object) is send as a POST request to a webhook. The JSON object contains the number of changes, the region, the URL of the image, etc. This is useful if you want to integrate with your own application.`}

\n

{`Make sure that the Webhook comes after the Disk device, otherwise the URL of the image is not included.`}

\n

{`Parameters`}

\n

{`The parameters of the webhook can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`Webhook`}{`>`}{`\n`}{`    `}{`<`}{`url`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`http://kerberos.web/api/v1/webhook`}{`{`url`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`Webhook`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`Url`}
\n

{`This is the URL, to which the machinery will send a JSON object (as a POST request).`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Webhook will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n
{`Output`}
\n

{`A JSON object is POSTed to the url you've defined.`}

\n
{`[`}{`\n`}{`  `}{`'regionCoordinates'`}{` `}{`:`}{` [`}{`618`}{`, `}{`317`}{`, `}{`703`}{`, `}{`493`}{`],`}{`\n`}{`  `}{`'numberOfChanges'`}{` `}{`:`}{` `}{`5446`}{`,`}{`\n`}{`  `}{`'timestamp'`}{` `}{`:`}{` `}{`'`}{`1465894497`}{`'`}{`,`}{`\n`}{`  `}{`'microseconds'`}{` `}{`:`}{` `}{`'`}{`5-97451`}{`'`}{`,`}{`\n`}{`  `}{`'token'`}{` `}{`:`}{` `}{`695`}{`,`}{`\n`}{`  `}{`'pathToImage'`}{` `}{`:`}{` `}{`'`}{`1465894497`}{`_`}{`5-97451`}{`_frontdoor_`}{`618-317-703-493`}{`_`}{`5446`}{`_`}{`695`}{`.jpg'`}{`,`}{`\n`}{`  `}{`'instanceName'`}{` `}{`:`}{` `}{`'frontdoor'`}{`,`}{`\n`}{`]`}
\n

{`Script`}

\n

{`A bash script can be executed after a valid event was detected. A JSON object is send in the first parameter to the script you've defined.`}

\n

{`Parameters`}

\n

{`The parameters of the Script output device can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`Script`}{`>`}{`\n`}{`    `}{`<`}{`path`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`/etc/opt/kerberosio/scripts/run.sh`}{`{`path`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`Script`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`Path`}
\n

{`The location of the script that will be executed on detection.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Script will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n
{`Example`}
\n

{`By default the script will point to /etc/opt/kerberosio/scripts/run.sh, which contains a template how you should start your script. Note that when using KiOS, this script will be read-only, copy it to the /data folder and change the path parameter.`}

\n
{`#!/bin/bash`}{`\n`}{`# -------------------------------------------`}{`\n`}{`# This is an example script which illustrates`}{`\n`}{`# how to use the Script IO device.`}{`\n`}{`#`}{`\n`}{`# --------------------------------------`}{`\n`}{`# The first parameter is the JSON object`}{`\n`}{`#`}{`\n`}{`# e.g. {\"regionCoordinates\":[308,250,346,329],\"numberOfChanges\":194,\"timestamp\":\"1486049622\",\"microseconds\":\"6-161868\",\"token\":344,\"pathToImage\":\"1486049622_6-161868_frontdoor_308-250-346-329_194_344.jpg\",\"instanceName\":\"frontdoor\"}`}{`\n`}{`JSON=`}{`$`}{`1`}{`\n`}{`# -------------------------------------------`}{`\n`}{`# You can use python to parse the JSON object`}{`\n`}{`# and get the required fields`}{`\n`}{`name=`}{`$`}{`(echo `}{`$`}{`JSON | python -c `}{`\"import sys, json; print json.load(sys.stdin)['instanceName']\"`}{`)`}{`\n`}{`coordinates=`}{`$`}{`(echo `}{`$`}{`JSON | python -c `}{`\"import sys, json; print json.load(sys.stdin)['regionCoordinates']\"`}{`)`}{`\n`}{`changes=`}{`$`}{`(echo `}{`$`}{`JSON | pythfon -c `}{`\"import sys, json; print json.load(sys.stdin)['numberOfChanges']\"`}{`)`}{`\n`}{`image=`}{`$`}{`(echo `}{`$`}{`JSON | python -c `}{`\"import sys, json; print json.load(sys.stdin)['pathToImage']\"`}{`)`}{`\n`}{`The idea `}{`is`}{` that you can use Python `}{`in`}{` your bash script, to parse the JSON `}{`object`}{` send `}{`as`}{` first parameter. Afterwards you can do `}{`with`}{` the output what you want.`}
\n

{`MQTT`}

\n

{`MQTT protocol is a light-weight Machine to Machine (M2M) protocol widely used in Internet of things.\nDetailed information (a JSON object) is published to an MQTT topic. The JSON object contains the number of changes, the region, the URL of the image, etc.`}

\n

{`Parameters`}

\n

{`The parameters of the MQTT output can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`\n`}{`  {`>`}{`\n`}{`    `}{`<`}{`secure`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`secure`}{`>`}{`\n`}{`    `}{`<`}{`verifycn`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`verifycn`}{`>`}{`\n`}{`    `}{`<`}{`server`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`127.0.0.1`}{`{`server`}{`>`}{`\n`}{`    `}{`<`}{`port`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1883`}{`{`port`}{`>`}{`\n`}{`    `}{`<`}{`topic`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`kios/mqtt`}{`{`topic`}{`>`}{`\n`}{`    `}{`<`}{`username`}{` `}{`type`}{`=`}{`\"text\"`}{`>{`username`}{`>`}{`\n`}{`    `}{`<`}{`password`}{` `}{`type`}{`=`}{`\"text\"`}{`>{`password`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`MQTT`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`Secure`}
\n

{`If checked, enable SSL/TLS support. Please note that when SSL/TLS support is enabled, the server certificate issuer is verified against the CA (Certification Authority) files available in /etc/ssl/certs.`}

\n
{`Verifycn`}
\n

{`If checked, the MQTT server FQDN or ip address must match the CN (Common Name) of the server certificate.`}

\n
{`Server`}
\n

{`IP address or FQDN of the MQTT broker.`}

\n
{`Port`}
\n

{`TCP port of the MQTT broker.`}

\n
{`Topic`}
\n

{`The topic to publish to.`}

\n
{`Username`}
\n

{`The username for authenticating to the MQTT broker. This is only supported by brokers that implement the MQTT spec v3.1. If username is not set (empty), the password argument is ignored. This is only needed if the MQTT broker is configured for authentication.`}

\n
{`Password`}
\n

{`The password to use, together with the username, for authenticating to the MQTT broker. This is only supported by brokers that implement the MQTT spec v3.1. This is only needed if the MQTT broker is configured for authentication.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the MQTT will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n
{`Output`}
\n

{`A JSON object is published to the topic of the MQTT broker you have configured.`}

\n
{`[`}{`\n`}{`  `}{`'regionCoordinates'`}{` `}{`:`}{` [`}{`618`}{`, `}{`317`}{`, `}{`703`}{`, `}{`493`}{`],`}{`\n`}{`  `}{`'numberOfChanges'`}{` `}{`:`}{` `}{`5446`}{`,`}{`\n`}{`  `}{`'timestamp'`}{` `}{`:`}{` `}{`'`}{`1465894497`}{`'`}{`,`}{`\n`}{`  `}{`'microseconds'`}{` `}{`:`}{` `}{`'`}{`5-97451`}{`'`}{`,`}{`\n`}{`  `}{`'token'`}{` `}{`:`}{` `}{`695`}{`,`}{`\n`}{`  `}{`'pathToImage'`}{` `}{`:`}{` `}{`'`}{`1465894497`}{`_`}{`5-97451`}{`_frontdoor_`}{`618-317-703-493`}{`_`}{`5446`}{`_`}{`695`}{`.jpg'`}{`,`}{`\n`}{`  `}{`'instanceName'`}{` `}{`:`}{` `}{`'frontdoor'`}{`,`}{`\n`}{`]`}
\n
{`Example`}
\n

{`It is possible to subscribe multiple distributed IoT devices to the same MQTT topic and perform specific actions upon the detection of a motion. Devices with more resources could fetch the image to perform further elaboration.`}

\n

{`Streaming`}

\n

{`The machinery has the ability to stream your capture device as a MJPG stream.`}

\n

{`Parameters`}

\n

{`The parameters for the supported streaming protocols can be found in the `}{`config/stream.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file; at the moment of writing only a MJPG stream is supported.`}

\n
{`<`}{`streams`}{`>`}{`\n`}{`\t`}{`<`}{`Mjpg`}{`>`}{`\n`}{`    \t`}{`<`}{`enabled`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`true`}{`{`enabled`}{`>`}{`\n`}{`    \t`}{`<`}{`streamPort`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`8889`}{`{`streamPort`}{`>`}{`\n`}{`    \t`}{`<`}{`quality`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`75`}{`{`quality`}{`>`}{`\n`}{`    \t`}{`<`}{`username`}{` `}{`type`}{`=`}{`\"number\"`}{`>{`username`}{`>`}{`\n`}{`    \t`}{`<`}{`password`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`75`}{`{`password`}{`>`}{`\n`}{`    `}{`{`Mjpg`}{`>`}{`\n`}{`{`streams`}{`>`}
\n

{`Enabled`}

\n

{`A boolean which turns ON/OFF the stream. This is interesting when working with IP cameras, where you already have an RTSP/MJPG stream from the camera itself.`}

\n

{`Stream Port`}

\n

{`The port on which the stream is available.`}

\n

{`Quality`}

\n

{`The quality is a value between `}{`[0-100]`}{`. The lower the quality, the more the image will be compressed. If you're using the RaspberryPi Camera module, this option will be ignored.`}

\n

{`Username/password`}

\n

{`You can secure the MJPEG streaming with a username and password. These credentials will be used to authorize your requests using Basic Authentication. Please note that once enabled, the live stream on the dashboard page can fail; however it will work if you open it directly in your browser or ip camera client. The format of the streaming url, after authentication enabled, will look as following:`}

\n
{`http:`}{`//username:password@ip-camera:8899`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760432000,"key":"gatsby-plugin-mdx-entire-payload-3268934987db5f9117642459e604986d-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import { Playground, Props } from 'docz'","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":41,"offset":199},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":10,"column":3,"offset":203},"end":{"line":10,"column":12,"offset":212},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":201},"end":{"line":10,"column":12,"offset":212},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The machinery is the processing engine of Kerberos Open Source. It's an image processing framework, written in C++, who benefits from other third party libraries (OpenCV, etc). It takes images from the type of camera (USB-, IP- or RPi-camera) you've configured in the configuration files and executes one ore more algorithms and post-processes (e.g. save a snapshot). The configuration files allow you to define the type of camera, post-processes, conditions and much more; it's highly configurable. It's important to note that the machinery, out-of-the-box, can handle only one camera at a time.","position":{"start":{"line":12,"column":1,"offset":214},"end":{"line":12,"column":597,"offset":810},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":214},"end":{"line":12,"column":597,"offset":810},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Project structure","position":{"start":{"line":14,"column":4,"offset":815},"end":{"line":14,"column":21,"offset":832},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":812},"end":{"line":14,"column":21,"offset":832},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The machinery is an image processing framework which is devided into four steps:","position":{"start":{"line":16,"column":1,"offset":834},"end":{"line":16,"column":81,"offset":914},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":834},"end":{"line":16,"column":81,"offset":914},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"condition","position":{"start":{"line":18,"column":3,"offset":918},"end":{"line":18,"column":12,"offset":927},"indent":[]}}],"position":{"start":{"line":18,"column":3,"offset":918},"end":{"line":18,"column":12,"offset":927},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":916},"end":{"line":18,"column":12,"offset":927},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"algorithm","position":{"start":{"line":19,"column":3,"offset":930},"end":{"line":19,"column":12,"offset":939},"indent":[]}}],"position":{"start":{"line":19,"column":3,"offset":930},"end":{"line":19,"column":12,"offset":939},"indent":[]}}],"position":{"start":{"line":19,"column":1,"offset":928},"end":{"line":19,"column":12,"offset":939},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"expositor","position":{"start":{"line":20,"column":3,"offset":942},"end":{"line":20,"column":12,"offset":951},"indent":[]}}],"position":{"start":{"line":20,"column":3,"offset":942},"end":{"line":20,"column":12,"offset":951},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":940},"end":{"line":20,"column":12,"offset":951},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"heuristic","position":{"start":{"line":21,"column":3,"offset":954},"end":{"line":21,"column":12,"offset":963},"indent":[]}}],"position":{"start":{"line":21,"column":3,"offset":954},"end":{"line":21,"column":12,"offset":963},"indent":[]}}],"position":{"start":{"line":21,"column":1,"offset":952},"end":{"line":21,"column":12,"offset":963},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":916},"end":{"line":21,"column":12,"offset":963},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"The steps belong to a four passway; illustrated on the image below. In each cycle a sequence of images is processed. Each step will process the sequence, and will return some result to the next step. For example: an algorithm will process the images and returns an array to the Expositor, which contains boolean values. The steps are loosly coupled, so they have simple conventions, just like the example before.","position":{"start":{"line":23,"column":1,"offset":965},"end":{"line":23,"column":413,"offset":1377},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":965},"end":{"line":23,"column":413,"offset":1377},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Thanks to the loosly coupling, each step can be developed indepently. So algorithms, expositors, heuristics and conditions can be switched on the fly. This makes it easier for other developers who want to contribute to the machinery. They can create a new algorithm without knowing how a specific expositor or heuristic works. They just need to be aware of the convention an algorithm should meet.","position":{"start":{"line":25,"column":1,"offset":1379},"end":{"line":25,"column":398,"offset":1776},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":1379},"end":{"line":25,"column":398,"offset":1776},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/machinery/project_structure.png","alt":"machinery project structure","position":{"start":{"line":27,"column":1,"offset":1778},"end":{"line":27,"column":84,"offset":1861},"indent":[]}}],"position":{"start":{"line":27,"column":1,"offset":1778},"end":{"line":27,"column":84,"offset":1861},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"These different steps can be configured by editing a couple of configurationn files located at ","position":{"start":{"line":29,"column":1,"offset":1863},"end":{"line":29,"column":96,"offset":1958},"indent":[]}},{"type":"inlineCode","value":"config/","position":{"start":{"line":29,"column":96,"offset":1958},"end":{"line":29,"column":105,"offset":1967},"indent":[]}},{"type":"text","value":". The main configuration file ","position":{"start":{"line":29,"column":105,"offset":1967},"end":{"line":29,"column":135,"offset":1997},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":29,"column":135,"offset":1997},"end":{"line":29,"column":154,"offset":2016},"indent":[]}},{"type":"text","value":" looks like this:","position":{"start":{"line":29,"column":154,"offset":2016},"end":{"line":29,"column":171,"offset":2033},"indent":[]}}],"position":{"start":{"line":29,"column":1,"offset":1863},"end":{"line":29,"column":171,"offset":2033},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n frontdoor\n false\n Europe-Brussels\n RaspiCamera\n Mjpg\n Enabled\n DifferentialCollins\n Hull\n Sequence\n Video\n S3\n \n","position":{"start":{"line":31,"column":1,"offset":2035},"end":{"line":48,"column":4,"offset":2690},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Capture","position":{"start":{"line":50,"column":4,"offset":2695},"end":{"line":50,"column":11,"offset":2702},"indent":[]}}],"position":{"start":{"line":50,"column":1,"offset":2692},"end":{"line":50,"column":11,"offset":2702},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can choose which capture device you will be using, you can use your old USB webcam, the popular Raspberry Pi camera or a state-of-the-art IP camera. The capture device will take pictures and deliver them to the algorithm if the conditions (the first step of the four passway) are valid.","position":{"start":{"line":52,"column":1,"offset":2704},"end":{"line":52,"column":291,"offset":2994},"indent":[]}}],"position":{"start":{"line":52,"column":1,"offset":2704},"end":{"line":52,"column":291,"offset":2994},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can change the capture device by changing the ","position":{"start":{"line":54,"column":1,"offset":2996},"end":{"line":54,"column":51,"offset":3046},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":54,"column":51,"offset":3046},"end":{"line":54,"column":70,"offset":3065},"indent":[]}},{"type":"text","value":" file, and choose one of the following:","position":{"start":{"line":54,"column":70,"offset":3065},"end":{"line":54,"column":109,"offset":3104},"indent":[]}}],"position":{"start":{"line":54,"column":1,"offset":2996},"end":{"line":54,"column":109,"offset":3104},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"USBCamera","position":{"start":{"line":55,"column":3,"offset":3107},"end":{"line":55,"column":12,"offset":3116},"indent":[]}}],"position":{"start":{"line":55,"column":3,"offset":3107},"end":{"line":55,"column":12,"offset":3116},"indent":[]}}],"position":{"start":{"line":55,"column":1,"offset":3105},"end":{"line":55,"column":12,"offset":3116},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"RaspiCamera","position":{"start":{"line":56,"column":3,"offset":3119},"end":{"line":56,"column":14,"offset":3130},"indent":[]}}],"position":{"start":{"line":56,"column":3,"offset":3119},"end":{"line":56,"column":14,"offset":3130},"indent":[]}}],"position":{"start":{"line":56,"column":1,"offset":3117},"end":{"line":56,"column":14,"offset":3130},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"IPCamera","position":{"start":{"line":57,"column":3,"offset":3133},"end":{"line":57,"column":11,"offset":3141},"indent":[]}}],"position":{"start":{"line":57,"column":3,"offset":3133},"end":{"line":57,"column":11,"offset":3141},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":3131},"end":{"line":57,"column":11,"offset":3141},"indent":[]}}],"position":{"start":{"line":55,"column":1,"offset":3105},"end":{"line":57,"column":11,"offset":3141},"indent":[1,1]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n RaspiCamera\n ...\n \n","position":{"start":{"line":59,"column":1,"offset":3143},"end":{"line":68,"column":4,"offset":3295},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"USB camera","position":{"start":{"line":70,"column":5,"offset":3301},"end":{"line":70,"column":15,"offset":3311},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":3297},"end":{"line":70,"column":15,"offset":3311},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The machinery supports a whole range of USB cameras. You will find a complete list here. Make sure you have updated the web interface, to make the machinery aware you will be using an USB camera.","position":{"start":{"line":72,"column":1,"offset":3313},"end":{"line":72,"column":196,"offset":3508},"indent":[]}}],"position":{"start":{"line":72,"column":1,"offset":3313},"end":{"line":72,"column":196,"offset":3508},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":74,"column":6,"offset":3515},"end":{"line":74,"column":16,"offset":3525},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":3510},"end":{"line":74,"column":16,"offset":3525},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the USB camera can be found in the ","position":{"start":{"line":76,"column":1,"offset":3527},"end":{"line":76,"column":54,"offset":3580},"indent":[]}},{"type":"inlineCode","value":"config/capture.xml","position":{"start":{"line":76,"column":54,"offset":3580},"end":{"line":76,"column":74,"offset":3600},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":76,"column":74,"offset":3600},"end":{"line":76,"column":179,"offset":3705},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":3527},"end":{"line":76,"column":179,"offset":3705},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 1280\n 720\n 0\n 0\n 0\n \n","position":{"start":{"line":78,"column":1,"offset":3707},"end":{"line":88,"column":4,"offset":3985},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Framewidth and -height","position":{"start":{"line":90,"column":7,"offset":3993},"end":{"line":90,"column":29,"offset":4015},"indent":[]}}],"position":{"start":{"line":90,"column":1,"offset":3987},"end":{"line":90,"column":29,"offset":4015},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can set the resolution of the capture device, make sure the resolution you've defined is valid with your camera. Please check the specs of the USB camera you're using.","position":{"start":{"line":92,"column":1,"offset":4017},"end":{"line":92,"column":172,"offset":4188},"indent":[]}}],"position":{"start":{"line":92,"column":1,"offset":4017},"end":{"line":92,"column":172,"offset":4188},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Device number","position":{"start":{"line":94,"column":7,"offset":4196},"end":{"line":94,"column":20,"offset":4209},"indent":[]}}],"position":{"start":{"line":94,"column":1,"offset":4190},"end":{"line":94,"column":20,"offset":4209},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If more than one device is connected, you can specify the index of the USB-camera. The index is an integer (1-5).","position":{"start":{"line":96,"column":1,"offset":4211},"end":{"line":96,"column":114,"offset":4324},"indent":[]}}],"position":{"start":{"line":96,"column":1,"offset":4211},"end":{"line":96,"column":114,"offset":4324},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Delay","position":{"start":{"line":98,"column":7,"offset":4332},"end":{"line":98,"column":12,"offset":4337},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":4326},"end":{"line":98,"column":12,"offset":4337},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can provide a delay/interval (milliseconds) between two captures.","position":{"start":{"line":100,"column":1,"offset":4339},"end":{"line":100,"column":70,"offset":4408},"indent":[]}}],"position":{"start":{"line":100,"column":1,"offset":4339},"end":{"line":100,"column":70,"offset":4408},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Angle","position":{"start":{"line":102,"column":7,"offset":4416},"end":{"line":102,"column":12,"offset":4421},"indent":[]}}],"position":{"start":{"line":102,"column":1,"offset":4410},"end":{"line":102,"column":12,"offset":4421},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.","position":{"start":{"line":104,"column":1,"offset":4423},"end":{"line":104,"column":218,"offset":4640},"indent":[]}}],"position":{"start":{"line":104,"column":1,"offset":4423},"end":{"line":104,"column":218,"offset":4640},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Raspberry Pi Camera Module","position":{"start":{"line":106,"column":5,"offset":4646},"end":{"line":106,"column":31,"offset":4672},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":4642},"end":{"line":106,"column":31,"offset":4672},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can use the Raspberry Pi Camera Module with the machinery. You just need to attach the camera module and you're ready to go. The Raspberry Pi Camera Module is enabled by default in the web.","position":{"start":{"line":108,"column":1,"offset":4674},"end":{"line":108,"column":194,"offset":4867},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":4674},"end":{"line":108,"column":194,"offset":4867},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":110,"column":6,"offset":4874},"end":{"line":110,"column":16,"offset":4884},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":4869},"end":{"line":110,"column":16,"offset":4884},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Raspberry Pi Camera Module can be found in the config/capture.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":112,"column":1,"offset":4886},"end":{"line":112,"column":193,"offset":5078},"indent":[]}}],"position":{"start":{"line":112,"column":1,"offset":4886},"end":{"line":112,"column":193,"offset":5078},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 640\n 480\n 1400\n 0\n 30\n 0\n 0\n 0\n 50\n \n","position":{"start":{"line":114,"column":1,"offset":5080},"end":{"line":128,"column":4,"offset":5534},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Framewidth and -height","position":{"start":{"line":130,"column":7,"offset":5542},"end":{"line":130,"column":29,"offset":5564},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":5536},"end":{"line":130,"column":29,"offset":5564},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can set the resolution of the camera module, make sure the resolution you've defined is valid.","position":{"start":{"line":132,"column":1,"offset":5566},"end":{"line":132,"column":99,"offset":5664},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":5566},"end":{"line":132,"column":99,"offset":5664},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Delay","position":{"start":{"line":134,"column":7,"offset":5672},"end":{"line":134,"column":12,"offset":5677},"indent":[]}}],"position":{"start":{"line":134,"column":1,"offset":5666},"end":{"line":134,"column":12,"offset":5677},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can provide a delay/interval (milliseconds) between two captures.","position":{"start":{"line":136,"column":1,"offset":5679},"end":{"line":136,"column":70,"offset":5748},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":5679},"end":{"line":136,"column":70,"offset":5748},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Angle","position":{"start":{"line":138,"column":7,"offset":5756},"end":{"line":138,"column":12,"offset":5761},"indent":[]}}],"position":{"start":{"line":138,"column":1,"offset":5750},"end":{"line":138,"column":12,"offset":5761},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.","position":{"start":{"line":140,"column":1,"offset":5763},"end":{"line":140,"column":218,"offset":5980},"indent":[]}}],"position":{"start":{"line":140,"column":1,"offset":5763},"end":{"line":140,"column":218,"offset":5980},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Framerate","position":{"start":{"line":142,"column":7,"offset":5988},"end":{"line":142,"column":16,"offset":5997},"indent":[]}}],"position":{"start":{"line":142,"column":1,"offset":5982},"end":{"line":142,"column":16,"offset":5997},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The number of frames captures per second. Please note that this parameter will also be used if you're recording video. E.g. if you set this parameter to 20, you're recorded videos will also be 20 FPS.","position":{"start":{"line":144,"column":1,"offset":5999},"end":{"line":144,"column":201,"offset":6199},"indent":[]}}],"position":{"start":{"line":144,"column":1,"offset":5999},"end":{"line":144,"column":201,"offset":6199},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Sharpness, saturation, contrast, brightness","position":{"start":{"line":146,"column":7,"offset":6207},"end":{"line":146,"column":50,"offset":6250},"indent":[]}}],"position":{"start":{"line":146,"column":1,"offset":6201},"end":{"line":146,"column":50,"offset":6250},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Camera properties which you can specify to tune the settings to your needs.","position":{"start":{"line":148,"column":1,"offset":6252},"end":{"line":148,"column":76,"offset":6327},"indent":[]}}],"position":{"start":{"line":148,"column":1,"offset":6252},"end":{"line":148,"column":76,"offset":6327},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"IP camera","position":{"start":{"line":150,"column":5,"offset":6333},"end":{"line":150,"column":14,"offset":6342},"indent":[]}}],"position":{"start":{"line":150,"column":1,"offset":6329},"end":{"line":150,"column":14,"offset":6342},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The machinery can be used with any IP camera, that provides a RTSP (or MJPEG) stream. Make sure that you know the correct URL of your IP camera, you can ","position":{"start":{"line":152,"column":1,"offset":6344},"end":{"line":152,"column":154,"offset":6497},"indent":[]}},{"type":"link","title":null,"url":"http://www.ispyconnect.com/sources.aspx","children":[{"type":"text","value":"find a list here","position":{"start":{"line":152,"column":155,"offset":6498},"end":{"line":152,"column":171,"offset":6514},"indent":[]}}],"position":{"start":{"line":152,"column":154,"offset":6497},"end":{"line":152,"column":213,"offset":6556},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":152,"column":213,"offset":6556},"end":{"line":152,"column":214,"offset":6557},"indent":[]}}],"position":{"start":{"line":152,"column":1,"offset":6344},"end":{"line":152,"column":214,"offset":6557},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":154,"column":6,"offset":6564},"end":{"line":154,"column":16,"offset":6574},"indent":[]}}],"position":{"start":{"line":154,"column":1,"offset":6559},"end":{"line":154,"column":16,"offset":6574},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the IP capture device can be found in the ","position":{"start":{"line":156,"column":1,"offset":6576},"end":{"line":156,"column":61,"offset":6636},"indent":[]}},{"type":"inlineCode","value":"config/capture.xml","position":{"start":{"line":156,"column":61,"offset":6636},"end":{"line":156,"column":81,"offset":6656},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":156,"column":81,"offset":6656},"end":{"line":156,"column":186,"offset":6761},"indent":[]}}],"position":{"start":{"line":156,"column":1,"offset":6576},"end":{"line":156,"column":186,"offset":6761},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n http://username:password@ipaddress/image.jpg\n 800\n 640\n 0\n 0\n \n","position":{"start":{"line":158,"column":1,"offset":6763},"end":{"line":168,"column":4,"offset":7061},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"URL","position":{"start":{"line":170,"column":7,"offset":7069},"end":{"line":170,"column":10,"offset":7072},"indent":[]}}],"position":{"start":{"line":170,"column":1,"offset":7063},"end":{"line":170,"column":10,"offset":7072},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To use your IP camera, you should provide a valid RTSP (or MJPEG) URL. The machinery will take snapshots from this stream.","position":{"start":{"line":172,"column":1,"offset":7074},"end":{"line":172,"column":123,"offset":7196},"indent":[]}}],"position":{"start":{"line":172,"column":1,"offset":7074},"end":{"line":172,"column":123,"offset":7196},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Framewidth and -height","position":{"start":{"line":174,"column":7,"offset":7204},"end":{"line":174,"column":29,"offset":7226},"indent":[]}}],"position":{"start":{"line":174,"column":1,"offset":7198},"end":{"line":174,"column":29,"offset":7226},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can set the resolution of the capture device, make sure the resolution you've defined is equal to the resolution you've defined in your IP-camera software.","position":{"start":{"line":176,"column":1,"offset":7228},"end":{"line":176,"column":160,"offset":7387},"indent":[]}}],"position":{"start":{"line":176,"column":1,"offset":7228},"end":{"line":176,"column":160,"offset":7387},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Delay","position":{"start":{"line":178,"column":7,"offset":7395},"end":{"line":178,"column":12,"offset":7400},"indent":[]}}],"position":{"start":{"line":178,"column":1,"offset":7389},"end":{"line":178,"column":12,"offset":7400},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can provide a delay/interval (milliseconds) between two captures.","position":{"start":{"line":180,"column":1,"offset":7402},"end":{"line":180,"column":70,"offset":7471},"indent":[]}}],"position":{"start":{"line":180,"column":1,"offset":7402},"end":{"line":180,"column":70,"offset":7471},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Angle","position":{"start":{"line":182,"column":7,"offset":7479},"end":{"line":182,"column":12,"offset":7484},"indent":[]}}],"position":{"start":{"line":182,"column":1,"offset":7473},"end":{"line":182,"column":12,"offset":7484},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.","position":{"start":{"line":184,"column":1,"offset":7486},"end":{"line":184,"column":218,"offset":7703},"indent":[]}}],"position":{"start":{"line":184,"column":1,"offset":7486},"end":{"line":184,"column":218,"offset":7703},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Condition","position":{"start":{"line":186,"column":4,"offset":7708},"end":{"line":186,"column":13,"offset":7717},"indent":[]}}],"position":{"start":{"line":186,"column":1,"offset":7705},"end":{"line":186,"column":13,"offset":7717},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The condition is the first step of the four passway. In this step the machinery will determine if it's allowed to proceed to the next step. For example a condition can be a time constraint, a brightness threshold, etc; multiple conditions can be selected.","position":{"start":{"line":188,"column":1,"offset":7719},"end":{"line":188,"column":256,"offset":7974},"indent":[]}}],"position":{"start":{"line":188,"column":1,"offset":7719},"end":{"line":188,"column":256,"offset":7974},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n Enabled\n ...\n \n","position":{"start":{"line":190,"column":1,"offset":7976},"end":{"line":199,"column":4,"offset":8146},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Enabled","position":{"start":{"line":201,"column":5,"offset":8152},"end":{"line":201,"column":12,"offset":8159},"indent":[]}}],"position":{"start":{"line":201,"column":1,"offset":8148},"end":{"line":201,"column":12,"offset":8159},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It can be helpful to enable or disable the machinery at specific times. Therefore the time condition makes it possible to select a time range for each day of the week. When the current time is within the time range, the machinery will be enabled.","position":{"start":{"line":203,"column":1,"offset":8161},"end":{"line":203,"column":247,"offset":8407},"indent":[]}}],"position":{"start":{"line":203,"column":1,"offset":8161},"end":{"line":203,"column":247,"offset":8407},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":205,"column":6,"offset":8414},"end":{"line":205,"column":16,"offset":8424},"indent":[]}}],"position":{"start":{"line":205,"column":1,"offset":8409},"end":{"line":205,"column":16,"offset":8424},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Enabled condition can be found in the ","position":{"start":{"line":207,"column":1,"offset":8426},"end":{"line":207,"column":61,"offset":8486},"indent":[]}},{"type":"inlineCode","value":"config/condition.xml","position":{"start":{"line":207,"column":61,"offset":8486},"end":{"line":207,"column":83,"offset":8508},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":207,"column":83,"offset":8508},"end":{"line":207,"column":188,"offset":8613},"indent":[]}}],"position":{"start":{"line":207,"column":1,"offset":8426},"end":{"line":207,"column":188,"offset":8613},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n true\n 5000\n \n","position":{"start":{"line":209,"column":1,"offset":8615},"end":{"line":216,"column":4,"offset":8753},"indent":[1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Active","position":{"start":{"line":218,"column":7,"offset":8761},"end":{"line":218,"column":13,"offset":8767},"indent":[]}}],"position":{"start":{"line":218,"column":1,"offset":8755},"end":{"line":218,"column":13,"offset":8767},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The active field is boolean value (true/false). When the active field is true, the machinery is enabled, if not it's disabled.","position":{"start":{"line":220,"column":1,"offset":8769},"end":{"line":220,"column":127,"offset":8895},"indent":[]}}],"position":{"start":{"line":220,"column":1,"offset":8769},"end":{"line":220,"column":127,"offset":8895},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Delay","position":{"start":{"line":222,"column":7,"offset":8903},"end":{"line":222,"column":12,"offset":8908},"indent":[]}}],"position":{"start":{"line":222,"column":1,"offset":8897},"end":{"line":222,"column":12,"offset":8908},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The delay value is used when the condition failed, so when the current time isn't in the selected time range for that day. In that case the machinery will idle for the specified delay time. The value of the delay is expressed in miliseconds.","position":{"start":{"line":224,"column":1,"offset":8910},"end":{"line":224,"column":242,"offset":9151},"indent":[]}}],"position":{"start":{"line":224,"column":1,"offset":8910},"end":{"line":224,"column":242,"offset":9151},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Time","position":{"start":{"line":226,"column":5,"offset":9157},"end":{"line":226,"column":9,"offset":9161},"indent":[]}}],"position":{"start":{"line":226,"column":1,"offset":9153},"end":{"line":226,"column":9,"offset":9161},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It can be helpful to enable or disable the machinery at specific times. Therefore the time condition makes it possible to select a time range for each day of the week. When the current time is within the time range, the machinery will be enabled.","position":{"start":{"line":228,"column":1,"offset":9163},"end":{"line":228,"column":247,"offset":9409},"indent":[]}}],"position":{"start":{"line":228,"column":1,"offset":9163},"end":{"line":228,"column":247,"offset":9409},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":230,"column":6,"offset":9416},"end":{"line":230,"column":16,"offset":9426},"indent":[]}}],"position":{"start":{"line":230,"column":1,"offset":9411},"end":{"line":230,"column":16,"offset":9426},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Time condition can be found in the ","position":{"start":{"line":232,"column":1,"offset":9428},"end":{"line":232,"column":58,"offset":9485},"indent":[]}},{"type":"inlineCode","value":"config/condition.xml","position":{"start":{"line":232,"column":58,"offset":9485},"end":{"line":232,"column":80,"offset":9507},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":232,"column":80,"offset":9507},"end":{"line":232,"column":185,"offset":9612},"indent":[]}}],"position":{"start":{"line":232,"column":1,"offset":9428},"end":{"line":232,"column":185,"offset":9612},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n","position":{"start":{"line":234,"column":1,"offset":9614},"end":{"line":241,"column":4,"offset":9813},"indent":[1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Times","position":{"start":{"line":243,"column":7,"offset":9821},"end":{"line":243,"column":12,"offset":9826},"indent":[]}}],"position":{"start":{"line":243,"column":1,"offset":9815},"end":{"line":243,"column":12,"offset":9826},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The times property contains a list of times, delimited by a \"-\". The first item in the list will specify the time range for the first day of the week (Monday), the last item for the last day of the week (Sunday). The begin- and end-time, for a specific day, are delimited by a \",\" where the first element will specify that start time and the second one specifies the end time.","position":{"start":{"line":245,"column":1,"offset":9828},"end":{"line":245,"column":377,"offset":10204},"indent":[]}}],"position":{"start":{"line":245,"column":1,"offset":9828},"end":{"line":245,"column":377,"offset":10204},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Delay","position":{"start":{"line":247,"column":7,"offset":10212},"end":{"line":247,"column":12,"offset":10217},"indent":[]}}],"position":{"start":{"line":247,"column":1,"offset":10206},"end":{"line":247,"column":12,"offset":10217},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The delay value is used when the condition failed, so when the current time isn't in the selected time range for that day. In that case the machinery will idle for the specified delay time. The value of the delay is expressed in miliseconds.","position":{"start":{"line":249,"column":1,"offset":10219},"end":{"line":249,"column":242,"offset":10460},"indent":[]}}],"position":{"start":{"line":249,"column":1,"offset":10219},"end":{"line":249,"column":242,"offset":10460},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Algorithm","position":{"start":{"line":251,"column":4,"offset":10465},"end":{"line":251,"column":13,"offset":10474},"indent":[]}}],"position":{"start":{"line":251,"column":1,"offset":10462},"end":{"line":251,"column":13,"offset":10474},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The algorithm is the second step of the four passway. An algorithm will execute some kind of function on a sequence of images, and end up with a black and white image; just like the image below. An example of an algorithm would be one that does motion detection or one that would detect cats or dogs (using TensorFlow, ar any other Deep Learning framework).","position":{"start":{"line":253,"column":1,"offset":10476},"end":{"line":253,"column":358,"offset":10833},"indent":[]}}],"position":{"start":{"line":253,"column":1,"offset":10476},"end":{"line":253,"column":358,"offset":10833},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/machinery/algorithm.png","alt":"machinery algorithm","position":{"start":{"line":255,"column":1,"offset":10835},"end":{"line":255,"column":68,"offset":10902},"indent":[]}}],"position":{"start":{"line":255,"column":1,"offset":10835},"end":{"line":255,"column":68,"offset":10902},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The white pixels on the image will indicate the object of interest. For example, when looking for motion, the pixels that have been changed; it depends on what the algorithm is looking for. The black pixels are background pixels.","position":{"start":{"line":257,"column":1,"offset":10904},"end":{"line":257,"column":230,"offset":11133},"indent":[]}}],"position":{"start":{"line":257,"column":1,"offset":10904},"end":{"line":257,"column":230,"offset":11133},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The only convention that an algorithm should meet is that it should return a black and white image to the next step; the expositor. And of course that it requires a sequence of images as a parameter. Besides those conventions, an algorithm can do everything it wants to do. So you could create your own cat detection algorithm, marker detection, etc.","position":{"start":{"line":259,"column":1,"offset":11135},"end":{"line":259,"column":351,"offset":11485},"indent":[]}}],"position":{"start":{"line":259,"column":1,"offset":11135},"end":{"line":259,"column":351,"offset":11485},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can select the algortihm in the ","position":{"start":{"line":261,"column":1,"offset":11487},"end":{"line":261,"column":37,"offset":11523},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":261,"column":37,"offset":11523},"end":{"line":261,"column":56,"offset":11542},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":261,"column":56,"offset":11542},"end":{"line":261,"column":57,"offset":11543},"indent":[]}}],"position":{"start":{"line":261,"column":1,"offset":11487},"end":{"line":261,"column":57,"offset":11543},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n DifferentialCollins\n ...\n \n","position":{"start":{"line":263,"column":1,"offset":11545},"end":{"line":272,"column":4,"offset":11711},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Differential images","position":{"start":{"line":274,"column":5,"offset":11717},"end":{"line":274,"column":24,"offset":11736},"indent":[]}}],"position":{"start":{"line":274,"column":1,"offset":11713},"end":{"line":274,"column":24,"offset":11736},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This algorithm is a very simple method to detect motion; in terms of understanding but also processing. Just like the name says, it's the result of comparing images. When the images are compared, we know the pixels that have been changed and if the amount of pixels that changed is big enough, one can say that something happened and thus motion was detected.","position":{"start":{"line":276,"column":1,"offset":11738},"end":{"line":276,"column":360,"offset":12097},"indent":[]}}],"position":{"start":{"line":276,"column":1,"offset":11738},"end":{"line":276,"column":360,"offset":12097},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To get a more technical explanation: the algoritm will substract 2 or more images, and once that is done it will end up with a black and white image. The white pixels will mark the pixels that where different/changed and the black pixels are the pixels that have not changed; background pixels. Please note that there are several different combinations of substracting images. However for the machinery, we will use the method of Collins et al. as this method erases the phenomenon \"ghosting\".","position":{"start":{"line":278,"column":1,"offset":12099},"end":{"line":278,"column":494,"offset":12592},"indent":[]}}],"position":{"start":{"line":278,"column":1,"offset":12099},"end":{"line":278,"column":494,"offset":12592},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/machinery/differential_images.png","alt":"machinery differential","position":{"start":{"line":280,"column":1,"offset":12594},"end":{"line":280,"column":81,"offset":12674},"indent":[]}}],"position":{"start":{"line":280,"column":1,"offset":12594},"end":{"line":280,"column":81,"offset":12674},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"In the image above the method of Collins et al. is illustrated. For this method we will process three images. The images are a sequence (from left to right), so the first (A) image was taken before the second (B) one, and the second (B) before the third (C) one. Next we will do a first comparision (C-B) of the third (C) image and the second (B) image, and after that we will do a second comparison (C-A) of the third (C) image and first (A) image.","position":{"start":{"line":282,"column":1,"offset":12676},"end":{"line":282,"column":450,"offset":13125},"indent":[]}}],"position":{"start":{"line":282,"column":1,"offset":12676},"end":{"line":282,"column":450,"offset":13125},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"After the comparison we will end up with two difference images (C-B) and (C-A); both will mark the white pixels as changed pixels and black as non-changed pixels. To finish the algorithm we will do a logical AND-operation of the two difference images; this will give us the final black and white image ((C-B)&&(C-A)).","position":{"start":{"line":284,"column":1,"offset":13127},"end":{"line":284,"column":318,"offset":13444},"indent":[]}}],"position":{"start":{"line":284,"column":1,"offset":13127},"end":{"line":284,"column":318,"offset":13444},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The main idea of the Colins et al. method, is that it will erase \"ghosting\". In the last step we are doing a logical AND-operation, by doing this we will only keep the pixels, that changed in the first two images; therefore we can elimante false positives.","position":{"start":{"line":286,"column":1,"offset":13446},"end":{"line":286,"column":257,"offset":13702},"indent":[]}}],"position":{"start":{"line":286,"column":1,"offset":13446},"end":{"line":286,"column":257,"offset":13702},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":288,"column":6,"offset":13709},"end":{"line":288,"column":16,"offset":13719},"indent":[]}}],"position":{"start":{"line":288,"column":1,"offset":13704},"end":{"line":288,"column":16,"offset":13719},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Differential images algorithm can be found in the config/algorithm.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":290,"column":1,"offset":13721},"end":{"line":290,"column":198,"offset":13918},"indent":[]}}],"position":{"start":{"line":290,"column":1,"offset":13721},"end":{"line":290,"column":198,"offset":13918},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 5\n 20\n \n","position":{"start":{"line":292,"column":1,"offset":13920},"end":{"line":299,"column":4,"offset":14085},"indent":[1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Erode","position":{"start":{"line":301,"column":7,"offset":14093},"end":{"line":301,"column":12,"offset":14098},"indent":[]}}],"position":{"start":{"line":301,"column":1,"offset":14087},"end":{"line":301,"column":12,"offset":14098},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The erode parameter represents a structural element (a morphological operation), which will be used to minimize the changed pixels; more information about eroding can be found here. The idea of the eroding is that pixels which are isolated will be removed; this means that when only one pixel changed, that pixel will reverted to the non-changed state. But for example when a large change happens and a lot of adjacent pixels are changed, the eroding will not be able to revert them.","position":{"start":{"line":303,"column":1,"offset":14100},"end":{"line":303,"column":484,"offset":14583},"indent":[]}}],"position":{"start":{"line":303,"column":1,"offset":14100},"end":{"line":303,"column":484,"offset":14583},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The higher the number of the erode parameter, the more aggressive the eroding will be. So high erode values, will make it possible that also large changes will be reverted to the non-changed state.","position":{"start":{"line":305,"column":1,"offset":14585},"end":{"line":305,"column":198,"offset":14782},"indent":[]}}],"position":{"start":{"line":305,"column":1,"offset":14585},"end":{"line":305,"column":198,"offset":14782},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Threshold","position":{"start":{"line":307,"column":7,"offset":14790},"end":{"line":307,"column":16,"offset":14799},"indent":[]}}],"position":{"start":{"line":307,"column":1,"offset":14784},"end":{"line":307,"column":16,"offset":14799},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When doing the comparison of two images, we won't end up with a clean black and white image. In most of the cases the values will be between 0 and 255; so gray values. This means that the value 0 will mean that both pixels where the same in both image, and values 255 mean that both pixels where totally different in both images. Of course we will also have values between 0-255, so pixels that are a little bit different in both images. So to make the resulting black and white image, we will need to apply a threshold value.","position":{"start":{"line":309,"column":1,"offset":14801},"end":{"line":309,"column":527,"offset":15327},"indent":[]}}],"position":{"start":{"line":309,"column":1,"offset":14801},"end":{"line":309,"column":527,"offset":15327},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The threshold will specify how much a pixel has to be different in the two images. So for example when the threshold is 30, it means that the difference between two pixels has to be equal or more then 30. The higher the threshold the more the pixel needs to be different, to be marked as changed.","position":{"start":{"line":311,"column":1,"offset":15329},"end":{"line":311,"column":297,"offset":15625},"indent":[]}}],"position":{"start":{"line":311,"column":1,"offset":15329},"end":{"line":311,"column":297,"offset":15625},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Expositor","position":{"start":{"line":313,"column":4,"offset":15630},"end":{"line":313,"column":13,"offset":15639},"indent":[]}}],"position":{"start":{"line":313,"column":1,"offset":15627},"end":{"line":313,"column":13,"offset":15639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"After the algorithm is executed, the expositor will determine, a region, where the changes were detected. An expositor can constrain a region in terms of selecting a hull or defining a rectangle.","position":{"start":{"line":315,"column":1,"offset":15641},"end":{"line":315,"column":196,"offset":15836},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":15641},"end":{"line":315,"column":196,"offset":15836},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"An expositor receives a black and white image as parameter and should modify a JSON object with all the information it processed. The JSON object must include: the bounding rectangle(s) of the positions where the pixels of interest are located and the number of pixels of interest. But can also include other optional parameters.","position":{"start":{"line":317,"column":1,"offset":15838},"end":{"line":317,"column":330,"offset":16167},"indent":[]}}],"position":{"start":{"line":317,"column":1,"offset":15838},"end":{"line":317,"column":330,"offset":16167},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can change the expositor by changing the ","position":{"start":{"line":319,"column":1,"offset":16169},"end":{"line":319,"column":46,"offset":16214},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":319,"column":46,"offset":16214},"end":{"line":319,"column":65,"offset":16233},"indent":[]}},{"type":"text","value":" file, and choose one of the following:","position":{"start":{"line":319,"column":65,"offset":16233},"end":{"line":319,"column":104,"offset":16272},"indent":[]}}],"position":{"start":{"line":319,"column":1,"offset":16169},"end":{"line":319,"column":104,"offset":16272},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Hull","position":{"start":{"line":320,"column":3,"offset":16275},"end":{"line":320,"column":7,"offset":16279},"indent":[]}}],"position":{"start":{"line":320,"column":3,"offset":16275},"end":{"line":320,"column":7,"offset":16279},"indent":[]}}],"position":{"start":{"line":320,"column":1,"offset":16273},"end":{"line":320,"column":7,"offset":16279},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Rectangle","position":{"start":{"line":321,"column":3,"offset":16282},"end":{"line":321,"column":12,"offset":16291},"indent":[]}}],"position":{"start":{"line":321,"column":3,"offset":16282},"end":{"line":321,"column":12,"offset":16291},"indent":[]}}],"position":{"start":{"line":321,"column":1,"offset":16280},"end":{"line":321,"column":12,"offset":16291},"indent":[]}}],"position":{"start":{"line":320,"column":1,"offset":16273},"end":{"line":321,"column":12,"offset":16291},"indent":[1]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n Hull\n ...\n \n","position":{"start":{"line":323,"column":1,"offset":16293},"end":{"line":332,"column":4,"offset":16444},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Rectangle","position":{"start":{"line":334,"column":5,"offset":16450},"end":{"line":334,"column":14,"offset":16459},"indent":[]}}],"position":{"start":{"line":334,"column":1,"offset":16446},"end":{"line":334,"column":14,"offset":16459},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This is a trivial expositor. A rectangle region can be defined to constrain the locations of pixels of interest. The rectangle repositor will return the region of the pixels of interest.","position":{"start":{"line":336,"column":1,"offset":16461},"end":{"line":336,"column":187,"offset":16647},"indent":[]}}],"position":{"start":{"line":336,"column":1,"offset":16461},"end":{"line":336,"column":187,"offset":16647},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":338,"column":6,"offset":16654},"end":{"line":338,"column":16,"offset":16664},"indent":[]}}],"position":{"start":{"line":338,"column":1,"offset":16649},"end":{"line":338,"column":16,"offset":16664},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the rectangle expositor can be found in the config/expositor.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":340,"column":1,"offset":16666},"end":{"line":340,"column":188,"offset":16853},"indent":[]}}],"position":{"start":{"line":340,"column":1,"offset":16666},"end":{"line":340,"column":188,"offset":16853},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n \n 0\n 0\n 1280\n 720\n \n \n","position":{"start":{"line":342,"column":1,"offset":16855},"end":{"line":353,"column":4,"offset":17077},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Region","position":{"start":{"line":355,"column":7,"offset":17085},"end":{"line":355,"column":13,"offset":17091},"indent":[]}}],"position":{"start":{"line":355,"column":1,"offset":17079},"end":{"line":355,"column":13,"offset":17091},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The region parameter contains 4 values; x1, y1, x2 and y2 respectively. The values x1 and y1 indicate the x- and y-coordinate of the left upper starting point. The values x2 and y2 are the bottom right coordinates. A virtual rectangle will be drawn from (x1,y1) to (x2,y2). Pixels of interest that lie within this rectangle are valid pixels; if not they are invalid.","position":{"start":{"line":357,"column":1,"offset":17093},"end":{"line":357,"column":367,"offset":17459},"indent":[]}}],"position":{"start":{"line":357,"column":1,"offset":17093},"end":{"line":357,"column":367,"offset":17459},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Hull","position":{"start":{"line":359,"column":5,"offset":17465},"end":{"line":359,"column":9,"offset":17469},"indent":[]}}],"position":{"start":{"line":359,"column":1,"offset":17461},"end":{"line":359,"column":9,"offset":17469},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This hull is a more complex expositor than the rectangle. A hull can be selected with the web, you can select one or more coordinates to create a flexible region. The coordinates can be adjusted afterwards and be removed by double clicking on the coordinate. You can expand the hull by removing the start coordinate, which is marked by the white bullet.","position":{"start":{"line":361,"column":1,"offset":17471},"end":{"line":361,"column":354,"offset":17824},"indent":[]}}],"position":{"start":{"line":361,"column":1,"offset":17471},"end":{"line":361,"column":354,"offset":17824},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/machinery/hull.png","alt":"machinery hull","position":{"start":{"line":363,"column":1,"offset":17826},"end":{"line":363,"column":58,"offset":17883},"indent":[]}}],"position":{"start":{"line":363,"column":1,"offset":17826},"end":{"line":363,"column":58,"offset":17883},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":365,"column":6,"offset":17890},"end":{"line":365,"column":16,"offset":17900},"indent":[]}}],"position":{"start":{"line":365,"column":1,"offset":17885},"end":{"line":365,"column":16,"offset":17900},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the hull expositor can be found in the config/expositor.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":367,"column":1,"offset":17902},"end":{"line":367,"column":183,"offset":18084},"indent":[]}}],"position":{"start":{"line":367,"column":1,"offset":17902},"end":{"line":367,"column":183,"offset":18084},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 347,361|627,266|975,328|1091,328|1148,413|1158,516|1121,534|962,567|699,648|531,700|243,613|423,550|665,453|850,470|666,361|467,385|325,460|165,372\n \n","position":{"start":{"line":369,"column":1,"offset":18086},"end":{"line":375,"column":4,"offset":18332},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Region","position":{"start":{"line":377,"column":7,"offset":18340},"end":{"line":377,"column":13,"offset":18346},"indent":[]}}],"position":{"start":{"line":377,"column":1,"offset":18334},"end":{"line":377,"column":13,"offset":18346},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The region parameter contains n values. Each value represents a coordinate (x,y) and are seperated by the \"|\" delimiter. These coordinates are used to calculate the concave hull. Pixels of interest that lie within the concave hull are valid pixels; if not they are invalid.","position":{"start":{"line":378,"column":1,"offset":18347},"end":{"line":378,"column":274,"offset":18620},"indent":[]}}],"position":{"start":{"line":378,"column":1,"offset":18347},"end":{"line":378,"column":274,"offset":18620},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Heuristic","position":{"start":{"line":380,"column":4,"offset":18625},"end":{"line":380,"column":13,"offset":18634},"indent":[]}}],"position":{"start":{"line":380,"column":1,"offset":18622},"end":{"line":380,"column":13,"offset":18634},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The heuristic is the last step in the four passway which will decide if the detection is valid or not. It will do this by using information from the previous steps (the expositor and the algorithm); e.g. number of changed pixels.","position":{"start":{"line":382,"column":1,"offset":18636},"end":{"line":382,"column":230,"offset":18865},"indent":[]}}],"position":{"start":{"line":382,"column":1,"offset":18636},"end":{"line":382,"column":230,"offset":18865},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can change the heuristic by changing the ","position":{"start":{"line":384,"column":1,"offset":18867},"end":{"line":384,"column":46,"offset":18912},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":384,"column":46,"offset":18912},"end":{"line":384,"column":65,"offset":18931},"indent":[]}},{"type":"text","value":" file, and choose one of the following:","position":{"start":{"line":384,"column":65,"offset":18931},"end":{"line":384,"column":104,"offset":18970},"indent":[]}}],"position":{"start":{"line":384,"column":1,"offset":18867},"end":{"line":384,"column":104,"offset":18970},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Sequence","position":{"start":{"line":385,"column":3,"offset":18973},"end":{"line":385,"column":11,"offset":18981},"indent":[]}}],"position":{"start":{"line":385,"column":3,"offset":18973},"end":{"line":385,"column":11,"offset":18981},"indent":[]}}],"position":{"start":{"line":385,"column":1,"offset":18971},"end":{"line":385,"column":11,"offset":18981},"indent":[]}}],"position":{"start":{"line":385,"column":1,"offset":18971},"end":{"line":385,"column":11,"offset":18981},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n Sequence\n ...\n \n","position":{"start":{"line":387,"column":1,"offset":18983},"end":{"line":396,"column":4,"offset":19138},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Sequence","position":{"start":{"line":398,"column":5,"offset":19144},"end":{"line":398,"column":13,"offset":19152},"indent":[]}}],"position":{"start":{"line":398,"column":1,"offset":19140},"end":{"line":398,"column":13,"offset":19152},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This is a trivial heuristic. The sequence heuristic will store a single integer in memory, that will count the numbers of valid detections. When the heuristic will detect a false detection, it will decrease the count. The sequence heuristic will return true, if a threshold is reached; for example when something was detected three times in a row.","position":{"start":{"line":400,"column":1,"offset":19154},"end":{"line":400,"column":348,"offset":19501},"indent":[]}}],"position":{"start":{"line":400,"column":1,"offset":19154},"end":{"line":400,"column":348,"offset":19501},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":402,"column":6,"offset":19508},"end":{"line":402,"column":16,"offset":19518},"indent":[]}}],"position":{"start":{"line":402,"column":1,"offset":19503},"end":{"line":402,"column":16,"offset":19518},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Sequence heuristic can be found in the config/heuristic.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":404,"column":1,"offset":19520},"end":{"line":404,"column":187,"offset":19706},"indent":[]}}],"position":{"start":{"line":404,"column":1,"offset":19520},"end":{"line":404,"column":187,"offset":19706},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n 1\n 1\n 2000\n \n","position":{"start":{"line":406,"column":1,"offset":19708},"end":{"line":414,"column":4,"offset":19940},"indent":[1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Minimum changes","position":{"start":{"line":416,"column":7,"offset":19948},"end":{"line":416,"column":22,"offset":19963},"indent":[]}}],"position":{"start":{"line":416,"column":1,"offset":19942},"end":{"line":416,"column":22,"offset":19963},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The heuristic will only return true if enough changes have been detected. The minimum of changes indicates the minimum number of pixels that have to been changed, to be a valid detection.","position":{"start":{"line":418,"column":1,"offset":19965},"end":{"line":418,"column":188,"offset":20152},"indent":[]}}],"position":{"start":{"line":418,"column":1,"offset":19965},"end":{"line":418,"column":188,"offset":20152},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Minimum durations","position":{"start":{"line":420,"column":7,"offset":20160},"end":{"line":420,"column":24,"offset":20177},"indent":[]}}],"position":{"start":{"line":420,"column":1,"offset":20154},"end":{"line":420,"column":24,"offset":20177},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The minimum number of detections in a row to be a valid detection.","position":{"start":{"line":422,"column":1,"offset":20179},"end":{"line":422,"column":67,"offset":20245},"indent":[]}}],"position":{"start":{"line":422,"column":1,"offset":20179},"end":{"line":422,"column":67,"offset":20245},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"No motion delay time","position":{"start":{"line":424,"column":7,"offset":20253},"end":{"line":424,"column":27,"offset":20273},"indent":[]}}],"position":{"start":{"line":424,"column":1,"offset":20247},"end":{"line":424,"column":27,"offset":20273},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When the heuristic failed, due to not enough pixels changed or not x detections in a row, the heuristic will idle for some time.","position":{"start":{"line":426,"column":1,"offset":20275},"end":{"line":426,"column":129,"offset":20403},"indent":[]}}],"position":{"start":{"line":426,"column":1,"offset":20275},"end":{"line":426,"column":129,"offset":20403},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Output","position":{"start":{"line":428,"column":4,"offset":20408},"end":{"line":428,"column":10,"offset":20414},"indent":[]}}],"position":{"start":{"line":428,"column":1,"offset":20405},"end":{"line":428,"column":10,"offset":20414},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If the heuristic determined that the evaluation was valid, one or more output operations can be executed. You configure which ooutput operations that will be executed, by modifying the configuration file or using the web interface.","position":{"start":{"line":430,"column":1,"offset":20416},"end":{"line":430,"column":232,"offset":20647},"indent":[]}}],"position":{"start":{"line":430,"column":1,"offset":20416},"end":{"line":430,"column":232,"offset":20647},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\n \n ...\n Video\n ...\n \n","position":{"start":{"line":432,"column":1,"offset":20649},"end":{"line":441,"column":4,"offset":20796},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"You can choose which output devices you will be using. If you select multiple outputs, seperate them with an ","position":{"start":{"line":443,"column":1,"offset":20798},"end":{"line":443,"column":110,"offset":20907},"indent":[]}},{"type":"inlineCode","value":",","position":{"start":{"line":443,"column":110,"offset":20907},"end":{"line":443,"column":113,"offset":20910},"indent":[]}},{"type":"text","value":". You can change the output device by changing the ","position":{"start":{"line":443,"column":113,"offset":20910},"end":{"line":443,"column":164,"offset":20961},"indent":[]}},{"type":"inlineCode","value":"config/config.xml","position":{"start":{"line":443,"column":164,"offset":20961},"end":{"line":443,"column":183,"offset":20980},"indent":[]}},{"type":"text","value":" file, and choose one of the following:","position":{"start":{"line":443,"column":183,"offset":20980},"end":{"line":443,"column":222,"offset":21019},"indent":[]}}],"position":{"start":{"line":443,"column":1,"offset":20798},"end":{"line":443,"column":222,"offset":21019},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disk","position":{"start":{"line":444,"column":3,"offset":21022},"end":{"line":444,"column":7,"offset":21026},"indent":[]}}],"position":{"start":{"line":444,"column":3,"offset":21022},"end":{"line":444,"column":7,"offset":21026},"indent":[]}}],"position":{"start":{"line":444,"column":1,"offset":21020},"end":{"line":444,"column":7,"offset":21026},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Video","position":{"start":{"line":445,"column":3,"offset":21029},"end":{"line":445,"column":8,"offset":21034},"indent":[]}}],"position":{"start":{"line":445,"column":3,"offset":21029},"end":{"line":445,"column":8,"offset":21034},"indent":[]}}],"position":{"start":{"line":445,"column":1,"offset":21027},"end":{"line":445,"column":8,"offset":21034},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"GPIO","position":{"start":{"line":446,"column":3,"offset":21037},"end":{"line":446,"column":7,"offset":21041},"indent":[]}}],"position":{"start":{"line":446,"column":3,"offset":21037},"end":{"line":446,"column":7,"offset":21041},"indent":[]}}],"position":{"start":{"line":446,"column":1,"offset":21035},"end":{"line":446,"column":7,"offset":21041},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"TCPSocket","position":{"start":{"line":447,"column":3,"offset":21044},"end":{"line":447,"column":12,"offset":21053},"indent":[]}}],"position":{"start":{"line":447,"column":3,"offset":21044},"end":{"line":447,"column":12,"offset":21053},"indent":[]}}],"position":{"start":{"line":447,"column":1,"offset":21042},"end":{"line":447,"column":12,"offset":21053},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Webhook","position":{"start":{"line":448,"column":3,"offset":21056},"end":{"line":448,"column":10,"offset":21063},"indent":[]}}],"position":{"start":{"line":448,"column":3,"offset":21056},"end":{"line":448,"column":10,"offset":21063},"indent":[]}}],"position":{"start":{"line":448,"column":1,"offset":21054},"end":{"line":448,"column":10,"offset":21063},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MQTT","position":{"start":{"line":449,"column":3,"offset":21066},"end":{"line":449,"column":7,"offset":21070},"indent":[]}}],"position":{"start":{"line":449,"column":3,"offset":21066},"end":{"line":449,"column":7,"offset":21070},"indent":[]}}],"position":{"start":{"line":449,"column":1,"offset":21064},"end":{"line":449,"column":7,"offset":21070},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Script","position":{"start":{"line":450,"column":3,"offset":21073},"end":{"line":450,"column":9,"offset":21079},"indent":[]}}],"position":{"start":{"line":450,"column":3,"offset":21073},"end":{"line":450,"column":9,"offset":21079},"indent":[]}}],"position":{"start":{"line":450,"column":1,"offset":21071},"end":{"line":450,"column":9,"offset":21079},"indent":[]}}],"position":{"start":{"line":444,"column":1,"offset":21020},"end":{"line":450,"column":9,"offset":21079},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Disk","position":{"start":{"line":452,"column":5,"offset":21085},"end":{"line":452,"column":9,"offset":21089},"indent":[]}}],"position":{"start":{"line":452,"column":1,"offset":21081},"end":{"line":452,"column":9,"offset":21089},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"An image can be saved to disk.","position":{"start":{"line":454,"column":1,"offset":21091},"end":{"line":454,"column":31,"offset":21121},"indent":[]}}],"position":{"start":{"line":454,"column":1,"offset":21091},"end":{"line":454,"column":31,"offset":21121},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":456,"column":6,"offset":21128},"end":{"line":456,"column":16,"offset":21138},"indent":[]}}],"position":{"start":{"line":456,"column":1,"offset":21123},"end":{"line":456,"column":16,"offset":21138},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Disk output device can be found in the ","position":{"start":{"line":458,"column":1,"offset":21140},"end":{"line":458,"column":62,"offset":21201},"indent":[]}},{"type":"inlineCode","value":"config/io.xml","position":{"start":{"line":458,"column":62,"offset":21201},"end":{"line":458,"column":77,"offset":21216},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":458,"column":77,"offset":21216},"end":{"line":458,"column":182,"offset":21321},"indent":[]}}],"position":{"start":{"line":458,"column":1,"offset":21140},"end":{"line":458,"column":182,"offset":21321},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n timestamp_microseconds_instanceName_regionCoordinates_numberOfChanges_token.jpg\n /etc/opt/kerberosio/capture/\n false\n white\n false\n 0\n \n","position":{"start":{"line":460,"column":1,"offset":21323},"end":{"line":471,"column":4,"offset":21754},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"File format","position":{"start":{"line":473,"column":7,"offset":21762},"end":{"line":473,"column":18,"offset":21773},"indent":[]}}],"position":{"start":{"line":473,"column":1,"offset":21756},"end":{"line":473,"column":18,"offset":21773},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The format that will be used for the name of the image. One or more variables can be defined and will be replaced by the machinery. Note that when you're using a variables name in the file format, that this name should be defined in the JSON object.","position":{"start":{"line":475,"column":1,"offset":21775},"end":{"line":475,"column":250,"offset":22024},"indent":[]}}],"position":{"start":{"line":475,"column":1,"offset":21775},"end":{"line":475,"column":250,"offset":22024},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Directory","position":{"start":{"line":477,"column":7,"offset":22032},"end":{"line":477,"column":16,"offset":22041},"indent":[]}}],"position":{"start":{"line":477,"column":1,"offset":22026},"end":{"line":477,"column":16,"offset":22041},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The directory where the image will be saved to. By default images are saved to the /etc/opt/kerberosio/capture directory.","position":{"start":{"line":479,"column":1,"offset":22043},"end":{"line":479,"column":122,"offset":22164},"indent":[]}}],"position":{"start":{"line":479,"column":1,"offset":22043},"end":{"line":479,"column":122,"offset":22164},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Mark with timestamp","position":{"start":{"line":481,"column":7,"offset":22172},"end":{"line":481,"column":26,"offset":22191},"indent":[]}}],"position":{"start":{"line":481,"column":1,"offset":22166},"end":{"line":481,"column":26,"offset":22191},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When this settings is set to true, the image is marked with a timestamp.","position":{"start":{"line":483,"column":1,"offset":22193},"end":{"line":483,"column":73,"offset":22265},"indent":[]}}],"position":{"start":{"line":483,"column":1,"offset":22193},"end":{"line":483,"column":73,"offset":22265},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Timestamp color","position":{"start":{"line":485,"column":7,"offset":22273},"end":{"line":485,"column":22,"offset":22288},"indent":[]}}],"position":{"start":{"line":485,"column":1,"offset":22267},"end":{"line":485,"column":22,"offset":22288},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A color can be defined for timestamp: white, black, red, green and blue.","position":{"start":{"line":486,"column":1,"offset":22289},"end":{"line":486,"column":73,"offset":22361},"indent":[]}}],"position":{"start":{"line":486,"column":1,"offset":22289},"end":{"line":486,"column":73,"offset":22361},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Privacy","position":{"start":{"line":488,"column":7,"offset":22369},"end":{"line":488,"column":14,"offset":22376},"indent":[]}}],"position":{"start":{"line":488,"column":1,"offset":22363},"end":{"line":488,"column":14,"offset":22376},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The privacy mode can be activated to remove some parts from the image. This especially helpful if you want to filter out public areas. When this option is enabled you will seee that after configuring the Hull expositor, you'll see that the pixels outside your region of interest (Hull) are made black.","position":{"start":{"line":489,"column":1,"offset":22377},"end":{"line":489,"column":303,"offset":22679},"indent":[]}}],"position":{"start":{"line":489,"column":1,"offset":22377},"end":{"line":489,"column":303,"offset":22679},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":491,"column":7,"offset":22687},"end":{"line":491,"column":16,"offset":22696},"indent":[]}}],"position":{"start":{"line":491,"column":1,"offset":22681},"end":{"line":491,"column":16,"offset":22696},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Disk will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":492,"column":1,"offset":22697},"end":{"line":492,"column":187,"offset":22883},"indent":[]}}],"position":{"start":{"line":492,"column":1,"offset":22697},"end":{"line":492,"column":187,"offset":22883},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Video","position":{"start":{"line":494,"column":5,"offset":22889},"end":{"line":494,"column":10,"offset":22894},"indent":[]}}],"position":{"start":{"line":494,"column":1,"offset":22885},"end":{"line":494,"column":10,"offset":22894},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When a valid event is detected, a video will be recorded for x seconds. When more valid events are detected, while a video is recording, the video file will further record for x seconds; so no new video file be recorded, but the existing one will be expanded.","position":{"start":{"line":495,"column":1,"offset":22895},"end":{"line":495,"column":260,"offset":23154},"indent":[]}}],"position":{"start":{"line":495,"column":1,"offset":22895},"end":{"line":495,"column":260,"offset":23154},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":497,"column":6,"offset":23161},"end":{"line":497,"column":16,"offset":23171},"indent":[]}}],"position":{"start":{"line":497,"column":1,"offset":23156},"end":{"line":497,"column":16,"offset":23171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Video output device can be found in the ","position":{"start":{"line":498,"column":1,"offset":23172},"end":{"line":498,"column":63,"offset":23234},"indent":[]}},{"type":"inlineCode","value":"config/io.xml","position":{"start":{"line":498,"column":63,"offset":23234},"end":{"line":498,"column":78,"offset":23249},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":498,"column":78,"offset":23249},"end":{"line":498,"column":183,"offset":23354},"indent":[]}}],"position":{"start":{"line":498,"column":1,"offset":23172},"end":{"line":498,"column":183,"offset":23354},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n","position":{"start":{"line":500,"column":1,"offset":23356},"end":{"line":518,"column":4,"offset":24146},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"FPS","position":{"start":{"line":520,"column":7,"offset":24154},"end":{"line":520,"column":10,"offset":24157},"indent":[]}}],"position":{"start":{"line":520,"column":1,"offset":24148},"end":{"line":520,"column":10,"offset":24157},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The frames per second of the video being recorded. Please note that this number is limited and depends heavily on your hardware setup. You'll be receiving following warning in the systems logs, if the machinery can't write the desired FPS.","position":{"start":{"line":521,"column":1,"offset":24158},"end":{"line":521,"column":240,"offset":24397},"indent":[]}}],"position":{"start":{"line":521,"column":1,"offset":24158},"end":{"line":521,"column":240,"offset":24397},"indent":[]}},{"type":"code","lang":"text","meta":null,"value":"[trivial] IoVideo: framerate is too fast, can't record video at this speed (8/FPS)","position":{"start":{"line":523,"column":1,"offset":24399},"end":{"line":525,"column":4,"offset":24493},"indent":[1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Record after","position":{"start":{"line":526,"column":7,"offset":24500},"end":{"line":526,"column":19,"offset":24512},"indent":[]}}],"position":{"start":{"line":526,"column":1,"offset":24494},"end":{"line":526,"column":19,"offset":24512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The number of seconds recorded after the last valid event was detected. This means that when a video is already recording, and a valid event was detected, the video will be expanded with x more seconds.","position":{"start":{"line":527,"column":1,"offset":24513},"end":{"line":527,"column":203,"offset":24715},"indent":[]}}],"position":{"start":{"line":527,"column":1,"offset":24513},"end":{"line":527,"column":203,"offset":24715},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Extensions","position":{"start":{"line":529,"column":7,"offset":24723},"end":{"line":529,"column":17,"offset":24733},"indent":[]}}],"position":{"start":{"line":529,"column":1,"offset":24717},"end":{"line":529,"column":17,"offset":24733},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The extension or container of the video file. We highly recommend to use the MP4 container if you want cross-browser support. Leave this setting by default, if you don't know what you're doing.","position":{"start":{"line":530,"column":1,"offset":24734},"end":{"line":530,"column":194,"offset":24927},"indent":[]}}],"position":{"start":{"line":530,"column":1,"offset":24734},"end":{"line":530,"column":194,"offset":24927},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Codec","position":{"start":{"line":532,"column":7,"offset":24935},"end":{"line":532,"column":12,"offset":24940},"indent":[]}}],"position":{"start":{"line":532,"column":1,"offset":24929},"end":{"line":532,"column":12,"offset":24940},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The codec that is used to encode the video file.","position":{"start":{"line":533,"column":1,"offset":24941},"end":{"line":533,"column":49,"offset":24989},"indent":[]}}],"position":{"start":{"line":533,"column":1,"offset":24941},"end":{"line":533,"column":49,"offset":24989},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"File format","position":{"start":{"line":535,"column":7,"offset":24997},"end":{"line":535,"column":18,"offset":25008},"indent":[]}}],"position":{"start":{"line":535,"column":1,"offset":24991},"end":{"line":535,"column":18,"offset":25008},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The format that will be used for the name of the image. One or more variables can be defined and will be replaced by the machinery. Note that when you're using a variables name in the file format, that this name should be defined in the JSON object.","position":{"start":{"line":536,"column":1,"offset":25009},"end":{"line":536,"column":250,"offset":25258},"indent":[]}}],"position":{"start":{"line":536,"column":1,"offset":25009},"end":{"line":536,"column":250,"offset":25258},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Directory","position":{"start":{"line":538,"column":7,"offset":25266},"end":{"line":538,"column":16,"offset":25275},"indent":[]}}],"position":{"start":{"line":538,"column":1,"offset":25260},"end":{"line":538,"column":16,"offset":25275},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The directory where the videos will be saved. By default videos are saved to the /etc/opt/kerberosio/capture directory.","position":{"start":{"line":539,"column":1,"offset":25276},"end":{"line":539,"column":120,"offset":25395},"indent":[]}}],"position":{"start":{"line":539,"column":1,"offset":25276},"end":{"line":539,"column":120,"offset":25395},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Hardware directory","position":{"start":{"line":541,"column":7,"offset":25403},"end":{"line":541,"column":25,"offset":25421},"indent":[]}}],"position":{"start":{"line":541,"column":1,"offset":25397},"end":{"line":541,"column":25,"offset":25421},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When using onboard hardware encoding (e.g. with Raspberry Pi camera), h264 video files are generated and stored in this directory. Afterwards these h264 files will be containerized to mp4 files, and stored in the Directory path.","position":{"start":{"line":542,"column":1,"offset":25422},"end":{"line":542,"column":229,"offset":25650},"indent":[]}}],"position":{"start":{"line":542,"column":1,"offset":25422},"end":{"line":542,"column":229,"offset":25650},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Enable Hardware encoding","position":{"start":{"line":544,"column":7,"offset":25658},"end":{"line":544,"column":31,"offset":25682},"indent":[]}}],"position":{"start":{"line":544,"column":1,"offset":25652},"end":{"line":544,"column":31,"offset":25682},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A boolean which can enable or disable hardware encoding. Please note that this option is enabled by default, but does not mean that it will work if you choose to use an USB camera.","position":{"start":{"line":545,"column":1,"offset":25683},"end":{"line":545,"column":181,"offset":25863},"indent":[]}}],"position":{"start":{"line":545,"column":1,"offset":25683},"end":{"line":545,"column":181,"offset":25863},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Mark with timestamp","position":{"start":{"line":547,"column":7,"offset":25871},"end":{"line":547,"column":26,"offset":25890},"indent":[]}}],"position":{"start":{"line":547,"column":1,"offset":25865},"end":{"line":547,"column":26,"offset":25890},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When this settings is set to true, the video is marked with a timestamp (similar to the Disk device).","position":{"start":{"line":548,"column":1,"offset":25891},"end":{"line":548,"column":102,"offset":25992},"indent":[]}}],"position":{"start":{"line":548,"column":1,"offset":25891},"end":{"line":548,"column":102,"offset":25992},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Timestamp color","position":{"start":{"line":550,"column":7,"offset":26000},"end":{"line":550,"column":22,"offset":26015},"indent":[]}}],"position":{"start":{"line":550,"column":1,"offset":25994},"end":{"line":550,"column":22,"offset":26015},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A color can be defined for timestamp: white, black, red, green and blue.","position":{"start":{"line":551,"column":1,"offset":26016},"end":{"line":551,"column":73,"offset":26088},"indent":[]}}],"position":{"start":{"line":551,"column":1,"offset":26016},"end":{"line":551,"column":73,"offset":26088},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Privacy","position":{"start":{"line":553,"column":7,"offset":26096},"end":{"line":553,"column":14,"offset":26103},"indent":[]}}],"position":{"start":{"line":553,"column":1,"offset":26090},"end":{"line":553,"column":14,"offset":26103},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The privacy mode can be activated to remove some parts from the video. This especially helpful if you want to filter out public areas.","position":{"start":{"line":554,"column":1,"offset":26104},"end":{"line":554,"column":135,"offset":26238},"indent":[]}}],"position":{"start":{"line":554,"column":1,"offset":26104},"end":{"line":554,"column":135,"offset":26238},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Video privacy","position":{"start":{"line":556,"column":7,"offset":26246},"end":{"line":556,"column":20,"offset":26259},"indent":[]}}],"position":{"start":{"line":556,"column":1,"offset":26240},"end":{"line":556,"column":20,"offset":26259},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"After updating the configuration, you'll see that the pixels outside your region of interest (ROI) are made black; the image below illustrates this.","position":{"start":{"line":557,"column":1,"offset":26260},"end":{"line":557,"column":149,"offset":26408},"indent":[]}}],"position":{"start":{"line":557,"column":1,"offset":26260},"end":{"line":557,"column":149,"offset":26408},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":559,"column":7,"offset":26416},"end":{"line":559,"column":16,"offset":26425},"indent":[]}}],"position":{"start":{"line":559,"column":1,"offset":26410},"end":{"line":559,"column":16,"offset":26425},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Video will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":560,"column":1,"offset":26426},"end":{"line":560,"column":188,"offset":26613},"indent":[]}}],"position":{"start":{"line":560,"column":1,"offset":26426},"end":{"line":560,"column":188,"offset":26613},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"TCP/IP client","position":{"start":{"line":562,"column":5,"offset":26619},"end":{"line":562,"column":18,"offset":26632},"indent":[]}}],"position":{"start":{"line":562,"column":1,"offset":26615},"end":{"line":562,"column":18,"offset":26632},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The TCP/IP client will send a TCP packet to a server.","position":{"start":{"line":564,"column":1,"offset":26634},"end":{"line":564,"column":54,"offset":26687},"indent":[]}}],"position":{"start":{"line":564,"column":1,"offset":26634},"end":{"line":564,"column":54,"offset":26687},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":566,"column":6,"offset":26694},"end":{"line":566,"column":16,"offset":26704},"indent":[]}}],"position":{"start":{"line":566,"column":1,"offset":26689},"end":{"line":566,"column":16,"offset":26704},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the TCP/IP client can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":567,"column":1,"offset":26705},"end":{"line":567,"column":175,"offset":26879},"indent":[]}}],"position":{"start":{"line":567,"column":1,"offset":26705},"end":{"line":567,"column":175,"offset":26879},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 127.0.0.1\n 1337\n it's so fluffy\n 0\n \n","position":{"start":{"line":569,"column":1,"offset":26881},"end":{"line":578,"column":4,"offset":27107},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Server","position":{"start":{"line":580,"column":7,"offset":27115},"end":{"line":580,"column":13,"offset":27121},"indent":[]}}],"position":{"start":{"line":580,"column":1,"offset":27109},"end":{"line":580,"column":13,"offset":27121},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The IP of the TCP server.","position":{"start":{"line":581,"column":1,"offset":27122},"end":{"line":581,"column":26,"offset":27147},"indent":[]}}],"position":{"start":{"line":581,"column":1,"offset":27122},"end":{"line":581,"column":26,"offset":27147},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Port","position":{"start":{"line":583,"column":7,"offset":27155},"end":{"line":583,"column":11,"offset":27159},"indent":[]}}],"position":{"start":{"line":583,"column":1,"offset":27149},"end":{"line":583,"column":11,"offset":27159},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This is the port of the TCP server.","position":{"start":{"line":584,"column":1,"offset":27160},"end":{"line":584,"column":36,"offset":27195},"indent":[]}}],"position":{"start":{"line":584,"column":1,"offset":27160},"end":{"line":584,"column":36,"offset":27195},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Message","position":{"start":{"line":586,"column":7,"offset":27203},"end":{"line":586,"column":14,"offset":27210},"indent":[]}}],"position":{"start":{"line":586,"column":1,"offset":27197},"end":{"line":586,"column":14,"offset":27210},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can send some data to a TCP server.","position":{"start":{"line":587,"column":1,"offset":27211},"end":{"line":587,"column":40,"offset":27250},"indent":[]}}],"position":{"start":{"line":587,"column":1,"offset":27211},"end":{"line":587,"column":40,"offset":27250},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":589,"column":7,"offset":27258},"end":{"line":589,"column":16,"offset":27267},"indent":[]}}],"position":{"start":{"line":589,"column":1,"offset":27252},"end":{"line":589,"column":16,"offset":27267},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the TCP will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":590,"column":1,"offset":27268},"end":{"line":590,"column":186,"offset":27453},"indent":[]}}],"position":{"start":{"line":590,"column":1,"offset":27268},"end":{"line":590,"column":186,"offset":27453},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"GPIO","position":{"start":{"line":592,"column":5,"offset":27459},"end":{"line":592,"column":9,"offset":27463},"indent":[]}}],"position":{"start":{"line":592,"column":1,"offset":27455},"end":{"line":592,"column":9,"offset":27463},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A GPIO pin can be set as output device.","position":{"start":{"line":593,"column":1,"offset":27464},"end":{"line":593,"column":40,"offset":27503},"indent":[]}}],"position":{"start":{"line":593,"column":1,"offset":27464},"end":{"line":593,"column":40,"offset":27503},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":595,"column":6,"offset":27510},"end":{"line":595,"column":16,"offset":27520},"indent":[]}}],"position":{"start":{"line":595,"column":1,"offset":27505},"end":{"line":595,"column":16,"offset":27520},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the GPIO pin can be found in the ","position":{"start":{"line":596,"column":1,"offset":27521},"end":{"line":596,"column":52,"offset":27572},"indent":[]}},{"type":"inlineCode","value":"config/io.xml","position":{"start":{"line":596,"column":52,"offset":27572},"end":{"line":596,"column":67,"offset":27587},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":596,"column":67,"offset":27587},"end":{"line":596,"column":172,"offset":27692},"indent":[]}}],"position":{"start":{"line":596,"column":1,"offset":27521},"end":{"line":596,"column":172,"offset":27692},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n 17\n 5\n 100000\n 0\n \n","position":{"start":{"line":598,"column":1,"offset":27694},"end":{"line":607,"column":4,"offset":27900},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Pin","position":{"start":{"line":609,"column":7,"offset":27908},"end":{"line":609,"column":10,"offset":27911},"indent":[]}}],"position":{"start":{"line":609,"column":1,"offset":27902},"end":{"line":609,"column":10,"offset":27911},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The pin that will be triggered.","position":{"start":{"line":610,"column":1,"offset":27912},"end":{"line":610,"column":32,"offset":27943},"indent":[]}}],"position":{"start":{"line":610,"column":1,"offset":27912},"end":{"line":610,"column":32,"offset":27943},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Periods","position":{"start":{"line":612,"column":7,"offset":27951},"end":{"line":612,"column":14,"offset":27958},"indent":[]}}],"position":{"start":{"line":612,"column":1,"offset":27945},"end":{"line":612,"column":14,"offset":27958},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The number of times the pin will be triggered.","position":{"start":{"line":613,"column":1,"offset":27959},"end":{"line":613,"column":47,"offset":28005},"indent":[]}}],"position":{"start":{"line":613,"column":1,"offset":27959},"end":{"line":613,"column":47,"offset":28005},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Period time","position":{"start":{"line":615,"column":7,"offset":28013},"end":{"line":615,"column":18,"offset":28024},"indent":[]}}],"position":{"start":{"line":615,"column":1,"offset":28007},"end":{"line":615,"column":18,"offset":28024},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The time in microseconds that the pin will be set high.","position":{"start":{"line":616,"column":1,"offset":28025},"end":{"line":616,"column":56,"offset":28080},"indent":[]}}],"position":{"start":{"line":616,"column":1,"offset":28025},"end":{"line":616,"column":56,"offset":28080},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":618,"column":7,"offset":28088},"end":{"line":618,"column":16,"offset":28097},"indent":[]}}],"position":{"start":{"line":618,"column":1,"offset":28082},"end":{"line":618,"column":16,"offset":28097},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the GPIO will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":619,"column":1,"offset":28098},"end":{"line":619,"column":187,"offset":28284},"indent":[]}}],"position":{"start":{"line":619,"column":1,"offset":28098},"end":{"line":619,"column":187,"offset":28284},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Webhook","position":{"start":{"line":621,"column":6,"offset":28291},"end":{"line":621,"column":13,"offset":28298},"indent":[]}}],"position":{"start":{"line":621,"column":1,"offset":28286},"end":{"line":621,"column":13,"offset":28298},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Detailed information (a JSON object) is send as a POST request to a webhook. The JSON object contains the number of changes, the region, the URL of the image, etc. This is useful if you want to integrate with your own application.","position":{"start":{"line":622,"column":1,"offset":28299},"end":{"line":622,"column":231,"offset":28529},"indent":[]}}],"position":{"start":{"line":622,"column":1,"offset":28299},"end":{"line":622,"column":231,"offset":28529},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Make sure that the Webhook comes after the Disk device, otherwise the URL of the image is not included.","position":{"start":{"line":624,"column":1,"offset":28531},"end":{"line":624,"column":104,"offset":28634},"indent":[]}}],"position":{"start":{"line":624,"column":1,"offset":28531},"end":{"line":624,"column":104,"offset":28634},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":626,"column":6,"offset":28641},"end":{"line":626,"column":16,"offset":28651},"indent":[]}}],"position":{"start":{"line":626,"column":1,"offset":28636},"end":{"line":626,"column":16,"offset":28651},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the webhook can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":627,"column":1,"offset":28652},"end":{"line":627,"column":169,"offset":28820},"indent":[]}}],"position":{"start":{"line":627,"column":1,"offset":28652},"end":{"line":627,"column":169,"offset":28820},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n http://kerberos.web/api/v1/webhook\n 0\n \n","position":{"start":{"line":629,"column":1,"offset":28822},"end":{"line":636,"column":4,"offset":28975},"indent":[1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Url","position":{"start":{"line":638,"column":7,"offset":28983},"end":{"line":638,"column":10,"offset":28986},"indent":[]}}],"position":{"start":{"line":638,"column":1,"offset":28977},"end":{"line":638,"column":10,"offset":28986},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This is the URL, to which the machinery will send a JSON object (as a POST request).","position":{"start":{"line":639,"column":1,"offset":28987},"end":{"line":639,"column":85,"offset":29071},"indent":[]}}],"position":{"start":{"line":639,"column":1,"offset":28987},"end":{"line":639,"column":85,"offset":29071},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":641,"column":7,"offset":29079},"end":{"line":641,"column":16,"offset":29088},"indent":[]}}],"position":{"start":{"line":641,"column":1,"offset":29073},"end":{"line":641,"column":16,"offset":29088},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Webhook will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":642,"column":1,"offset":29089},"end":{"line":642,"column":190,"offset":29278},"indent":[]}}],"position":{"start":{"line":642,"column":1,"offset":29089},"end":{"line":642,"column":190,"offset":29278},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Output","position":{"start":{"line":644,"column":7,"offset":29286},"end":{"line":644,"column":13,"offset":29292},"indent":[]}}],"position":{"start":{"line":644,"column":1,"offset":29280},"end":{"line":644,"column":13,"offset":29292},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A JSON object is POSTed to the url you've defined.","position":{"start":{"line":645,"column":1,"offset":29293},"end":{"line":645,"column":51,"offset":29343},"indent":[]}}],"position":{"start":{"line":645,"column":1,"offset":29293},"end":{"line":645,"column":51,"offset":29343},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"[\n 'regionCoordinates' : [618, 317, 703, 493],\n 'numberOfChanges' : 5446,\n 'timestamp' : '1465894497',\n 'microseconds' : '5-97451',\n 'token' : 695,\n 'pathToImage' : '1465894497_5-97451_frontdoor_618-317-703-493_5446_695.jpg',\n 'instanceName' : 'frontdoor',\n]","position":{"start":{"line":647,"column":1,"offset":29345},"end":{"line":657,"column":4,"offset":29622},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Script","position":{"start":{"line":659,"column":5,"offset":29628},"end":{"line":659,"column":11,"offset":29634},"indent":[]}}],"position":{"start":{"line":659,"column":1,"offset":29624},"end":{"line":659,"column":11,"offset":29634},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A bash script can be executed after a valid event was detected. A JSON object is send in the first parameter to the script you've defined.","position":{"start":{"line":660,"column":1,"offset":29635},"end":{"line":660,"column":139,"offset":29773},"indent":[]}}],"position":{"start":{"line":660,"column":1,"offset":29635},"end":{"line":660,"column":139,"offset":29773},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":662,"column":6,"offset":29780},"end":{"line":662,"column":16,"offset":29790},"indent":[]}}],"position":{"start":{"line":662,"column":1,"offset":29775},"end":{"line":662,"column":16,"offset":29790},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the Script output device can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":663,"column":1,"offset":29791},"end":{"line":663,"column":182,"offset":29972},"indent":[]}}],"position":{"start":{"line":663,"column":1,"offset":29791},"end":{"line":663,"column":182,"offset":29972},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n \n","position":{"start":{"line":665,"column":1,"offset":29974},"end":{"line":672,"column":4,"offset":30127},"indent":[1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Path","position":{"start":{"line":674,"column":7,"offset":30135},"end":{"line":674,"column":11,"offset":30139},"indent":[]}}],"position":{"start":{"line":674,"column":1,"offset":30129},"end":{"line":674,"column":11,"offset":30139},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The location of the script that will be executed on detection.","position":{"start":{"line":675,"column":1,"offset":30140},"end":{"line":675,"column":63,"offset":30202},"indent":[]}}],"position":{"start":{"line":675,"column":1,"offset":30140},"end":{"line":675,"column":63,"offset":30202},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":677,"column":7,"offset":30210},"end":{"line":677,"column":16,"offset":30219},"indent":[]}}],"position":{"start":{"line":677,"column":1,"offset":30204},"end":{"line":677,"column":16,"offset":30219},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Script will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":678,"column":1,"offset":30220},"end":{"line":678,"column":189,"offset":30408},"indent":[]}}],"position":{"start":{"line":678,"column":1,"offset":30220},"end":{"line":678,"column":189,"offset":30408},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Example","position":{"start":{"line":680,"column":7,"offset":30416},"end":{"line":680,"column":14,"offset":30423},"indent":[]}}],"position":{"start":{"line":680,"column":1,"offset":30410},"end":{"line":680,"column":14,"offset":30423},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By default the script will point to /etc/opt/kerberosio/scripts/run.sh, which contains a template how you should start your script. Note that when using KiOS, this script will be read-only, copy it to the /data folder and change the path parameter.","position":{"start":{"line":681,"column":1,"offset":30424},"end":{"line":681,"column":249,"offset":30672},"indent":[]}}],"position":{"start":{"line":681,"column":1,"offset":30424},"end":{"line":681,"column":249,"offset":30672},"indent":[]}},{"type":"code","lang":"python","meta":null,"value":"#!/bin/bash\n# -------------------------------------------\n# This is an example script which illustrates\n# how to use the Script IO device.\n#\n# --------------------------------------\n# The first parameter is the JSON object\n#\n# e.g. {\"regionCoordinates\":[308,250,346,329],\"numberOfChanges\":194,\"timestamp\":\"1486049622\",\"microseconds\":\"6-161868\",\"token\":344,\"pathToImage\":\"1486049622_6-161868_frontdoor_308-250-346-329_194_344.jpg\",\"instanceName\":\"frontdoor\"}\nJSON=$1\n# -------------------------------------------\n# You can use python to parse the JSON object\n# and get the required fields\nname=$(echo $JSON | python -c \"import sys, json; print json.load(sys.stdin)['instanceName']\")\ncoordinates=$(echo $JSON | python -c \"import sys, json; print json.load(sys.stdin)['regionCoordinates']\")\nchanges=$(echo $JSON | pythfon -c \"import sys, json; print json.load(sys.stdin)['numberOfChanges']\")\nimage=$(echo $JSON | python -c \"import sys, json; print json.load(sys.stdin)['pathToImage']\")\nThe idea is that you can use Python in your bash script, to parse the JSON object send as first parameter. Afterwards you can do with the output what you want.","position":{"start":{"line":683,"column":1,"offset":30674},"end":{"line":702,"column":4,"offset":31830},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"MQTT","position":{"start":{"line":704,"column":5,"offset":31836},"end":{"line":704,"column":9,"offset":31840},"indent":[]}}],"position":{"start":{"line":704,"column":1,"offset":31832},"end":{"line":704,"column":9,"offset":31840},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"MQTT protocol is a light-weight Machine to Machine (M2M) protocol widely used in Internet of things.\nDetailed information (a JSON object) is published to an MQTT topic. The JSON object contains the number of changes, the region, the URL of the image, etc.","position":{"start":{"line":705,"column":1,"offset":31841},"end":{"line":706,"column":155,"offset":32096},"indent":[1]}}],"position":{"start":{"line":705,"column":1,"offset":31841},"end":{"line":706,"column":155,"offset":32096},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":708,"column":6,"offset":32103},"end":{"line":708,"column":16,"offset":32113},"indent":[]}}],"position":{"start":{"line":708,"column":1,"offset":32098},"end":{"line":708,"column":16,"offset":32113},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters of the MQTT output can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.","position":{"start":{"line":709,"column":1,"offset":32114},"end":{"line":709,"column":173,"offset":32286},"indent":[]}}],"position":{"start":{"line":709,"column":1,"offset":32114},"end":{"line":709,"column":173,"offset":32286},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n false\n false\n 127.0.0.1\n 1883\n kios/mqtt\n \n \n 0\n \n","position":{"start":{"line":711,"column":1,"offset":32288},"end":{"line":724,"column":4,"offset":32652},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Secure","position":{"start":{"line":726,"column":7,"offset":32660},"end":{"line":726,"column":13,"offset":32666},"indent":[]}}],"position":{"start":{"line":726,"column":1,"offset":32654},"end":{"line":726,"column":13,"offset":32666},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If checked, enable SSL/TLS support. Please note that when SSL/TLS support is enabled, the server certificate issuer is verified against the CA (Certification Authority) files available in /etc/ssl/certs.","position":{"start":{"line":727,"column":1,"offset":32667},"end":{"line":727,"column":204,"offset":32870},"indent":[]}}],"position":{"start":{"line":727,"column":1,"offset":32667},"end":{"line":727,"column":204,"offset":32870},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Verifycn","position":{"start":{"line":729,"column":7,"offset":32878},"end":{"line":729,"column":15,"offset":32886},"indent":[]}}],"position":{"start":{"line":729,"column":1,"offset":32872},"end":{"line":729,"column":15,"offset":32886},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If checked, the MQTT server FQDN or ip address must match the CN (Common Name) of the server certificate.","position":{"start":{"line":730,"column":1,"offset":32887},"end":{"line":730,"column":106,"offset":32992},"indent":[]}}],"position":{"start":{"line":730,"column":1,"offset":32887},"end":{"line":730,"column":106,"offset":32992},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Server","position":{"start":{"line":732,"column":7,"offset":33000},"end":{"line":732,"column":13,"offset":33006},"indent":[]}}],"position":{"start":{"line":732,"column":1,"offset":32994},"end":{"line":732,"column":13,"offset":33006},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"IP address or FQDN of the MQTT broker.","position":{"start":{"line":733,"column":1,"offset":33007},"end":{"line":733,"column":39,"offset":33045},"indent":[]}}],"position":{"start":{"line":733,"column":1,"offset":33007},"end":{"line":733,"column":39,"offset":33045},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Port","position":{"start":{"line":735,"column":7,"offset":33053},"end":{"line":735,"column":11,"offset":33057},"indent":[]}}],"position":{"start":{"line":735,"column":1,"offset":33047},"end":{"line":735,"column":11,"offset":33057},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"TCP port of the MQTT broker.","position":{"start":{"line":736,"column":1,"offset":33058},"end":{"line":736,"column":29,"offset":33086},"indent":[]}}],"position":{"start":{"line":736,"column":1,"offset":33058},"end":{"line":736,"column":29,"offset":33086},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Topic","position":{"start":{"line":738,"column":7,"offset":33094},"end":{"line":738,"column":12,"offset":33099},"indent":[]}}],"position":{"start":{"line":738,"column":1,"offset":33088},"end":{"line":738,"column":12,"offset":33099},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The topic to publish to.","position":{"start":{"line":739,"column":1,"offset":33100},"end":{"line":739,"column":25,"offset":33124},"indent":[]}}],"position":{"start":{"line":739,"column":1,"offset":33100},"end":{"line":739,"column":25,"offset":33124},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Username","position":{"start":{"line":741,"column":7,"offset":33132},"end":{"line":741,"column":15,"offset":33140},"indent":[]}}],"position":{"start":{"line":741,"column":1,"offset":33126},"end":{"line":741,"column":15,"offset":33140},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The username for authenticating to the MQTT broker. This is only supported by brokers that implement the MQTT spec v3.1. If username is not set (empty), the password argument is ignored. This is only needed if the MQTT broker is configured for authentication.","position":{"start":{"line":742,"column":1,"offset":33141},"end":{"line":742,"column":260,"offset":33400},"indent":[]}}],"position":{"start":{"line":742,"column":1,"offset":33141},"end":{"line":742,"column":260,"offset":33400},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Password","position":{"start":{"line":744,"column":7,"offset":33408},"end":{"line":744,"column":15,"offset":33416},"indent":[]}}],"position":{"start":{"line":744,"column":1,"offset":33402},"end":{"line":744,"column":15,"offset":33416},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The password to use, together with the username, for authenticating to the MQTT broker. This is only supported by brokers that implement the MQTT spec v3.1. This is only needed if the MQTT broker is configured for authentication.","position":{"start":{"line":745,"column":1,"offset":33417},"end":{"line":745,"column":230,"offset":33646},"indent":[]}}],"position":{"start":{"line":745,"column":1,"offset":33417},"end":{"line":745,"column":230,"offset":33646},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Throttler","position":{"start":{"line":747,"column":7,"offset":33654},"end":{"line":747,"column":16,"offset":33663},"indent":[]}}],"position":{"start":{"line":747,"column":1,"offset":33648},"end":{"line":747,"column":16,"offset":33663},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the MQTT will only be triggered once in 5 seconds, nevertheless more detections occurred.","position":{"start":{"line":748,"column":1,"offset":33664},"end":{"line":748,"column":187,"offset":33850},"indent":[]}}],"position":{"start":{"line":748,"column":1,"offset":33664},"end":{"line":748,"column":187,"offset":33850},"indent":[]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Output","position":{"start":{"line":750,"column":7,"offset":33858},"end":{"line":750,"column":13,"offset":33864},"indent":[]}}],"position":{"start":{"line":750,"column":1,"offset":33852},"end":{"line":750,"column":13,"offset":33864},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A JSON object is published to the topic of the MQTT broker you have configured.","position":{"start":{"line":751,"column":1,"offset":33865},"end":{"line":751,"column":80,"offset":33944},"indent":[]}}],"position":{"start":{"line":751,"column":1,"offset":33865},"end":{"line":751,"column":80,"offset":33944},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"[\n 'regionCoordinates' : [618, 317, 703, 493],\n 'numberOfChanges' : 5446,\n 'timestamp' : '1465894497',\n 'microseconds' : '5-97451',\n 'token' : 695,\n 'pathToImage' : '1465894497_5-97451_frontdoor_618-317-703-493_5446_695.jpg',\n 'instanceName' : 'frontdoor',\n]","position":{"start":{"line":753,"column":1,"offset":33946},"end":{"line":763,"column":4,"offset":34223},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":5,"children":[{"type":"text","value":"Example","position":{"start":{"line":765,"column":7,"offset":34231},"end":{"line":765,"column":14,"offset":34238},"indent":[]}}],"position":{"start":{"line":765,"column":1,"offset":34225},"end":{"line":765,"column":14,"offset":34238},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It is possible to subscribe multiple distributed IoT devices to the same MQTT topic and perform specific actions upon the detection of a motion. Devices with more resources could fetch the image to perform further elaboration.","position":{"start":{"line":766,"column":1,"offset":34239},"end":{"line":766,"column":227,"offset":34465},"indent":[]}}],"position":{"start":{"line":766,"column":1,"offset":34239},"end":{"line":766,"column":227,"offset":34465},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Streaming","position":{"start":{"line":768,"column":4,"offset":34470},"end":{"line":768,"column":13,"offset":34479},"indent":[]}}],"position":{"start":{"line":768,"column":1,"offset":34467},"end":{"line":768,"column":13,"offset":34479},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The machinery has the ability to stream your capture device as a MJPG stream.","position":{"start":{"line":770,"column":1,"offset":34481},"end":{"line":770,"column":78,"offset":34558},"indent":[]}}],"position":{"start":{"line":770,"column":1,"offset":34481},"end":{"line":770,"column":78,"offset":34558},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Parameters","position":{"start":{"line":772,"column":5,"offset":34564},"end":{"line":772,"column":15,"offset":34574},"indent":[]}}],"position":{"start":{"line":772,"column":1,"offset":34560},"end":{"line":772,"column":15,"offset":34574},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The parameters for the supported streaming protocols can be found in the ","position":{"start":{"line":774,"column":1,"offset":34576},"end":{"line":774,"column":74,"offset":34649},"indent":[]}},{"type":"inlineCode","value":"config/stream.xml","position":{"start":{"line":774,"column":74,"offset":34649},"end":{"line":774,"column":93,"offset":34668},"indent":[]}},{"type":"text","value":" file, but you can also use the web to modify the parameters. Below you see a default configuration file; at the moment of writing only a MJPG stream is supported.","position":{"start":{"line":774,"column":93,"offset":34668},"end":{"line":774,"column":256,"offset":34831},"indent":[]}}],"position":{"start":{"line":774,"column":1,"offset":34576},"end":{"line":774,"column":256,"offset":34831},"indent":[]}},{"type":"code","lang":"xml","meta":null,"value":"\n\t\n \ttrue\n \t8889\n \t75\n \t\n \t75\n \n","position":{"start":{"line":776,"column":1,"offset":34833},"end":{"line":786,"column":4,"offset":35099},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Enabled","position":{"start":{"line":788,"column":6,"offset":35106},"end":{"line":788,"column":13,"offset":35113},"indent":[]}}],"position":{"start":{"line":788,"column":1,"offset":35101},"end":{"line":788,"column":13,"offset":35113},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A boolean which turns ON/OFF the stream. This is interesting when working with IP cameras, where you already have an RTSP/MJPG stream from the camera itself.","position":{"start":{"line":790,"column":1,"offset":35115},"end":{"line":790,"column":158,"offset":35272},"indent":[]}}],"position":{"start":{"line":790,"column":1,"offset":35115},"end":{"line":790,"column":158,"offset":35272},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Stream Port","position":{"start":{"line":792,"column":6,"offset":35279},"end":{"line":792,"column":17,"offset":35290},"indent":[]}}],"position":{"start":{"line":792,"column":1,"offset":35274},"end":{"line":792,"column":17,"offset":35290},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The port on which the stream is available.","position":{"start":{"line":794,"column":1,"offset":35292},"end":{"line":794,"column":43,"offset":35334},"indent":[]}}],"position":{"start":{"line":794,"column":1,"offset":35292},"end":{"line":794,"column":43,"offset":35334},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Quality","position":{"start":{"line":796,"column":6,"offset":35341},"end":{"line":796,"column":13,"offset":35348},"indent":[]}}],"position":{"start":{"line":796,"column":1,"offset":35336},"end":{"line":796,"column":13,"offset":35348},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The quality is a value between ","position":{"start":{"line":798,"column":1,"offset":35350},"end":{"line":798,"column":32,"offset":35381},"indent":[]}},{"type":"linkReference","identifier":"0-100","label":"0-100","referenceType":"shortcut","children":[{"type":"text","value":"0-100","position":{"start":{"line":798,"column":33,"offset":35382},"end":{"line":798,"column":38,"offset":35387},"indent":[]}}],"position":{"start":{"line":798,"column":32,"offset":35381},"end":{"line":798,"column":39,"offset":35388},"indent":[]}},{"type":"text","value":". The lower the quality, the more the image will be compressed. If you're using the RaspberryPi Camera module, this option will be ignored.","position":{"start":{"line":798,"column":39,"offset":35388},"end":{"line":798,"column":178,"offset":35527},"indent":[]}}],"position":{"start":{"line":798,"column":1,"offset":35350},"end":{"line":798,"column":178,"offset":35527},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Username/password","position":{"start":{"line":800,"column":6,"offset":35534},"end":{"line":800,"column":23,"offset":35551},"indent":[]}}],"position":{"start":{"line":800,"column":1,"offset":35529},"end":{"line":800,"column":23,"offset":35551},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can secure the MJPEG streaming with a username and password. These credentials will be used to authorize your requests using Basic Authentication. Please note that once enabled, the live stream on the dashboard page can fail; however it will work if you open it directly in your browser or ip camera client. The format of the streaming url, after authentication enabled, will look as following:","position":{"start":{"line":802,"column":1,"offset":35553},"end":{"line":802,"column":399,"offset":35951},"indent":[]}}],"position":{"start":{"line":802,"column":1,"offset":35553},"end":{"line":802,"column":399,"offset":35951},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"http://username:password@ip-camera:8899","position":{"start":{"line":804,"column":1,"offset":35953},"end":{"line":806,"column":4,"offset":36002},"indent":[1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":809,"column":1,"offset":36005},"end":{"line":809,"column":31,"offset":36035},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":809,"column":31,"offset":36035}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport { Playground, Props } from 'docz'\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Machinery`}

\n

{`The machinery is the processing engine of Kerberos Open Source. It's an image processing framework, written in C++, who benefits from other third party libraries (OpenCV, etc). It takes images from the type of camera (USB-, IP- or RPi-camera) you've configured in the configuration files and executes one ore more algorithms and post-processes (e.g. save a snapshot). The configuration files allow you to define the type of camera, post-processes, conditions and much more; it's highly configurable. It's important to note that the machinery, out-of-the-box, can handle only one camera at a time.`}

\n

{`Project structure`}

\n

{`The machinery is an image processing framework which is devided into four steps:`}

\n
    \n
  • {`condition`}
  • \n
  • {`algorithm`}
  • \n
  • {`expositor`}
  • \n
  • {`heuristic`}
  • \n
\n

{`The steps belong to a four passway; illustrated on the image below. In each cycle a sequence of images is processed. Each step will process the sequence, and will return some result to the next step. For example: an algorithm will process the images and returns an array to the Expositor, which contains boolean values. The steps are loosly coupled, so they have simple conventions, just like the example before.`}

\n

{`Thanks to the loosly coupling, each step can be developed indepently. So algorithms, expositors, heuristics and conditions can be switched on the fly. This makes it easier for other developers who want to contribute to the machinery. They can create a new algorithm without knowing how a specific expositor or heuristic works. They just need to be aware of the convention an algorithm should meet.`}

\n

\"machinery

\n

{`These different steps can be configured by editing a couple of configurationn files located at `}{`config/`}{`. The main configuration file `}{`config/config.xml`}{` looks like this:`}

\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    `}{`<`}{`name`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`frontdoor`}{`{`name`}{`>`}{`\n`}{`    `}{`<`}{`logging`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`logging`}{`>`}{`\n`}{`    `}{`<`}{`timezone`}{` `}{`type`}{`=`}{`\"timezone\"`}{`>`}{`Europe-Brussels`}{`{`timezone`}{`>`}{`\n`}{`    `}{`<`}{`capture`}{` `}{`file`}{`=`}{`\"capture.xml\"`}{`>`}{`RaspiCamera`}{`{`capture`}{`>`}{`\n`}{`    `}{`<`}{`stream`}{` `}{`file`}{`=`}{`\"stream.xml\"`}{`>`}{`Mjpg`}{`{`stream`}{`>`}{`\n`}{`    `}{`<`}{`condition`}{` `}{`file`}{`=`}{`\"condition.xml\"`}{` `}{`type`}{`=`}{`\"multiple\"`}{`>`}{`Enabled`}{`{`condition`}{`>`}{`\n`}{`    `}{`<`}{`algorithm`}{` `}{`file`}{`=`}{`\"algorithm.xml\"`}{`>`}{`DifferentialCollins`}{`{`algorithm`}{`>`}{`\n`}{`    `}{`<`}{`expositor`}{` `}{`file`}{`=`}{`\"expositor.xml\"`}{`>`}{`Hull`}{`{`expositor`}{`>`}{`\n`}{`    `}{`<`}{`heuristic`}{` `}{`file`}{`=`}{`\"heuristic.xml\"`}{`>`}{`Sequence`}{`{`heuristic`}{`>`}{`\n`}{`    `}{`<`}{`io`}{` `}{`file`}{`=`}{`\"io.xml\"`}{` `}{`type`}{`=`}{`\"multiple\"`}{`>`}{`Video`}{`{`io`}{`>`}{`\n`}{`    `}{`<`}{`cloud`}{` `}{`file`}{`=`}{`\"cloud.xml\"`}{`>`}{`S3`}{`{`cloud`}{`>`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`Capture`}

\n

{`You can choose which capture device you will be using, you can use your old USB webcam, the popular Raspberry Pi camera or a state-of-the-art IP camera. The capture device will take pictures and deliver them to the algorithm if the conditions (the first step of the four passway) are valid.`}

\n

{`You can change the capture device by changing the `}{`config/config.xml`}{` file, and choose one of the following:`}

\n
    \n
  • {`USBCamera`}
  • \n
  • {`RaspiCamera`}
  • \n
  • {`IPCamera`}
  • \n
\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`capture`}{` `}{`file`}{`=`}{`\"capture.xml\"`}{`>`}{`RaspiCamera`}{`{`capture`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`USB camera`}

\n

{`The machinery supports a whole range of USB cameras. You will find a complete list here. Make sure you have updated the web interface, to make the machinery aware you will be using an USB camera.`}

\n

{`Parameters`}

\n

{`The parameters of the USB camera can be found in the `}{`config/capture.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`captures`}{`>`}{`\n`}{`  `}{`<`}{`USBCamera`}{`>`}{`\n`}{`    `}{`<`}{`frameWidth`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1280`}{`{`frameWidth`}{`>`}{`\n`}{`    `}{`<`}{`frameHeight`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`720`}{`{`frameHeight`}{`>`}{`\n`}{`    `}{`<`}{`deviceNumber`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`deviceNumber`}{`>`}{`\n`}{`    `}{`<`}{`delay`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`delay`}{`>`}{`\n`}{`    `}{`<`}{`angle`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`angle`}{`>`}{`\n`}{`  `}{`{`USBCamera`}{`>`}{`\n`}{`{`captures`}{`>`}
\n
{`Framewidth and -height`}
\n

{`You can set the resolution of the capture device, make sure the resolution you've defined is valid with your camera. Please check the specs of the USB camera you're using.`}

\n
{`Device number`}
\n

{`If more than one device is connected, you can specify the index of the USB-camera. The index is an integer (1-5).`}

\n
{`Delay`}
\n

{`You can provide a delay/interval (milliseconds) between two captures.`}

\n
{`Angle`}
\n

{`By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.`}

\n

{`Raspberry Pi Camera Module`}

\n

{`You can use the Raspberry Pi Camera Module with the machinery. You just need to attach the camera module and you're ready to go. The Raspberry Pi Camera Module is enabled by default in the web.`}

\n

{`Parameters`}

\n

{`The parameters of the Raspberry Pi Camera Module can be found in the config/capture.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`captures`}{`>`}{`\n`}{`  `}{`<`}{`RaspiCamera`}{`>`}{`\n`}{`    `}{`<`}{`frameWidth`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`640`}{`{`frameWidth`}{`>`}{`\n`}{`    `}{`<`}{`frameHeight`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`480`}{`{`frameHeight`}{`>`}{`\n`}{`    `}{`<`}{`delay`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1400`}{`{`delay`}{`>`}{`\n`}{`    `}{`<`}{`angle`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`angle`}{`>`}{`\n`}{`    `}{`<`}{`framerate`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`30`}{`{`framerate`}{`>`}{`\n`}{`    `}{`<`}{`sharpness`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`sharpness`}{`>`}{`\n`}{`    `}{`<`}{`saturation`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`saturation`}{`>`}{`\n`}{`    `}{`<`}{`contrast`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`contrast`}{`>`}{`\n`}{`    `}{`<`}{`brightness`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`50`}{`{`brightness`}{`>`}{`\n`}{`  `}{`{`RaspiCamera`}{`>`}{`\n`}{`{`captures`}{`>`}
\n
{`Framewidth and -height`}
\n

{`You can set the resolution of the camera module, make sure the resolution you've defined is valid.`}

\n
{`Delay`}
\n

{`You can provide a delay/interval (milliseconds) between two captures.`}

\n
{`Angle`}
\n

{`By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.`}

\n
{`Framerate`}
\n

{`The number of frames captures per second. Please note that this parameter will also be used if you're recording video. E.g. if you set this parameter to 20, you're recorded videos will also be 20 FPS.`}

\n
{`Sharpness, saturation, contrast, brightness`}
\n

{`Camera properties which you can specify to tune the settings to your needs.`}

\n

{`IP camera`}

\n

{`The machinery can be used with any IP camera, that provides a RTSP (or MJPEG) stream. Make sure that you know the correct URL of your IP camera, you can `}{`find a list here`}{`.`}

\n

{`Parameters`}

\n

{`The parameters of the IP capture device can be found in the `}{`config/capture.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`captures`}{`>`}{`\n`}{`  `}{`<`}{`IPCamera`}{`>`}{`\n`}{`    `}{`<`}{`url`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`http://username:password@ipaddress/image.jpg`}{`{`url`}{`>`}{`\n`}{`    `}{`<`}{`frameWidth`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`800`}{`{`frameWidth`}{`>`}{`\n`}{`    `}{`<`}{`frameHeight`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`640`}{`{`frameHeight`}{`>`}{`\n`}{`    `}{`<`}{`delay`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`delay`}{`>`}{`\n`}{`    `}{`<`}{`angle`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`angle`}{`>`}{`\n`}{`  `}{`{`IPCamera`}{`>`}{`\n`}{`{`captures`}{`>`}
\n
{`URL`}
\n

{`To use your IP camera, you should provide a valid RTSP (or MJPEG) URL. The machinery will take snapshots from this stream.`}

\n
{`Framewidth and -height`}
\n

{`You can set the resolution of the capture device, make sure the resolution you've defined is equal to the resolution you've defined in your IP-camera software.`}

\n
{`Delay`}
\n

{`You can provide a delay/interval (milliseconds) between two captures.`}

\n
{`Angle`}
\n

{`By defining an angle (degrees), you can rotate the images taken by the capture device. For example if you would mount the camera upside down, than you could enter the value 180 as the angle; this will flip the images.`}

\n

{`Condition`}

\n

{`The condition is the first step of the four passway. In this step the machinery will determine if it's allowed to proceed to the next step. For example a condition can be a time constraint, a brightness threshold, etc; multiple conditions can be selected.`}

\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`condition`}{` `}{`file`}{`=`}{`\"condition.xml\"`}{` `}{`type`}{`=`}{`\"multiple\"`}{`>`}{`Enabled`}{`{`condition`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`Enabled`}

\n

{`It can be helpful to enable or disable the machinery at specific times. Therefore the time condition makes it possible to select a time range for each day of the week. When the current time is within the time range, the machinery will be enabled.`}

\n

{`Parameters`}

\n

{`The parameters of the Enabled condition can be found in the `}{`config/condition.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`conditions`}{`>`}{`\n`}{`  `}{`<`}{`Enabled`}{`>`}{`\n`}{`    `}{`<`}{`active`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`true`}{`{`active`}{`>`}{`\n`}{`    `}{`<`}{`delay`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`5000`}{`{`delay`}{`>`}{`\n`}{`  `}{`{`Enabled`}{`>`}{`\n`}{`{`conditions`}{`>`}
\n
{`Active`}
\n

{`The active field is boolean value (true/false). When the active field is true, the machinery is enabled, if not it's disabled.`}

\n
{`Delay`}
\n

{`The delay value is used when the condition failed, so when the current time isn't in the selected time range for that day. In that case the machinery will idle for the specified delay time. The value of the delay is expressed in miliseconds.`}

\n

{`Time`}

\n

{`It can be helpful to enable or disable the machinery at specific times. Therefore the time condition makes it possible to select a time range for each day of the week. When the current time is within the time range, the machinery will be enabled.`}

\n

{`Parameters`}

\n

{`The parameters of the Time condition can be found in the `}{`config/condition.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`conditions`}{`>`}{`\n`}{`  `}{`<`}{`Time`}{`>`}{`\n`}{`    `}{`<`}{`times`}{` `}{`type`}{`=`}{`\"timeselection\"`}{`>`}{`13:00,15:00-0:01,20:58-0:01,20:59-0:01,19:20-0:01,21:59-0,0-0,0`}{`{`times`}{`>`}{`\n`}{`    `}{`<`}{`delay`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`10000`}{`{`delay`}{`>`}{`\n`}{`  `}{`{`Time`}{`>`}{`\n`}{`{`conditions`}{`>`}
\n
{`Times`}
\n

{`The times property contains a list of times, delimited by a \"-\". The first item in the list will specify the time range for the first day of the week (Monday), the last item for the last day of the week (Sunday). The begin- and end-time, for a specific day, are delimited by a \",\" where the first element will specify that start time and the second one specifies the end time.`}

\n
{`Delay`}
\n

{`The delay value is used when the condition failed, so when the current time isn't in the selected time range for that day. In that case the machinery will idle for the specified delay time. The value of the delay is expressed in miliseconds.`}

\n

{`Algorithm`}

\n

{`The algorithm is the second step of the four passway. An algorithm will execute some kind of function on a sequence of images, and end up with a black and white image; just like the image below. An example of an algorithm would be one that does motion detection or one that would detect cats or dogs (using TensorFlow, ar any other Deep Learning framework).`}

\n

\"machinery

\n

{`The white pixels on the image will indicate the object of interest. For example, when looking for motion, the pixels that have been changed; it depends on what the algorithm is looking for. The black pixels are background pixels.`}

\n

{`The only convention that an algorithm should meet is that it should return a black and white image to the next step; the expositor. And of course that it requires a sequence of images as a parameter. Besides those conventions, an algorithm can do everything it wants to do. So you could create your own cat detection algorithm, marker detection, etc.`}

\n

{`You can select the algortihm in the `}{`config/config.xml`}{`.`}

\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`algorithm`}{` `}{`file`}{`=`}{`\"algorithm.xml\"`}{`>`}{`DifferentialCollins`}{`{`algorithm`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`Differential images`}

\n

{`This algorithm is a very simple method to detect motion; in terms of understanding but also processing. Just like the name says, it's the result of comparing images. When the images are compared, we know the pixels that have been changed and if the amount of pixels that changed is big enough, one can say that something happened and thus motion was detected.`}

\n

{`To get a more technical explanation: the algoritm will substract 2 or more images, and once that is done it will end up with a black and white image. The white pixels will mark the pixels that where different/changed and the black pixels are the pixels that have not changed; background pixels. Please note that there are several different combinations of substracting images. However for the machinery, we will use the method of Collins et al. as this method erases the phenomenon \"ghosting\".`}

\n

\"machinery

\n

{`In the image above the method of Collins et al. is illustrated. For this method we will process three images. The images are a sequence (from left to right), so the first (A) image was taken before the second (B) one, and the second (B) before the third (C) one. Next we will do a first comparision (C-B) of the third (C) image and the second (B) image, and after that we will do a second comparison (C-A) of the third (C) image and first (A) image.`}

\n

{`After the comparison we will end up with two difference images (C-B) and (C-A); both will mark the white pixels as changed pixels and black as non-changed pixels. To finish the algorithm we will do a logical AND-operation of the two difference images; this will give us the final black and white image ((C-B)&&(C-A)).`}

\n

{`The main idea of the Colins et al. method, is that it will erase \"ghosting\". In the last step we are doing a logical AND-operation, by doing this we will only keep the pixels, that changed in the first two images; therefore we can elimante false positives.`}

\n

{`Parameters`}

\n

{`The parameters of the Differential images algorithm can be found in the config/algorithm.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`algorithms`}{`>`}{`\n`}{`  `}{`<`}{`DifferentialCollins`}{`>`}{`\n`}{`    `}{`<`}{`erode`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`5`}{`{`erode`}{`>`}{`\n`}{`    `}{`<`}{`threshold`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`20`}{`{`threshold`}{`>`}{`\n`}{`  `}{`{`DifferentialCollins`}{`>`}{`\n`}{`{`algorithms`}{`>`}
\n
{`Erode`}
\n

{`The erode parameter represents a structural element (a morphological operation), which will be used to minimize the changed pixels; more information about eroding can be found here. The idea of the eroding is that pixels which are isolated will be removed; this means that when only one pixel changed, that pixel will reverted to the non-changed state. But for example when a large change happens and a lot of adjacent pixels are changed, the eroding will not be able to revert them.`}

\n

{`The higher the number of the erode parameter, the more aggressive the eroding will be. So high erode values, will make it possible that also large changes will be reverted to the non-changed state.`}

\n
{`Threshold`}
\n

{`When doing the comparison of two images, we won't end up with a clean black and white image. In most of the cases the values will be between 0 and 255; so gray values. This means that the value 0 will mean that both pixels where the same in both image, and values 255 mean that both pixels where totally different in both images. Of course we will also have values between 0-255, so pixels that are a little bit different in both images. So to make the resulting black and white image, we will need to apply a threshold value.`}

\n

{`The threshold will specify how much a pixel has to be different in the two images. So for example when the threshold is 30, it means that the difference between two pixels has to be equal or more then 30. The higher the threshold the more the pixel needs to be different, to be marked as changed.`}

\n

{`Expositor`}

\n

{`After the algorithm is executed, the expositor will determine, a region, where the changes were detected. An expositor can constrain a region in terms of selecting a hull or defining a rectangle.`}

\n

{`An expositor receives a black and white image as parameter and should modify a JSON object with all the information it processed. The JSON object must include: the bounding rectangle(s) of the positions where the pixels of interest are located and the number of pixels of interest. But can also include other optional parameters.`}

\n

{`You can change the expositor by changing the `}{`config/config.xml`}{` file, and choose one of the following:`}

\n
    \n
  • {`Hull`}
  • \n
  • {`Rectangle`}
  • \n
\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`expositor`}{` `}{`file`}{`=`}{`\"expositor.xml\"`}{`>`}{`Hull`}{`{`expositor`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`Rectangle`}

\n

{`This is a trivial expositor. A rectangle region can be defined to constrain the locations of pixels of interest. The rectangle repositor will return the region of the pixels of interest.`}

\n

{`Parameters`}

\n

{`The parameters of the rectangle expositor can be found in the config/expositor.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`expositors`}{`>`}{`\n`}{`  `}{`<`}{`Rectangle`}{`>`}{`\n`}{`    `}{`<`}{`region`}{`>`}{`\n`}{`      `}{`<`}{`x1`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`x1`}{`>`}{`\n`}{`      `}{`<`}{`y1`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`y1`}{`>`}{`\n`}{`      `}{`<`}{`x2`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1280`}{`{`x2`}{`>`}{`\n`}{`      `}{`<`}{`y2`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`720`}{`{`y2`}{`>`}{`\n`}{`    `}{`{`region`}{`>`}{`\n`}{`  `}{`{`Rectangle`}{`>`}{`\n`}{`{`expositors`}{`>`}
\n
{`Region`}
\n

{`The region parameter contains 4 values; x1, y1, x2 and y2 respectively. The values x1 and y1 indicate the x- and y-coordinate of the left upper starting point. The values x2 and y2 are the bottom right coordinates. A virtual rectangle will be drawn from (x1,y1) to (x2,y2). Pixels of interest that lie within this rectangle are valid pixels; if not they are invalid.`}

\n

{`Hull`}

\n

{`This hull is a more complex expositor than the rectangle. A hull can be selected with the web, you can select one or more coordinates to create a flexible region. The coordinates can be adjusted afterwards and be removed by double clicking on the coordinate. You can expand the hull by removing the start coordinate, which is marked by the white bullet.`}

\n

\"machinery

\n

{`Parameters`}

\n

{`The parameters of the hull expositor can be found in the config/expositor.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`expositors`}{`>`}{`\n`}{`  `}{`<`}{`Hull`}{`>`}{`\n`}{`    `}{`<`}{`region`}{` `}{`type`}{`=`}{`\"hullselection\"`}{`>`}{`347,361|627,266|975,328|1091,328|1148,413|1158,516|1121,534|962,567|699,648|531,700|243,613|423,550|665,453|850,470|666,361|467,385|325,460|165,372`}{`{`region`}{`>`}{`\n`}{`  `}{`{`Hull`}{`>`}{`\n`}{`{`expositors`}{`>`}
\n
{`Region`}
\n

{`The region parameter contains n values. Each value represents a coordinate (x,y) and are seperated by the \"|\" delimiter. These coordinates are used to calculate the concave hull. Pixels of interest that lie within the concave hull are valid pixels; if not they are invalid.`}

\n

{`Heuristic`}

\n

{`The heuristic is the last step in the four passway which will decide if the detection is valid or not. It will do this by using information from the previous steps (the expositor and the algorithm); e.g. number of changed pixels.`}

\n

{`You can change the heuristic by changing the `}{`config/config.xml`}{` file, and choose one of the following:`}

\n
    \n
  • {`Sequence`}
  • \n
\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`heuristic`}{` `}{`file`}{`=`}{`\"heuristic.xml\"`}{`>`}{`Sequence`}{`{`heuristic`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`Sequence`}

\n

{`This is a trivial heuristic. The sequence heuristic will store a single integer in memory, that will count the numbers of valid detections. When the heuristic will detect a false detection, it will decrease the count. The sequence heuristic will return true, if a threshold is reached; for example when something was detected three times in a row.`}

\n

{`Parameters`}

\n

{`The parameters of the Sequence heuristic can be found in the config/heuristic.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`heuristics`}{`>`}{`\n`}{`<`}{`Sequence`}{`>`}{`\n`}{`    `}{`<`}{`minimumChanges`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1`}{`{`minimumChanges`}{`>`}{`\n`}{`    `}{`<`}{`minimumDuration`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1`}{`{`minimumDuration`}{`>`}{`\n`}{`    `}{`<`}{`noMotionDelayTime`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`2000`}{`{`noMotionDelayTime`}{`>`}{`\n`}{`  `}{`{`Sequence`}{`>`}{`\n`}{`{`heuristics`}{`>`}
\n
{`Minimum changes`}
\n

{`The heuristic will only return true if enough changes have been detected. The minimum of changes indicates the minimum number of pixels that have to been changed, to be a valid detection.`}

\n
{`Minimum durations`}
\n

{`The minimum number of detections in a row to be a valid detection.`}

\n
{`No motion delay time`}
\n

{`When the heuristic failed, due to not enough pixels changed or not x detections in a row, the heuristic will idle for some time.`}

\n

{`Output`}

\n

{`If the heuristic determined that the evaluation was valid, one or more output operations can be executed. You configure which ooutput operations that will be executed, by modifying the configuration file or using the web interface.`}

\n
{`{`xml`}{` version`}{`=`}{`\"1.0\"`}{`?>`}{`\n`}{`<`}{`kerberos`}{`>`}{`\n`}{`  `}{`<`}{`instance`}{`>`}{`\n`}{`    ...`}{`\n`}{`    `}{`<`}{`io`}{` `}{`file`}{`=`}{`\"io.xml\"`}{` `}{`type`}{`=`}{`\"multiple\"`}{`>`}{`Video`}{`{`io`}{`>`}{`\n`}{`    ...`}{`\n`}{`  `}{`{`instance`}{`>`}{`\n`}{`{`kerberos`}{`>`}
\n

{`You can choose which output devices you will be using. If you select multiple outputs, seperate them with an `}{`,`}{`. You can change the output device by changing the `}{`config/config.xml`}{` file, and choose one of the following:`}

\n
    \n
  • {`Disk`}
  • \n
  • {`Video`}
  • \n
  • {`GPIO`}
  • \n
  • {`TCPSocket`}
  • \n
  • {`Webhook`}
  • \n
  • {`MQTT`}
  • \n
  • {`Script`}
  • \n
\n

{`Disk`}

\n

{`An image can be saved to disk.`}

\n

{`Parameters`}

\n

{`The parameters of the Disk output device can be found in the `}{`config/io.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`Disk`}{`>`}{`\n`}{`    `}{`<`}{`fileFormat`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`timestamp_microseconds_instanceName_regionCoordinates_numberOfChanges_token.jpg`}{`{`fileFormat`}{`>`}{`\n`}{`    `}{`<`}{`directory`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`/etc/opt/kerberosio/capture/`}{`{`directory`}{`>`}{`\n`}{`    `}{`<`}{`markWithTimestamp`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`markWithTimestamp`}{`>`}{`\n`}{`    `}{`<`}{`timestampColor`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`white`}{`{`timestampColor`}{`>`}{`\n`}{`    `}{`<`}{`privacy`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`privacy`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`Disk`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`File format`}
\n

{`The format that will be used for the name of the image. One or more variables can be defined and will be replaced by the machinery. Note that when you're using a variables name in the file format, that this name should be defined in the JSON object.`}

\n
{`Directory`}
\n

{`The directory where the image will be saved to. By default images are saved to the /etc/opt/kerberosio/capture directory.`}

\n
{`Mark with timestamp`}
\n

{`When this settings is set to true, the image is marked with a timestamp.`}

\n
{`Timestamp color`}
\n

{`A color can be defined for timestamp: white, black, red, green and blue.`}

\n
{`Privacy`}
\n

{`The privacy mode can be activated to remove some parts from the image. This especially helpful if you want to filter out public areas. When this option is enabled you will seee that after configuring the Hull expositor, you'll see that the pixels outside your region of interest (Hull) are made black.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Disk will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n

{`Video`}

\n

{`When a valid event is detected, a video will be recorded for x seconds. When more valid events are detected, while a video is recording, the video file will further record for x seconds; so no new video file be recorded, but the existing one will be expanded.`}

\n

{`Parameters`}

\n

{`The parameters of the Video output device can be found in the `}{`config/io.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`Video`}{`>`}{`\n`}{`    `}{`<`}{`fps`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`3`}{`{`fps`}{`>`}{`\n`}{`    `}{`<`}{`recordAfter`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`5`}{`{`recordAfter`}{`>`}{`\n`}{`    `}{`<`}{`maxDuration`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`120`}{`{`maxDuration`}{`>`}{`\n`}{`    `}{`<`}{`extension`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`mp4`}{`{`extension`}{`>`}{`\n`}{`    `}{`<`}{`codec`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`h264`}{`{`codec`}{`>`}{`\n`}{`    `}{`<`}{`fileFormat`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`timestamp_microseconds_instanceName_regionCoordinates_numberOfChanges_token`}{`{`fileFormat`}{`>`}{`\n`}{`    `}{`<`}{`directory`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`/etc/opt/kerberosio/capture/`}{`{`directory`}{`>`}{`\n`}{`    `}{`<`}{`hardwareDirectory`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`/etc/opt/kerberosio/h264/`}{`{`hardwareDirectory`}{`>`}{`\n`}{`    `}{`<`}{`enableHardwareEncoding`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`true`}{`{`enableHardwareEncoding`}{`>`}{`\n`}{`    `}{`<`}{`markWithTimestamp`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`markWithTimestamp`}{`>`}{`\n`}{`    `}{`<`}{`timestampColor`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`white`}{`{`timestampColor`}{`>`}{`\n`}{`    `}{`<`}{`privacy`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`privacy`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`Video`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`FPS`}
\n

{`The frames per second of the video being recorded. Please note that this number is limited and depends heavily on your hardware setup. You'll be receiving following warning in the systems logs, if the machinery can't write the desired FPS.`}

\n
{`[trivial] IoVideo: framerate is too fast, can't record video at this speed (8/FPS)`}
\n
{`Record after`}
\n

{`The number of seconds recorded after the last valid event was detected. This means that when a video is already recording, and a valid event was detected, the video will be expanded with x more seconds.`}

\n
{`Extensions`}
\n

{`The extension or container of the video file. We highly recommend to use the MP4 container if you want cross-browser support. Leave this setting by default, if you don't know what you're doing.`}

\n
{`Codec`}
\n

{`The codec that is used to encode the video file.`}

\n
{`File format`}
\n

{`The format that will be used for the name of the image. One or more variables can be defined and will be replaced by the machinery. Note that when you're using a variables name in the file format, that this name should be defined in the JSON object.`}

\n
{`Directory`}
\n

{`The directory where the videos will be saved. By default videos are saved to the /etc/opt/kerberosio/capture directory.`}

\n
{`Hardware directory`}
\n

{`When using onboard hardware encoding (e.g. with Raspberry Pi camera), h264 video files are generated and stored in this directory. Afterwards these h264 files will be containerized to mp4 files, and stored in the Directory path.`}

\n
{`Enable Hardware encoding`}
\n

{`A boolean which can enable or disable hardware encoding. Please note that this option is enabled by default, but does not mean that it will work if you choose to use an USB camera.`}

\n
{`Mark with timestamp`}
\n

{`When this settings is set to true, the video is marked with a timestamp (similar to the Disk device).`}

\n
{`Timestamp color`}
\n

{`A color can be defined for timestamp: white, black, red, green and blue.`}

\n
{`Privacy`}
\n

{`The privacy mode can be activated to remove some parts from the video. This especially helpful if you want to filter out public areas.`}

\n
{`Video privacy`}
\n

{`After updating the configuration, you'll see that the pixels outside your region of interest (ROI) are made black; the image below illustrates this.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Video will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n

{`TCP/IP client`}

\n

{`The TCP/IP client will send a TCP packet to a server.`}

\n

{`Parameters`}

\n

{`The parameters of the TCP/IP client can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`TCPSocket`}{`>`}{`\n`}{`    `}{`<`}{`server`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`127.0.0.1`}{`{`server`}{`>`}{`\n`}{`    `}{`<`}{`port`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1337`}{`{`port`}{`>`}{`\n`}{`    `}{`<`}{`message`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`it's so fluffy`}{`{`message`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`TCPSocket`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`Server`}
\n

{`The IP of the TCP server.`}

\n
{`Port`}
\n

{`This is the port of the TCP server.`}

\n
{`Message`}
\n

{`You can send some data to a TCP server.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the TCP will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n

{`GPIO`}

\n

{`A GPIO pin can be set as output device.`}

\n

{`Parameters`}

\n

{`The parameters of the GPIO pin can be found in the `}{`config/io.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`GPIO`}{`>`}{`\n`}{`    `}{`<`}{`pin`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`17`}{`{`pin`}{`>`}{`\n`}{`    `}{`<`}{`periods`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`5`}{`{`periods`}{`>`}{`\n`}{`    `}{`<`}{`periodTime`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`100000`}{`{`periodTime`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`GPIO`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`Pin`}
\n

{`The pin that will be triggered.`}

\n
{`Periods`}
\n

{`The number of times the pin will be triggered.`}

\n
{`Period time`}
\n

{`The time in microseconds that the pin will be set high.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the GPIO will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n

{`Webhook`}

\n

{`Detailed information (a JSON object) is send as a POST request to a webhook. The JSON object contains the number of changes, the region, the URL of the image, etc. This is useful if you want to integrate with your own application.`}

\n

{`Make sure that the Webhook comes after the Disk device, otherwise the URL of the image is not included.`}

\n

{`Parameters`}

\n

{`The parameters of the webhook can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`Webhook`}{`>`}{`\n`}{`    `}{`<`}{`url`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`http://kerberos.web/api/v1/webhook`}{`{`url`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`Webhook`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`Url`}
\n

{`This is the URL, to which the machinery will send a JSON object (as a POST request).`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Webhook will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n
{`Output`}
\n

{`A JSON object is POSTed to the url you've defined.`}

\n
{`[`}{`\n`}{`  `}{`'regionCoordinates'`}{` `}{`:`}{` [`}{`618`}{`, `}{`317`}{`, `}{`703`}{`, `}{`493`}{`],`}{`\n`}{`  `}{`'numberOfChanges'`}{` `}{`:`}{` `}{`5446`}{`,`}{`\n`}{`  `}{`'timestamp'`}{` `}{`:`}{` `}{`'`}{`1465894497`}{`'`}{`,`}{`\n`}{`  `}{`'microseconds'`}{` `}{`:`}{` `}{`'`}{`5-97451`}{`'`}{`,`}{`\n`}{`  `}{`'token'`}{` `}{`:`}{` `}{`695`}{`,`}{`\n`}{`  `}{`'pathToImage'`}{` `}{`:`}{` `}{`'`}{`1465894497`}{`_`}{`5-97451`}{`_frontdoor_`}{`618-317-703-493`}{`_`}{`5446`}{`_`}{`695`}{`.jpg'`}{`,`}{`\n`}{`  `}{`'instanceName'`}{` `}{`:`}{` `}{`'frontdoor'`}{`,`}{`\n`}{`]`}
\n

{`Script`}

\n

{`A bash script can be executed after a valid event was detected. A JSON object is send in the first parameter to the script you've defined.`}

\n

{`Parameters`}

\n

{`The parameters of the Script output device can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`>`}{`\n`}{`  `}{`<`}{`Script`}{`>`}{`\n`}{`    `}{`<`}{`path`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`/etc/opt/kerberosio/scripts/run.sh`}{`{`path`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`Script`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`Path`}
\n

{`The location of the script that will be executed on detection.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the Script will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n
{`Example`}
\n

{`By default the script will point to /etc/opt/kerberosio/scripts/run.sh, which contains a template how you should start your script. Note that when using KiOS, this script will be read-only, copy it to the /data folder and change the path parameter.`}

\n
{`#!/bin/bash`}{`\n`}{`# -------------------------------------------`}{`\n`}{`# This is an example script which illustrates`}{`\n`}{`# how to use the Script IO device.`}{`\n`}{`#`}{`\n`}{`# --------------------------------------`}{`\n`}{`# The first parameter is the JSON object`}{`\n`}{`#`}{`\n`}{`# e.g. {\"regionCoordinates\":[308,250,346,329],\"numberOfChanges\":194,\"timestamp\":\"1486049622\",\"microseconds\":\"6-161868\",\"token\":344,\"pathToImage\":\"1486049622_6-161868_frontdoor_308-250-346-329_194_344.jpg\",\"instanceName\":\"frontdoor\"}`}{`\n`}{`JSON=`}{`$`}{`1`}{`\n`}{`# -------------------------------------------`}{`\n`}{`# You can use python to parse the JSON object`}{`\n`}{`# and get the required fields`}{`\n`}{`name=`}{`$`}{`(echo `}{`$`}{`JSON | python -c `}{`\"import sys, json; print json.load(sys.stdin)['instanceName']\"`}{`)`}{`\n`}{`coordinates=`}{`$`}{`(echo `}{`$`}{`JSON | python -c `}{`\"import sys, json; print json.load(sys.stdin)['regionCoordinates']\"`}{`)`}{`\n`}{`changes=`}{`$`}{`(echo `}{`$`}{`JSON | pythfon -c `}{`\"import sys, json; print json.load(sys.stdin)['numberOfChanges']\"`}{`)`}{`\n`}{`image=`}{`$`}{`(echo `}{`$`}{`JSON | python -c `}{`\"import sys, json; print json.load(sys.stdin)['pathToImage']\"`}{`)`}{`\n`}{`The idea `}{`is`}{` that you can use Python `}{`in`}{` your bash script, to parse the JSON `}{`object`}{` send `}{`as`}{` first parameter. Afterwards you can do `}{`with`}{` the output what you want.`}
\n

{`MQTT`}

\n

{`MQTT protocol is a light-weight Machine to Machine (M2M) protocol widely used in Internet of things.\nDetailed information (a JSON object) is published to an MQTT topic. The JSON object contains the number of changes, the region, the URL of the image, etc.`}

\n

{`Parameters`}

\n

{`The parameters of the MQTT output can be found in the config/io.xml file, but you can also use the web to modify the parameters. Below you see a default configuration file.`}

\n
{`<`}{`ios`}{`\n`}{`  {`>`}{`\n`}{`    `}{`<`}{`secure`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`secure`}{`>`}{`\n`}{`    `}{`<`}{`verifycn`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`false`}{`{`verifycn`}{`>`}{`\n`}{`    `}{`<`}{`server`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`127.0.0.1`}{`{`server`}{`>`}{`\n`}{`    `}{`<`}{`port`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`1883`}{`{`port`}{`>`}{`\n`}{`    `}{`<`}{`topic`}{` `}{`type`}{`=`}{`\"text\"`}{`>`}{`kios/mqtt`}{`{`topic`}{`>`}{`\n`}{`    `}{`<`}{`username`}{` `}{`type`}{`=`}{`\"text\"`}{`>{`username`}{`>`}{`\n`}{`    `}{`<`}{`password`}{` `}{`type`}{`=`}{`\"text\"`}{`>{`password`}{`>`}{`\n`}{`    `}{`<`}{`throttler`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`0`}{`{`throttler`}{`>`}{`\n`}{`  `}{`{`MQTT`}{`>`}{`\n`}{`{`ios`}{`>`}
\n
{`Secure`}
\n

{`If checked, enable SSL/TLS support. Please note that when SSL/TLS support is enabled, the server certificate issuer is verified against the CA (Certification Authority) files available in /etc/ssl/certs.`}

\n
{`Verifycn`}
\n

{`If checked, the MQTT server FQDN or ip address must match the CN (Common Name) of the server certificate.`}

\n
{`Server`}
\n

{`IP address or FQDN of the MQTT broker.`}

\n
{`Port`}
\n

{`TCP port of the MQTT broker.`}

\n
{`Topic`}
\n

{`The topic to publish to.`}

\n
{`Username`}
\n

{`The username for authenticating to the MQTT broker. This is only supported by brokers that implement the MQTT spec v3.1. If username is not set (empty), the password argument is ignored. This is only needed if the MQTT broker is configured for authentication.`}

\n
{`Password`}
\n

{`The password to use, together with the username, for authenticating to the MQTT broker. This is only supported by brokers that implement the MQTT spec v3.1. This is only needed if the MQTT broker is configured for authentication.`}

\n
{`Throttler`}
\n

{`Control the number of executions by setting a throttling value. E.g. if you set throttling to 5, the MQTT will only be triggered once in 5 seconds, nevertheless more detections occurred.`}

\n
{`Output`}
\n

{`A JSON object is published to the topic of the MQTT broker you have configured.`}

\n
{`[`}{`\n`}{`  `}{`'regionCoordinates'`}{` `}{`:`}{` [`}{`618`}{`, `}{`317`}{`, `}{`703`}{`, `}{`493`}{`],`}{`\n`}{`  `}{`'numberOfChanges'`}{` `}{`:`}{` `}{`5446`}{`,`}{`\n`}{`  `}{`'timestamp'`}{` `}{`:`}{` `}{`'`}{`1465894497`}{`'`}{`,`}{`\n`}{`  `}{`'microseconds'`}{` `}{`:`}{` `}{`'`}{`5-97451`}{`'`}{`,`}{`\n`}{`  `}{`'token'`}{` `}{`:`}{` `}{`695`}{`,`}{`\n`}{`  `}{`'pathToImage'`}{` `}{`:`}{` `}{`'`}{`1465894497`}{`_`}{`5-97451`}{`_frontdoor_`}{`618-317-703-493`}{`_`}{`5446`}{`_`}{`695`}{`.jpg'`}{`,`}{`\n`}{`  `}{`'instanceName'`}{` `}{`:`}{` `}{`'frontdoor'`}{`,`}{`\n`}{`]`}
\n
{`Example`}
\n

{`It is possible to subscribe multiple distributed IoT devices to the same MQTT topic and perform specific actions upon the detection of a motion. Devices with more resources could fetch the image to perform further elaboration.`}

\n

{`Streaming`}

\n

{`The machinery has the ability to stream your capture device as a MJPG stream.`}

\n

{`Parameters`}

\n

{`The parameters for the supported streaming protocols can be found in the `}{`config/stream.xml`}{` file, but you can also use the web to modify the parameters. Below you see a default configuration file; at the moment of writing only a MJPG stream is supported.`}

\n
{`<`}{`streams`}{`>`}{`\n`}{`\t`}{`<`}{`Mjpg`}{`>`}{`\n`}{`    \t`}{`<`}{`enabled`}{` `}{`type`}{`=`}{`\"bool\"`}{`>`}{`true`}{`{`enabled`}{`>`}{`\n`}{`    \t`}{`<`}{`streamPort`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`8889`}{`{`streamPort`}{`>`}{`\n`}{`    \t`}{`<`}{`quality`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`75`}{`{`quality`}{`>`}{`\n`}{`    \t`}{`<`}{`username`}{` `}{`type`}{`=`}{`\"number\"`}{`>{`username`}{`>`}{`\n`}{`    \t`}{`<`}{`password`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`75`}{`{`password`}{`>`}{`\n`}{`    `}{`{`Mjpg`}{`>`}{`\n`}{`{`streams`}{`>`}
\n

{`Enabled`}

\n

{`A boolean which turns ON/OFF the stream. This is interesting when working with IP cameras, where you already have an RTSP/MJPG stream from the camera itself.`}

\n

{`Stream Port`}

\n

{`The port on which the stream is available.`}

\n

{`Quality`}

\n

{`The quality is a value between `}{`[0-100]`}{`. The lower the quality, the more the image will be compressed. If you're using the RaspberryPi Camera module, this option will be ignored.`}

\n

{`Username/password`}

\n

{`You can secure the MJPEG streaming with a username and password. These credentials will be used to authorize your requests using Basic Authentication. Please note that once enabled, the live stream on the dashboard page can fail; however it will work if you open it directly in your browser or ip camera client. The format of the streaming url, after authentication enabled, will look as following:`}

\n
{`http:`}{`//username:password@ip-camera:8899`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-6976b00b424fa97011190e7fbdee0394.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-6976b00b424fa97011190e7fbdee0394.json deleted file mode 100644 index e1c0810..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-6976b00b424fa97011190e7fbdee0394.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838525776000,"key":"gatsby-plugin-mdx-entire-payload-3c04ffc205345ed8de7140bc0bd97678-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a huge amount of surveillance cameras.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":205,"offset":803},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":205,"offset":803},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":17,"column":1,"offset":806},"end":{"line":17,"column":31,"offset":836},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":17,"column":31,"offset":836}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a huge amount of surveillance cameras.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-6a44d0e0b58a1f73e5d070db7a687bf1.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-6a44d0e0b58a1f73e5d070db7a687bf1.json new file mode 100644 index 0000000..fbdfc59 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-6a44d0e0b58a1f73e5d070db7a687bf1.json @@ -0,0 +1 @@ +{"expireTime":9007200838768981000,"key":"gatsby-plugin-mdx-entire-payload-7ad46bc7e8cb39f969752e7bc22b2389-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":72,"column":1,"offset":2160},"end":{"line":72,"column":31,"offset":2190},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":72,"column":31,"offset":2190}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-6e07856bf9cd44de99ff2e6e036fc077.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-6e07856bf9cd44de99ff2e6e036fc077.json new file mode 100644 index 0000000..f008616 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-6e07856bf9cd44de99ff2e6e036fc077.json @@ -0,0 +1 @@ +{"expireTime":9007200838825136000,"key":"gatsby-plugin-mdx-entire-payload-2e36aad914c84eb17b5ed29497c14d1a-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"## Global Docker image parameters\n## Please, note that this will override the image parameters, including dependencies, configured to use the global value\n## Current available global Docker image parameters: imageRegistry and imagePullSecrets\n##\n# global:\n# imageRegistry: myRegistryName\n# imagePullSecrets:\n# - myRegistryKeySecretName\n# storageClass: myStorageClass\n\nimage:\n ## Bitnami MongoDB registry\n ##\n registry: docker.io\n ## Bitnami MongoDB image name\n ##\n repository: bitnami/mongodb\n ## Bitnami MongoDB image tag\n ## ref: https://hub.docker.com/r/bitnami/mongodb/tags/\n ##\n tag: 4.2.3-debian-10-r31\n ## Specify a imagePullPolicy\n ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n ##\n pullPolicy: IfNotPresent\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n\n ## Set to true if you would like to see extra information on logs\n ## It turns on Bitnami debugging in minideb-extras-base\n ## ref: https://github.com/bitnami/minideb-extras-base\n debug: false\n\n## String to partially override mongodb.fullname template (will maintain the release name)\n##\n# nameOverride:\n\n## String to fully override mongodb.fullname template\n##\n# fullnameOverride:\n\n# Add custom extra environment variables to all the MongoDB containers\n# extraEnvVars:\n\n## Init containers parameters:\n## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.\n##\nvolumePermissions:\n enabled: false\n image:\n registry: docker.io\n repository: bitnami/minideb\n tag: buster\n pullPolicy: Always\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n resources: {}\n\n## Enable authentication\n## ref: https://docs.mongodb.com/manual/tutorial/enable-authentication/\n#\nusePassword: true\n# existingSecret: name-of-existing-secret\n\n## MongoDB admin password\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#setting-the-root-password-on-first-run\n##\nmongodbRootPassword: 9832sfascvn31\n\n## MongoDB custom user and database\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#creating-a-user-and-database-on-first-run\n##\n# mongodbUsername: username\n# mongodbPassword: password\n# mongodbDatabase: database\n\n## Whether enable/disable IPv6 on MongoDB\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-ipv6\n##\nmongodbEnableIPv6: false\n\n## Whether enable/disable DirectoryPerDB on MongoDB\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-directoryperdb\n##\nmongodbDirectoryPerDB: false\n\n## MongoDB System Log configuration\n## ref: https://github.com/bitnami/bitnami-docker-mongodb#configuring-system-log-verbosity-level\n##\nmongodbSystemLogVerbosity: 0\nmongodbDisableSystemLog: false\n\n## MongoDB additional command line flags\n##\n## Can be used to specify command line flags, for example:\n##\n## mongodbExtraFlags:\n## - \"--wiredTigerCacheSizeGB=2\"\nmongodbExtraFlags: []\n\n## Pod Security Context\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n##\nsecurityContext:\n enabled: true\n fsGroup: 1001\n runAsUser: 1001\n\n## Kubernetes Cluster Domain\nclusterDomain: cluster.local\n\n## Kubernetes service type\nservice:\n ## Specify an explicit service name.\n # name: svc-mongo\n ## Provide any additional annotations which may be required.\n ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart\n annotations: {}\n type: ClusterIP\n # clusterIP: None\n port: 27017\n\n ## Specify the nodePort value for the LoadBalancer and NodePort service types.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n ##\n # nodePort:\n\n ## Specify the externalIP value ClusterIP service type.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips\n # externalIPs: []\n\n ## Specify the loadBalancerIP value for LoadBalancer service types.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer\n ##\n # loadBalancerIP:\n\n ## Specify the loadBalancerSourceRanges value for LoadBalancer service types.\n ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service\n ##\n # loadBalancerSourceRanges: []\n\n## Use StatefulSet instead of Deployment when deploying standalone\nuseStatefulSet: false\n\n## Setting up replication\n## ref: https://github.com/bitnami/bitnami-docker-mongodb#setting-up-a-replication\n#\nreplicaSet:\n ## Whether to create a MongoDB replica set for high availability or not\n enabled: false\n useHostnames: true\n\n ## Name of the replica set\n ##\n name: rs0\n\n ## Key used for replica set authentication\n ##\n # key: key\n\n ## Number of replicas per each node type\n ##\n replicas:\n secondary: 0\n arbiter: 0\n\n ## Pod Disruption Budget\n ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/\n pdb:\n enabled: false\n minAvailable:\n secondary: 1\n arbiter: 1\n # maxUnavailable:\n # secondary: 1\n # arbiter: 1\n\n# Annotations to be added to the deployment or statefulsets\nannotations: {}\n\n# Additional labels to apply to the deployment or statefulsets\nlabels: {}\n\n# Annotations to be added to MongoDB pods\npodAnnotations: {}\n\n# Additional pod labels to apply\npodLabels: {}\n\n## Use an alternate scheduler, e.g. \"stork\".\n## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n##\n# schedulerName:\n\n## Configure resource requests and limits\n## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n##\nresources: {}\n# Define separate resources per arbiter, which are less then primary or secondary\n# used only when replica set is enabled\nresourcesArbiter: {}\n# limits:\n# cpu: 500m\n# memory: 512Mi\n# requests:\n# cpu: 100m\n# memory: 256Mi\n\n## Pod priority\n## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/\n# priorityClassName: \"\"\n\n## Node selector\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector\nnodeSelector: {}\n\n## Affinity\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\naffinity: {}\n# Define separate affinity for arbiter pod\naffinityArbiter: {}\n\n## Tolerations\n## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\ntolerations: []\n\n## Add sidecars to the pod\n##\n## For example:\n## sidecars:\n## - name: your-image-name\n## image: your-image\n## imagePullPolicy: Always\n## ports:\n## - name: portname\n## containerPort: 1234\nsidecars: []\n## Array to add extra volumes\n##\nextraVolumes: []\n## Array to add extra mounts (normally used with extraVolumes)\n##\nextraVolumeMounts: []\n\n## Add sidecars to the arbiter pod\n# used only when replica set is enabled\n##\n## For example:\n## sidecars:\n## - name: your-image-name\n## image: your-image\n## imagePullPolicy: Always\n## ports:\n## - name: portname\n## containerPort: 1234\nsidecarsArbiter: []\n## Array to add extra volumes to the arbiter\n# used only when replica set is enabled\n##\nextraVolumesArbiter: []\n## Array to add extra mounts (normally used with extraVolumes) to the arbiter\n# used only when replica set is enabled\n##\nextraVolumeMountsArbiter: []\n\n## updateStrategy for MongoDB Primary, Secondary and Arbitrer statefulsets\n## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies\nupdateStrategy:\n type: RollingUpdate\n\n## Enable persistence using Persistent Volume Claims\n## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/\n##\npersistence:\n enabled: true\n ## A manually managed Persistent Volume and Claim\n ## Requires persistence.enabled: true\n ## If defined, PVC must be created manually before volume will be bound\n ##\n # existingClaim:\n\n ## The path the volume will be mounted at, useful when using different\n ## MongoDB images.\n ##\n mountPath: /bitnami/mongodb\n\n ## The subdirectory of the volume to mount to, useful in dev environments\n ## and one PV for multiple services.\n ##\n subPath: \"\"\n\n ## mongodb data Persistent Volume Storage Class\n ## If defined, storageClassName: \n ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning\n ## If undefined (the default) or set to null, no storageClassName spec is\n ## set, choosing the default provisioner. (gp2 on AWS, standard on\n ## GKE, AWS & OpenStack)\n ##\n # storageClass: \"-\"\n accessModes:\n - ReadWriteOnce\n size: 8Gi\n annotations: {}\n\n## Configure the ingress resource that allows you to access the\n## MongoDB installation. Set up the URL\n## ref: http://kubernetes.io/docs/user-guide/ingress/\n##\ningress:\n ## Set to true to enable ingress record generation\n enabled: false\n\n ## Set this to true in order to add the corresponding annotations for cert-manager\n certManager: false\n\n ## Ingress annotations done as key:value pairs\n ## For a full list of possible ingress annotations, please see\n ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md\n ##\n ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: \"true\" will automatically be set\n ## If certManager is set to true, annotation kubernetes.io/tls-acme: \"true\" will automatically be set\n annotations:\n # kubernetes.io/ingress.class: nginx\n\n ## The list of hostnames to be covered with this ingress record.\n ## Most likely this will be just one host, but in the event more hosts are needed, this is an array\n hosts:\n - name: mongodb.local\n path: /\n\n ## The tls configuration for the ingress\n ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n tls:\n - hosts:\n - mongodb.local\n secretName: mongodb.local-tls\n\n secrets:\n ## If you're providing your own certificates, please use this to add the certificates as secrets\n ## key and certificate should start with -----BEGIN CERTIFICATE----- or\n ## -----BEGIN RSA PRIVATE KEY-----\n ##\n ## name should line up with a tlsSecret set further up\n ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set\n ##\n ## It is also possible to create and manage the certificates outside of this helm chart\n ## Please see README.md for more information\n # - name: airflow.local-tls\n # key:\n # certificate:\n\n## Configure the options for init containers to be run before the main app containers\n## are started. All init containers are run sequentially and must exit without errors\n## for the next one to be started.\n## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\n# extraInitContainers: |\n# - name: do-something\n# image: busybox\n# command: ['do', 'something']\n\n## Configure extra options for liveness and readiness probes\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)\nlivenessProbe:\n enabled: true\n initialDelaySeconds: 30\n periodSeconds: 10\n timeoutSeconds: 5\n failureThreshold: 6\n successThreshold: 1\nreadinessProbe:\n enabled: true\n initialDelaySeconds: 5\n periodSeconds: 10\n timeoutSeconds: 5\n failureThreshold: 6\n successThreshold: 1\n\n# Define custom config map with init scripts\ninitConfigMap: {}\n# name: \"init-config-map\"\n\n## Entries for the MongoDB config file. For documentation of all options, see:\n## http://docs.mongodb.org/manual/reference/configuration-options/\n##\nconfigmap:\n# # where and how to store data.\n# storage:\n# dbPath: /bitnami/mongodb/data/db\n# journal:\n# enabled: true\n# directoryPerDB: false\n# # where to write logging data.\n# systemLog:\n# destination: file\n# quiet: false\n# logAppend: true\n# logRotate: reopen\n# path: /opt/bitnami/mongodb/logs/mongodb.log\n# verbosity: 0\n# # network interfaces\n# net:\n# port: 27017\n# unixDomainSocket:\n# enabled: true\n# pathPrefix: /opt/bitnami/mongodb/tmp\n# ipv6: false\n# bindIpAll: true\n# # replica set options\n# #replication:\n# #replSetName: replicaset\n# #enableMajorityReadConcern: true\n# # process management options\n# processManagement:\n# fork: false\n# pidFilePath: /opt/bitnami/mongodb/tmp/mongodb.pid\n# # set parameter options\n# setParameter:\n# enableLocalhostAuthBypass: true\n# # security options\n# security:\n# authorization: disabled\n# #keyFile: /opt/bitnami/mongodb/conf/keyfile\n\n## Prometheus Exporter / Metrics\n##\nmetrics:\n enabled: true\n\n image:\n registry: docker.io\n repository: bitnami/mongodb-exporter\n tag: 0.10.0-debian-10-r27\n pullPolicy: IfNotPresent\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n\n ## String with extra arguments to the metrics exporter\n ## ref: https://github.com/percona/mongodb_exporter/blob/master/mongodb_exporter.go\n extraArgs: \"\"\n\n ## Metrics exporter resource requests and limits\n ## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n ##\n # resources: {}\n\n ## Metrics exporter liveness and readiness probes\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)\n livenessProbe:\n enabled: true\n initialDelaySeconds: 15\n periodSeconds: 5\n timeoutSeconds: 5\n failureThreshold: 3\n successThreshold: 1\n readinessProbe:\n enabled: true\n initialDelaySeconds: 5\n periodSeconds: 5\n timeoutSeconds: 1\n failureThreshold: 3\n successThreshold: 1\n\n ## Metrics exporter pod Annotation\n podAnnotations:\n prometheus.io/scrape: \"true\"\n prometheus.io/port: \"9216\"\n\n ## Prometheus Service Monitor\n ## ref: https://github.com/coreos/prometheus-operator\n ## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md\n serviceMonitor:\n ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry\n enabled: false\n\n ## Specify a namespace if needed\n # namespace: monitoring\n\n ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec\n additionalLabels: {}\n\n ## Specify Metric Relabellings to add to the scrape endpoint\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint\n # relabellings:\n\n alerting:\n ## Define individual alerting rules as required\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#rulegroup\n ## https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/\n rules: {}\n\n ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Prometheus Rules to work with\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec\n additionalLabels: {}","position":{"start":{"line":115,"column":1,"offset":3501},"end":{"line":620,"column":31,"offset":21024},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":622,"column":4,"offset":21029},"end":{"line":622,"column":11,"offset":21036},"indent":[]}}],"position":{"start":{"line":622,"column":1,"offset":21026},"end":{"line":622,"column":11,"offset":21036},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":624,"column":1,"offset":21038},"end":{"line":624,"column":74,"offset":21111},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":624,"column":76,"offset":21113},"end":{"line":624,"column":83,"offset":21120},"indent":[]}}],"position":{"start":{"line":624,"column":74,"offset":21111},"end":{"line":624,"column":85,"offset":21122},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":624,"column":85,"offset":21122},"end":{"line":627,"column":76,"offset":21503},"indent":[1,1,1]}}],"position":{"start":{"line":624,"column":1,"offset":21038},"end":{"line":627,"column":76,"offset":21503},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":629,"column":1,"offset":21505},"end":{"line":629,"column":47,"offset":21551},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":631,"column":1,"offset":21553},"end":{"line":631,"column":26,"offset":21578},"indent":[]}}],"position":{"start":{"line":631,"column":1,"offset":21553},"end":{"line":631,"column":26,"offset":21578},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: factory\nspec:\n replicas: 1\n selector:\n matchLabels:\n app: factory\n minReadySeconds: 10\n strategy:\n type: RollingUpdate\n rollingUpdate:\n maxUnavailable: 1\n maxSurge: 1\n template:\n metadata:\n labels:\n app: factory\n spec:\n containers:\n - name: machinery\n image: cedricvers/factory-buildx:1.0.5\n ports:\n - containerPort: 80\n - containerPort: 8081\n env:\n - name: MACHINERY_VERSION\n value: \"1.0.1\"\n - name: FACTORY_ENVIRONMENT\n value: \"kubernetes\"\n - name: FACTORY_PWD\n value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"\n - name: MONGODB_HOST\n value: \"mongodb\"\n - name: MONGODB_DATABASE_CREDENTIALS\n value: \"admin\"\n - name: MONGODB_USERNAME\n value: \"root\"\n - name: MONGODB_PASSWORD\n value: \"9832sfascvn31\"\n - name: MQTT_URL\n value: \"tcp://127.0.0.1:1883\"\n - name: MQTT_USERNAME\n value: \"\"\n - name: MQTT_PASSWORD\n value: \"\"\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: factory\n labels:\n app: factory\nspec:\n ports:\n - port: 80\n targetPort: 80\n name: frontend\n protocol: TCP\n - port: 8081\n name: backend\n targetPort: 8081\n protocol: TCP\n selector:\n app: factory\n---\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n name: factory\n annotations:\n kubernetes.io/ingress.class: traefik\nspec:\n rules:\n - host: factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 80\n - host: api.factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 8081","position":{"start":{"line":633,"column":1,"offset":21580},"end":{"line":721,"column":32,"offset":23774},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":724,"column":1,"offset":23777},"end":{"line":724,"column":31,"offset":23807},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":724,"column":31,"offset":23807}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`## Global Docker image parameters`}{`\n`}{`## Please, note that this will override the image parameters, including dependencies, configured to use the global value`}{`\n`}{`## Current available global Docker image parameters: imageRegistry and imagePullSecrets`}{`\n`}{`##`}{`\n`}{`# global:`}{`\n`}{`#   imageRegistry: myRegistryName`}{`\n`}{`#   imagePullSecrets:`}{`\n`}{`#     - myRegistryKeySecretName`}{`\n`}{`#   storageClass: myStorageClass`}{`\n`}{`\n`}{`image:`}{`\n`}{`  ## Bitnami MongoDB registry`}{`\n`}{`  ##`}{`\n`}{`  registry: docker.io`}{`\n`}{`  ## Bitnami MongoDB image name`}{`\n`}{`  ##`}{`\n`}{`  repository: bitnami/mongodb`}{`\n`}{`  ## Bitnami MongoDB image tag`}{`\n`}{`  ## ref: https://hub.docker.com/r/bitnami/mongodb/tags/`}{`\n`}{`  ##`}{`\n`}{`  tag: 4.2.3-debian-10-r31`}{`\n`}{`  ## Specify a imagePullPolicy`}{`\n`}{`  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images`}{`\n`}{`  ##`}{`\n`}{`  pullPolicy: IfNotPresent`}{`\n`}{`  ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`  ## Secrets must be manually created in the namespace.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`  ##`}{`\n`}{`  # pullSecrets:`}{`\n`}{`  #   - myRegistryKeySecretName`}{`\n`}{`\n`}{`  ## Set to true if you would like to see extra information on logs`}{`\n`}{`  ## It turns on Bitnami debugging in minideb-extras-base`}{`\n`}{`  ## ref:  https://github.com/bitnami/minideb-extras-base`}{`\n`}{`  debug: false`}{`\n`}{`\n`}{`## String to partially override mongodb.fullname template (will maintain the release name)`}{`\n`}{`##`}{`\n`}{`# nameOverride:`}{`\n`}{`\n`}{`## String to fully override mongodb.fullname template`}{`\n`}{`##`}{`\n`}{`# fullnameOverride:`}{`\n`}{`\n`}{`# Add custom extra environment variables to all the MongoDB containers`}{`\n`}{`# extraEnvVars:`}{`\n`}{`\n`}{`## Init containers parameters:`}{`\n`}{`## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.`}{`\n`}{`##`}{`\n`}{`volumePermissions:`}{`\n`}{`  enabled: false`}{`\n`}{`  image:`}{`\n`}{`    registry: docker.io`}{`\n`}{`    repository: bitnami/minideb`}{`\n`}{`    tag: buster`}{`\n`}{`    pullPolicy: Always`}{`\n`}{`    ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`    ## Secrets must be manually created in the namespace.`}{`\n`}{`    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`    ##`}{`\n`}{`    # pullSecrets:`}{`\n`}{`    #   - myRegistryKeySecretName`}{`\n`}{`  resources: {}`}{`\n`}{`\n`}{`## Enable authentication`}{`\n`}{`## ref: https://docs.mongodb.com/manual/tutorial/enable-authentication/`}{`\n`}{`#`}{`\n`}{`usePassword: true`}{`\n`}{`# existingSecret: name-of-existing-secret`}{`\n`}{`\n`}{`## MongoDB admin password`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#setting-the-root-password-on-first-run`}{`\n`}{`##`}{`\n`}{`mongodbRootPassword: 9832sfascvn31`}{`\n`}{`\n`}{`## MongoDB custom user and database`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#creating-a-user-and-database-on-first-run`}{`\n`}{`##`}{`\n`}{`# mongodbUsername: username`}{`\n`}{`# mongodbPassword: password`}{`\n`}{`# mongodbDatabase: database`}{`\n`}{`\n`}{`## Whether enable/disable IPv6 on MongoDB`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-ipv6`}{`\n`}{`##`}{`\n`}{`mongodbEnableIPv6: false`}{`\n`}{`\n`}{`## Whether enable/disable DirectoryPerDB on MongoDB`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-directoryperdb`}{`\n`}{`##`}{`\n`}{`mongodbDirectoryPerDB: false`}{`\n`}{`\n`}{`## MongoDB System Log configuration`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb#configuring-system-log-verbosity-level`}{`\n`}{`##`}{`\n`}{`mongodbSystemLogVerbosity: 0`}{`\n`}{`mongodbDisableSystemLog: false`}{`\n`}{`\n`}{`## MongoDB additional command line flags`}{`\n`}{`##`}{`\n`}{`## Can be used to specify command line flags, for example:`}{`\n`}{`##`}{`\n`}{`## mongodbExtraFlags:`}{`\n`}{`##  - \"--wiredTigerCacheSizeGB=2\"`}{`\n`}{`mongodbExtraFlags: []`}{`\n`}{`\n`}{`## Pod Security Context`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/`}{`\n`}{`##`}{`\n`}{`securityContext:`}{`\n`}{`  enabled: true`}{`\n`}{`  fsGroup: 1001`}{`\n`}{`  runAsUser: 1001`}{`\n`}{`\n`}{`## Kubernetes Cluster Domain`}{`\n`}{`clusterDomain: cluster.local`}{`\n`}{`\n`}{`## Kubernetes service type`}{`\n`}{`service:`}{`\n`}{`  ## Specify an explicit service name.`}{`\n`}{`  # name: svc-mongo`}{`\n`}{`  ## Provide any additional annotations which may be required.`}{`\n`}{`  ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart`}{`\n`}{`  annotations: {}`}{`\n`}{`  type: ClusterIP`}{`\n`}{`  # clusterIP: None`}{`\n`}{`  port: 27017`}{`\n`}{`\n`}{`  ## Specify the nodePort value for the LoadBalancer and NodePort service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport`}{`\n`}{`  ##`}{`\n`}{`  # nodePort:`}{`\n`}{`\n`}{`  ## Specify the externalIP value ClusterIP service type.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips`}{`\n`}{`  # externalIPs: []`}{`\n`}{`\n`}{`  ## Specify the loadBalancerIP value for LoadBalancer service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer`}{`\n`}{`  ##`}{`\n`}{`  # loadBalancerIP:`}{`\n`}{`\n`}{`  ## Specify the loadBalancerSourceRanges value for LoadBalancer service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service`}{`\n`}{`  ##`}{`\n`}{`  # loadBalancerSourceRanges: []`}{`\n`}{`\n`}{`## Use StatefulSet instead of Deployment when deploying standalone`}{`\n`}{`useStatefulSet: false`}{`\n`}{`\n`}{`## Setting up replication`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb#setting-up-a-replication`}{`\n`}{`#`}{`\n`}{`replicaSet:`}{`\n`}{`  ## Whether to create a MongoDB replica set for high availability or not`}{`\n`}{`  enabled: false`}{`\n`}{`  useHostnames: true`}{`\n`}{`\n`}{`  ## Name of the replica set`}{`\n`}{`  ##`}{`\n`}{`  name: rs0`}{`\n`}{`\n`}{`  ## Key used for replica set authentication`}{`\n`}{`  ##`}{`\n`}{`  # key: key`}{`\n`}{`\n`}{`  ## Number of replicas per each node type`}{`\n`}{`  ##`}{`\n`}{`  replicas:`}{`\n`}{`    secondary: 0`}{`\n`}{`    arbiter: 0`}{`\n`}{`\n`}{`  ## Pod Disruption Budget`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/`}{`\n`}{`  pdb:`}{`\n`}{`    enabled: false`}{`\n`}{`    minAvailable:`}{`\n`}{`      secondary: 1`}{`\n`}{`      arbiter: 1`}{`\n`}{`    # maxUnavailable:`}{`\n`}{`      # secondary: 1`}{`\n`}{`      # arbiter: 1`}{`\n`}{`\n`}{`# Annotations to be added to the deployment or statefulsets`}{`\n`}{`annotations: {}`}{`\n`}{`\n`}{`# Additional labels to apply to the deployment or statefulsets`}{`\n`}{`labels: {}`}{`\n`}{`\n`}{`# Annotations to be added to MongoDB pods`}{`\n`}{`podAnnotations: {}`}{`\n`}{`\n`}{`# Additional pod labels to apply`}{`\n`}{`podLabels: {}`}{`\n`}{`\n`}{`## Use an alternate scheduler, e.g. \"stork\".`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/`}{`\n`}{`##`}{`\n`}{`# schedulerName:`}{`\n`}{`\n`}{`## Configure resource requests and limits`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/compute-resources/`}{`\n`}{`##`}{`\n`}{`resources: {}`}{`\n`}{`# Define separate resources per arbiter, which are less then primary or secondary`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`resourcesArbiter: {}`}{`\n`}{`# limits:`}{`\n`}{`#   cpu: 500m`}{`\n`}{`#   memory: 512Mi`}{`\n`}{`# requests:`}{`\n`}{`#   cpu: 100m`}{`\n`}{`#   memory: 256Mi`}{`\n`}{`\n`}{`## Pod priority`}{`\n`}{`## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/`}{`\n`}{`# priorityClassName: \"\"`}{`\n`}{`\n`}{`## Node selector`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector`}{`\n`}{`nodeSelector: {}`}{`\n`}{`\n`}{`## Affinity`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity`}{`\n`}{`affinity: {}`}{`\n`}{`# Define separate affinity for arbiter pod`}{`\n`}{`affinityArbiter: {}`}{`\n`}{`\n`}{`## Tolerations`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/`}{`\n`}{`tolerations: []`}{`\n`}{`\n`}{`## Add sidecars to the pod`}{`\n`}{`##`}{`\n`}{`## For example:`}{`\n`}{`## sidecars:`}{`\n`}{`##   - name: your-image-name`}{`\n`}{`##     image: your-image`}{`\n`}{`##     imagePullPolicy: Always`}{`\n`}{`##     ports:`}{`\n`}{`##       - name: portname`}{`\n`}{`##         containerPort: 1234`}{`\n`}{`sidecars: []`}{`\n`}{`## Array to add extra volumes`}{`\n`}{`##`}{`\n`}{`extraVolumes: []`}{`\n`}{`## Array to add extra mounts (normally used with extraVolumes)`}{`\n`}{`##`}{`\n`}{`extraVolumeMounts: []`}{`\n`}{`\n`}{`## Add sidecars to the arbiter pod`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`## For example:`}{`\n`}{`## sidecars:`}{`\n`}{`##   - name: your-image-name`}{`\n`}{`##     image: your-image`}{`\n`}{`##     imagePullPolicy: Always`}{`\n`}{`##     ports:`}{`\n`}{`##       - name: portname`}{`\n`}{`##         containerPort: 1234`}{`\n`}{`sidecarsArbiter: []`}{`\n`}{`## Array to add extra volumes to the arbiter`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`extraVolumesArbiter: []`}{`\n`}{`## Array to add extra mounts (normally used with extraVolumes) to the arbiter`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`extraVolumeMountsArbiter: []`}{`\n`}{`\n`}{`## updateStrategy for MongoDB Primary, Secondary and Arbitrer statefulsets`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies`}{`\n`}{`updateStrategy:`}{`\n`}{`  type: RollingUpdate`}{`\n`}{`\n`}{`## Enable persistence using Persistent Volume Claims`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/`}{`\n`}{`##`}{`\n`}{`persistence:`}{`\n`}{`  enabled: true`}{`\n`}{`  ## A manually managed Persistent Volume and Claim`}{`\n`}{`  ## Requires persistence.enabled: true`}{`\n`}{`  ## If defined, PVC must be created manually before volume will be bound`}{`\n`}{`  ##`}{`\n`}{`  # existingClaim:`}{`\n`}{`\n`}{`  ## The path the volume will be mounted at, useful when using different`}{`\n`}{`  ## MongoDB images.`}{`\n`}{`  ##`}{`\n`}{`  mountPath: /bitnami/mongodb`}{`\n`}{`\n`}{`  ## The subdirectory of the volume to mount to, useful in dev environments`}{`\n`}{`  ## and one PV for multiple services.`}{`\n`}{`  ##`}{`\n`}{`  subPath: \"\"`}{`\n`}{`\n`}{`  ## mongodb data Persistent Volume Storage Class`}{`\n`}{`  ## If defined, storageClassName: `}{`\n`}{`  ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning`}{`\n`}{`  ## If undefined (the default) or set to null, no storageClassName spec is`}{`\n`}{`  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on`}{`\n`}{`  ##   GKE, AWS & OpenStack)`}{`\n`}{`  ##`}{`\n`}{`  # storageClass: \"-\"`}{`\n`}{`  accessModes:`}{`\n`}{`    - ReadWriteOnce`}{`\n`}{`  size: 8Gi`}{`\n`}{`  annotations: {}`}{`\n`}{`\n`}{`## Configure the ingress resource that allows you to access the`}{`\n`}{`## MongoDB installation. Set up the URL`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/ingress/`}{`\n`}{`##`}{`\n`}{`ingress:`}{`\n`}{`  ## Set to true to enable ingress record generation`}{`\n`}{`  enabled: false`}{`\n`}{`\n`}{`  ## Set this to true in order to add the corresponding annotations for cert-manager`}{`\n`}{`  certManager: false`}{`\n`}{`\n`}{`  ## Ingress annotations done as key:value pairs`}{`\n`}{`  ## For a full list of possible ingress annotations, please see`}{`\n`}{`  ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md`}{`\n`}{`  ##`}{`\n`}{`  ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: \"true\" will automatically be set`}{`\n`}{`  ## If certManager is set to true, annotation kubernetes.io/tls-acme: \"true\" will automatically be set`}{`\n`}{`  annotations:`}{`\n`}{`  #  kubernetes.io/ingress.class: nginx`}{`\n`}{`\n`}{`  ## The list of hostnames to be covered with this ingress record.`}{`\n`}{`  ## Most likely this will be just one host, but in the event more hosts are needed, this is an array`}{`\n`}{`  hosts:`}{`\n`}{`  - name: mongodb.local`}{`\n`}{`    path: /`}{`\n`}{`\n`}{`  ## The tls configuration for the ingress`}{`\n`}{`  ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls`}{`\n`}{`  tls:`}{`\n`}{`  - hosts:`}{`\n`}{`      - mongodb.local`}{`\n`}{`    secretName: mongodb.local-tls`}{`\n`}{`\n`}{`  secrets:`}{`\n`}{`  ## If you're providing your own certificates, please use this to add the certificates as secrets`}{`\n`}{`  ## key and certificate should start with -----BEGIN CERTIFICATE----- or`}{`\n`}{`  ## -----BEGIN RSA PRIVATE KEY-----`}{`\n`}{`  ##`}{`\n`}{`  ## name should line up with a tlsSecret set further up`}{`\n`}{`  ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set`}{`\n`}{`  ##`}{`\n`}{`  ## It is also possible to create and manage the certificates outside of this helm chart`}{`\n`}{`  ## Please see README.md for more information`}{`\n`}{`  # - name: airflow.local-tls`}{`\n`}{`  #   key:`}{`\n`}{`  #   certificate:`}{`\n`}{`\n`}{`## Configure the options for init containers to be run before the main app containers`}{`\n`}{`## are started. All init containers are run sequentially and must exit without errors`}{`\n`}{`## for the next one to be started.`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/`}{`\n`}{`# extraInitContainers: |`}{`\n`}{`#   - name: do-something`}{`\n`}{`#     image: busybox`}{`\n`}{`#     command: ['do', 'something']`}{`\n`}{`\n`}{`## Configure extra options for liveness and readiness probes`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)`}{`\n`}{`livenessProbe:`}{`\n`}{`  enabled: true`}{`\n`}{`  initialDelaySeconds: 30`}{`\n`}{`  periodSeconds: 10`}{`\n`}{`  timeoutSeconds: 5`}{`\n`}{`  failureThreshold: 6`}{`\n`}{`  successThreshold: 1`}{`\n`}{`readinessProbe:`}{`\n`}{`  enabled: true`}{`\n`}{`  initialDelaySeconds: 5`}{`\n`}{`  periodSeconds: 10`}{`\n`}{`  timeoutSeconds: 5`}{`\n`}{`  failureThreshold: 6`}{`\n`}{`  successThreshold: 1`}{`\n`}{`\n`}{`# Define custom config map with init scripts`}{`\n`}{`initConfigMap: {}`}{`\n`}{`#  name: \"init-config-map\"`}{`\n`}{`\n`}{`## Entries for the MongoDB config file. For documentation of all options, see:`}{`\n`}{`##   http://docs.mongodb.org/manual/reference/configuration-options/`}{`\n`}{`##`}{`\n`}{`configmap:`}{`\n`}{`#  # where and how to store data.`}{`\n`}{`#  storage:`}{`\n`}{`#    dbPath: /bitnami/mongodb/data/db`}{`\n`}{`#    journal:`}{`\n`}{`#      enabled: true`}{`\n`}{`#    directoryPerDB: false`}{`\n`}{`#  # where to write logging data.`}{`\n`}{`#  systemLog:`}{`\n`}{`#    destination: file`}{`\n`}{`#    quiet: false`}{`\n`}{`#    logAppend: true`}{`\n`}{`#    logRotate: reopen`}{`\n`}{`#    path: /opt/bitnami/mongodb/logs/mongodb.log`}{`\n`}{`#    verbosity: 0`}{`\n`}{`#  # network interfaces`}{`\n`}{`#  net:`}{`\n`}{`#    port: 27017`}{`\n`}{`#    unixDomainSocket:`}{`\n`}{`#      enabled: true`}{`\n`}{`#      pathPrefix: /opt/bitnami/mongodb/tmp`}{`\n`}{`#    ipv6: false`}{`\n`}{`#    bindIpAll: true`}{`\n`}{`#  # replica set options`}{`\n`}{`#  #replication:`}{`\n`}{`#    #replSetName: replicaset`}{`\n`}{`#    #enableMajorityReadConcern: true`}{`\n`}{`#  # process management options`}{`\n`}{`#  processManagement:`}{`\n`}{`#     fork: false`}{`\n`}{`#     pidFilePath: /opt/bitnami/mongodb/tmp/mongodb.pid`}{`\n`}{`#  # set parameter options`}{`\n`}{`#  setParameter:`}{`\n`}{`#     enableLocalhostAuthBypass: true`}{`\n`}{`#  # security options`}{`\n`}{`#  security:`}{`\n`}{`#    authorization: disabled`}{`\n`}{`#    #keyFile: /opt/bitnami/mongodb/conf/keyfile`}{`\n`}{`\n`}{`## Prometheus Exporter / Metrics`}{`\n`}{`##`}{`\n`}{`metrics:`}{`\n`}{`  enabled: true`}{`\n`}{`\n`}{`  image:`}{`\n`}{`    registry: docker.io`}{`\n`}{`    repository: bitnami/mongodb-exporter`}{`\n`}{`    tag: 0.10.0-debian-10-r27`}{`\n`}{`    pullPolicy: IfNotPresent`}{`\n`}{`    ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`    ## Secrets must be manually created in the namespace.`}{`\n`}{`    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`    ##`}{`\n`}{`    # pullSecrets:`}{`\n`}{`    #   - myRegistryKeySecretName`}{`\n`}{`\n`}{`  ## String with extra arguments to the metrics exporter`}{`\n`}{`  ## ref: https://github.com/percona/mongodb_exporter/blob/master/mongodb_exporter.go`}{`\n`}{`  extraArgs: \"\"`}{`\n`}{`\n`}{`  ## Metrics exporter resource requests and limits`}{`\n`}{`  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/`}{`\n`}{`  ##`}{`\n`}{`  # resources: {}`}{`\n`}{`\n`}{`  ## Metrics exporter liveness and readiness probes`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)`}{`\n`}{`  livenessProbe:`}{`\n`}{`    enabled: true`}{`\n`}{`    initialDelaySeconds: 15`}{`\n`}{`    periodSeconds: 5`}{`\n`}{`    timeoutSeconds: 5`}{`\n`}{`    failureThreshold: 3`}{`\n`}{`    successThreshold: 1`}{`\n`}{`  readinessProbe:`}{`\n`}{`    enabled: true`}{`\n`}{`    initialDelaySeconds: 5`}{`\n`}{`    periodSeconds: 5`}{`\n`}{`    timeoutSeconds: 1`}{`\n`}{`    failureThreshold: 3`}{`\n`}{`    successThreshold: 1`}{`\n`}{`\n`}{`  ## Metrics exporter pod Annotation`}{`\n`}{`  podAnnotations:`}{`\n`}{`    prometheus.io/scrape: \"true\"`}{`\n`}{`    prometheus.io/port: \"9216\"`}{`\n`}{`\n`}{`  ## Prometheus Service Monitor`}{`\n`}{`  ## ref: https://github.com/coreos/prometheus-operator`}{`\n`}{`  ##      https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md`}{`\n`}{`  serviceMonitor:`}{`\n`}{`    ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry`}{`\n`}{`    enabled: false`}{`\n`}{`\n`}{`    ## Specify a namespace if needed`}{`\n`}{`    # namespace: monitoring`}{`\n`}{`\n`}{`    ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with`}{`\n`}{`    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec`}{`\n`}{`    additionalLabels: {}`}{`\n`}{`\n`}{`    ## Specify Metric Relabellings to add to the scrape endpoint`}{`\n`}{`    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint`}{`\n`}{`    # relabellings:`}{`\n`}{`\n`}{`    alerting:`}{`\n`}{`      ## Define individual alerting rules as required`}{`\n`}{`      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#rulegroup`}{`\n`}{`      ##      https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/`}{`\n`}{`      rules: {}`}{`\n`}{`\n`}{`      ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Prometheus Rules to work with`}{`\n`}{`      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec`}{`\n`}{`      additionalLabels: {}`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`apiVersion: apps/v1`}{`\n`}{`kind: Deployment`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`spec:`}{`\n`}{`  replicas: 1`}{`\n`}{`  selector:`}{`\n`}{`    matchLabels:`}{`\n`}{`      app: factory`}{`\n`}{`  minReadySeconds: 10`}{`\n`}{`  strategy:`}{`\n`}{`    type: RollingUpdate`}{`\n`}{`    rollingUpdate:`}{`\n`}{`      maxUnavailable: 1`}{`\n`}{`      maxSurge: 1`}{`\n`}{`  template:`}{`\n`}{`    metadata:`}{`\n`}{`      labels:`}{`\n`}{`        app: factory`}{`\n`}{`    spec:`}{`\n`}{`      containers:`}{`\n`}{`      - name: machinery`}{`\n`}{`        image: cedricvers/factory-buildx:1.0.5`}{`\n`}{`        ports:`}{`\n`}{`          - containerPort: 80`}{`\n`}{`          - containerPort: 8081`}{`\n`}{`        env:`}{`\n`}{`        - name: MACHINERY_VERSION`}{`\n`}{`          value: \"1.0.1\"`}{`\n`}{`        - name: FACTORY_ENVIRONMENT`}{`\n`}{`          value: \"kubernetes\"`}{`\n`}{`        - name: FACTORY_PWD`}{`\n`}{`          value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"`}{`\n`}{`        - name: MONGODB_HOST`}{`\n`}{`          value: \"mongodb\"`}{`\n`}{`        - name: MONGODB_DATABASE_CREDENTIALS`}{`\n`}{`          value: \"admin\"`}{`\n`}{`        - name: MONGODB_USERNAME`}{`\n`}{`          value: \"root\"`}{`\n`}{`        - name: MONGODB_PASSWORD`}{`\n`}{`          value: \"9832sfascvn31\"`}{`\n`}{`        - name: MQTT_URL`}{`\n`}{`          value: \"tcp://127.0.0.1:1883\"`}{`\n`}{`        - name: MQTT_USERNAME`}{`\n`}{`          value: \"\"`}{`\n`}{`        - name: MQTT_PASSWORD`}{`\n`}{`          value: \"\"`}{`\n`}{`---`}{`\n`}{`apiVersion: v1`}{`\n`}{`kind: Service`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  labels:`}{`\n`}{`    app: factory`}{`\n`}{`spec:`}{`\n`}{`  ports:`}{`\n`}{`  - port: 80`}{`\n`}{`    targetPort: 80`}{`\n`}{`    name: frontend`}{`\n`}{`    protocol: TCP`}{`\n`}{`  - port: 8081`}{`\n`}{`    name: backend`}{`\n`}{`    targetPort: 8081`}{`\n`}{`    protocol: TCP`}{`\n`}{`  selector:`}{`\n`}{`    app: factory`}{`\n`}{`---`}{`\n`}{`apiVersion: extensions/v1beta1`}{`\n`}{`kind: Ingress`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  annotations:`}{`\n`}{`    kubernetes.io/ingress.class: traefik`}{`\n`}{`spec:`}{`\n`}{`  rules:`}{`\n`}{`  - host: factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 80`}{`\n`}{`  - host: api.factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 8081`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-70ad5e6ff3a23d134aa1e126b21179e4.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-70ad5e6ff3a23d134aa1e126b21179e4.json new file mode 100644 index 0000000..151be26 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-70ad5e6ff3a23d134aa1e126b21179e4.json @@ -0,0 +1 @@ +{"expireTime":9007200838824410000,"key":"gatsby-plugin-mdx-entire-payload-dbbd7a96d1f230fd34a34415e6374ffb-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files yourself, you use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":59,"offset":1701},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":61,"offset":1703},"end":{"line":54,"column":67,"offset":1709},"indent":[]}}],"position":{"start":{"line":54,"column":59,"offset":1701},"end":{"line":54,"column":69,"offset":1711},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure\nwith configuration files.","position":{"start":{"line":54,"column":69,"offset":1711},"end":{"line":55,"column":26,"offset":1783},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":26,"offset":1783},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1785},"end":{"line":57,"column":73,"offset":1857},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1785},"end":{"line":57,"column":73,"offset":1857},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1859},"end":{"line":65,"column":24,"offset":1964},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1970},"end":{"line":67,"column":18,"offset":1983},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1966},"end":{"line":67,"column":18,"offset":1983},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":1985},"end":{"line":70,"column":55,"offset":2141},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":1985},"end":{"line":70,"column":55,"offset":2141},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2143},"end":{"line":74,"column":39,"offset":2301},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2303},"end":{"line":76,"column":31,"offset":2333},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2303},"end":{"line":76,"column":31,"offset":2333},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2335},"end":{"line":89,"column":19,"offset":2636},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2641},"end":{"line":91,"column":11,"offset":2648},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2638},"end":{"line":91,"column":11,"offset":2648},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2653},"end":{"line":93,"column":11,"offset":2660},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2651},"end":{"line":93,"column":13,"offset":2662},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2650},"end":{"line":93,"column":44,"offset":2693},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.","position":{"start":{"line":93,"column":44,"offset":2693},"end":{"line":94,"column":103,"offset":2853},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2650},"end":{"line":94,"column":103,"offset":2853},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2855},"end":{"line":96,"column":72,"offset":2926},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2928},"end":{"line":98,"column":22,"offset":2949},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2928},"end":{"line":98,"column":22,"offset":2949},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":2951},"end":{"line":105,"column":22,"offset":3075},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3079},"end":{"line":106,"column":11,"offset":3086},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3076},"end":{"line":106,"column":11,"offset":3086},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3088},"end":{"line":109,"column":117,"offset":3338},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3088},"end":{"line":109,"column":117,"offset":3338},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3340},"end":{"line":111,"column":78,"offset":3417},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kerberos factory","position":{"start":{"line":113,"column":4,"offset":3422},"end":{"line":113,"column":20,"offset":3438},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3419},"end":{"line":113,"column":20,"offset":3438},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":115,"column":1,"offset":3440},"end":{"line":115,"column":74,"offset":3513},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":115,"column":76,"offset":3515},"end":{"line":115,"column":83,"offset":3522},"indent":[]}}],"position":{"start":{"line":115,"column":74,"offset":3513},"end":{"line":115,"column":85,"offset":3524},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating","position":{"start":{"line":115,"column":85,"offset":3524},"end":{"line":115,"column":128,"offset":3567},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":3440},"end":{"line":115,"column":128,"offset":3567},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":117,"column":1,"offset":3569},"end":{"line":117,"column":47,"offset":3615},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":120,"column":1,"offset":3618},"end":{"line":120,"column":31,"offset":3648},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":120,"column":31,"offset":3648}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure\nwith configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Kerberos factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-7372f9a38d8e319a968733081ff74422.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-7372f9a38d8e319a968733081ff74422.json new file mode 100644 index 0000000..4e8f544 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-7372f9a38d8e319a968733081ff74422.json @@ -0,0 +1 @@ +{"expireTime":9007200838760428000,"key":"gatsby-plugin-mdx-entire-payload-278414dafb027e652c123fe1dc3fb3f5-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":17,"column":1,"offset":499},"end":{"line":17,"column":31,"offset":529},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":17,"column":31,"offset":529}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Installation`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-75c00935cc0dfcd79768cd2bf240e752.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-75c00935cc0dfcd79768cd2bf240e752.json deleted file mode 100644 index cd3c993..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-75c00935cc0dfcd79768cd2bf240e752.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838525543000,"key":"gatsby-plugin-mdx-entire-payload-80c30a60b24b64a5d681714ed8edef0d-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable of you want to monitor dozens. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":75,"offset":661},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":75,"offset":661},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":17,"column":1,"offset":664},"end":{"line":17,"column":31,"offset":694},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":17,"column":31,"offset":694}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable of you want to monitor dozens. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-7d22e6a25d83cd5e3872db403e94ce25.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-7d22e6a25d83cd5e3872db403e94ce25.json new file mode 100644 index 0000000..a08b78d --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-7d22e6a25d83cd5e3872db403e94ce25.json @@ -0,0 +1 @@ +{"expireTime":9007200838836631000,"key":"gatsby-plugin-mdx-entire-payload-9b9e9332372fed806365505f4fde225b-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":107,"column":4,"offset":3144},"end":{"line":107,"column":11,"offset":3151},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":3141},"end":{"line":107,"column":11,"offset":3151},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}}],"position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":112,"column":1,"offset":3398},"end":{"line":112,"column":78,"offset":3475},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":116,"column":1,"offset":3501},"end":{"line":116,"column":8,"offset":3508},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":118,"column":4,"offset":3513},"end":{"line":118,"column":11,"offset":3520},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3510},"end":{"line":118,"column":11,"offset":3520},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":120,"column":74,"offset":3595},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":120,"column":76,"offset":3597},"end":{"line":120,"column":83,"offset":3604},"indent":[]}}],"position":{"start":{"line":120,"column":74,"offset":3595},"end":{"line":120,"column":85,"offset":3606},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":120,"column":85,"offset":3606},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}}],"position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":125,"column":1,"offset":3989},"end":{"line":125,"column":47,"offset":4035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}}],"position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":129,"column":1,"offset":4064},"end":{"line":129,"column":25,"offset":4088},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":131,"column":3,"offset":4092},"end":{"line":131,"column":25,"offset":4114},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":4090},"end":{"line":131,"column":25,"offset":4114},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":135,"column":12,"offset":4222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4223},"end":{"line":136,"column":12,"offset":4234},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4235},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":137,"column":12,"offset":4246},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":141,"column":1,"offset":4275},"end":{"line":145,"column":73,"offset":4587},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":147,"column":4,"offset":4592},"end":{"line":147,"column":21,"offset":4609},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4589},"end":{"line":147,"column":21,"offset":4609},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS. Look for the\nTraefik service, and copy its external ip. Add this IP to your DNS server, so it will resolve ","position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":95,"offset":4826},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"traefik.domain.com","position":{"start":{"line":150,"column":97,"offset":4828},"end":{"line":150,"column":115,"offset":4846},"indent":[]}}],"position":{"start":{"line":150,"column":95,"offset":4826},"end":{"line":150,"column":117,"offset":4848},"indent":[]}},{"type":"text","value":" (change to your domain).","position":{"start":{"line":150,"column":117,"offset":4848},"end":{"line":150,"column":142,"offset":4873},"indent":[]}}],"position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":142,"offset":4873},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":" $ kubectl get svc\n NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n factory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\n kubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\n mongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\n--> traefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h\n traefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":152,"column":1,"offset":4875},"end":{"line":158,"column":109,"offset":5552},"indent":[1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":161,"column":1,"offset":5555},"end":{"line":161,"column":31,"offset":5585},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":161,"column":31,"offset":5585}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS. Look for the\nTraefik service, and copy its external ip. Add this IP to your DNS server, so it will resolve `}{`traefik.domain.com`}{` (change to your domain).`}

\n
{`    $ kubectl get svc`}{`\n`}{`    NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`    factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`    kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`    mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`--> traefik              LoadBalancer   10.0.10.97    34.66.138.141   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`    traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-815c6b91e7de89f1d244d4a558d3301f.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-815c6b91e7de89f1d244d4a558d3301f.json new file mode 100644 index 0000000..d60267f --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-815c6b91e7de89f1d244d4a558d3301f.json @@ -0,0 +1 @@ +{"expireTime":9007200838769972000,"key":"gatsby-plugin-mdx-entire-payload-648db1003887281dde6685e527fda864-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":73,"column":1,"offset":2191},"end":{"line":84,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"traefik","position":{"start":{"line":86,"column":4,"offset":2497},"end":{"line":86,"column":11,"offset":2504},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2494},"end":{"line":86,"column":11,"offset":2504},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":89,"column":1,"offset":2507},"end":{"line":89,"column":72,"offset":2578},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":92,"column":1,"offset":2581},"end":{"line":92,"column":31,"offset":2611},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":92,"column":31,"offset":2611}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`traefik`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-86a7bfe39b88f5e2776a3fd773fcf2c6.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-86a7bfe39b88f5e2776a3fd773fcf2c6.json index fc16480..22e84d0 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-86a7bfe39b88f5e2776a3fd773fcf2c6.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-86a7bfe39b88f5e2776a3fd773fcf2c6.json @@ -1 +1 @@ -{"expireTime":9007200838684805000,"key":"gatsby-plugin-mdx-entire-payload-75a807779c87a2c180abd20b1161c154-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"CC BY-NC-SA 4.0","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":18,"offset":176},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":18,"offset":176},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Summary","position":{"start":{"line":10,"column":4,"offset":181},"end":{"line":10,"column":11,"offset":188},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":178},"end":{"line":10,"column":11,"offset":188},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You are free to:","position":{"start":{"line":12,"column":1,"offset":190},"end":{"line":12,"column":17,"offset":206},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":190},"end":{"line":12,"column":17,"offset":206},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Share — copy and redistribute the material in any medium or format","position":{"start":{"line":14,"column":3,"offset":210},"end":{"line":14,"column":69,"offset":276},"indent":[]}}],"position":{"start":{"line":14,"column":3,"offset":210},"end":{"line":14,"column":69,"offset":276},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":208},"end":{"line":14,"column":69,"offset":276},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Adapt — remix, transform, and build upon the material","position":{"start":{"line":15,"column":3,"offset":279},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":15,"column":3,"offset":279},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":15,"column":1,"offset":277},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":208},"end":{"line":15,"column":56,"offset":332},"indent":[1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"The license","position":{"start":{"line":17,"column":4,"offset":337},"end":{"line":17,"column":15,"offset":348},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":334},"end":{"line":17,"column":15,"offset":348},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License\nBy exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License (\"Public License\"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.","position":{"start":{"line":19,"column":1,"offset":350},"end":{"line":20,"column":567,"offset":1003},"indent":[1]}}],"position":{"start":{"line":19,"column":1,"offset":350},"end":{"line":20,"column":567,"offset":1003},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 1 – Definitions.","position":{"start":{"line":22,"column":5,"offset":1009},"end":{"line":22,"column":29,"offset":1033},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1005},"end":{"line":22,"column":29,"offset":1033},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.\nAdapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.\nBY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.\nCopyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.\nEffective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.\nExceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.\nLicense Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.\nLicensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.\nLicensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.\nLicensor means the individual(s) or entity(ies) granting rights under this Public License.\nNonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.\nShare means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.\nSui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.\nYou means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.","position":{"start":{"line":24,"column":1,"offset":1035},"end":{"line":37,"column":127,"offset":4698},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":24,"column":1,"offset":1035},"end":{"line":37,"column":127,"offset":4698},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 2 – Scope.","position":{"start":{"line":39,"column":5,"offset":4704},"end":{"line":39,"column":23,"offset":4722},"indent":[]}}],"position":{"start":{"line":39,"column":1,"offset":4700},"end":{"line":39,"column":23,"offset":4722},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"License grant.\nSubject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:\nreproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and\nproduce, reproduce, and Share Adapted Material for NonCommercial purposes only.\nExceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.\nTerm. The term of this Public License is specified in Section 6(a).\nMedia and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.\nDownstream recipients.\nOffer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.\nAdditional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.\nNo downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.\nNo endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).\nOther rights.","position":{"start":{"line":41,"column":1,"offset":4724},"end":{"line":53,"column":14,"offset":7185},"indent":[1,1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":41,"column":1,"offset":4724},"end":{"line":53,"column":14,"offset":7185},"indent":[1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.\nPatent and trademark rights are not licensed under this Public License.\nTo the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.","position":{"start":{"line":55,"column":1,"offset":7187},"end":{"line":57,"column":420,"offset":8052},"indent":[1,1]}}],"position":{"start":{"line":55,"column":1,"offset":7187},"end":{"line":57,"column":420,"offset":8052},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 3 – License Conditions.","position":{"start":{"line":59,"column":5,"offset":8058},"end":{"line":59,"column":36,"offset":8089},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":8054},"end":{"line":59,"column":36,"offset":8089},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Your exercise of the Licensed Rights is expressly made subject to the following conditions.","position":{"start":{"line":61,"column":1,"offset":8091},"end":{"line":61,"column":92,"offset":8182},"indent":[]}}],"position":{"start":{"line":61,"column":1,"offset":8091},"end":{"line":61,"column":92,"offset":8182},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Attribution.","position":{"start":{"line":63,"column":1,"offset":8184},"end":{"line":63,"column":13,"offset":8196},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":8184},"end":{"line":63,"column":13,"offset":8196},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If You Share the Licensed Material (including in modified form), You must:","position":{"start":{"line":65,"column":1,"offset":8198},"end":{"line":65,"column":75,"offset":8272},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":8198},"end":{"line":65,"column":75,"offset":8272},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"retain the following if it is supplied by the Licensor with the Licensed Material:\nidentification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);\na copyright notice;\na notice that refers to this Public License;\na notice that refers to the disclaimer of warranties;\na URI or hyperlink to the Licensed Material to the extent reasonably practicable;\nindicate if You modified the Licensed Material and retain an indication of any previous modifications; and\nindicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.\nYou may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.\nIf requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.\nShareAlike.\nIn addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.","position":{"start":{"line":67,"column":1,"offset":8274},"end":{"line":78,"column":127,"offset":9587},"indent":[1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":67,"column":1,"offset":8274},"end":{"line":78,"column":127,"offset":9587},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.\nYou must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.\nYou may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.","position":{"start":{"line":80,"column":1,"offset":9589},"end":{"line":82,"column":231,"offset":10199},"indent":[1,1]}}],"position":{"start":{"line":80,"column":1,"offset":9589},"end":{"line":82,"column":231,"offset":10199},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 4 – Sui Generis Database Rights.","position":{"start":{"line":84,"column":5,"offset":10205},"end":{"line":84,"column":45,"offset":10245},"indent":[]}}],"position":{"start":{"line":84,"column":1,"offset":10201},"end":{"line":84,"column":45,"offset":10245},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:","position":{"start":{"line":86,"column":1,"offset":10247},"end":{"line":86,"column":111,"offset":10357},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":10247},"end":{"line":86,"column":111,"offset":10357},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;\nif You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and\nYou must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.\nFor the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.","position":{"start":{"line":88,"column":1,"offset":10359},"end":{"line":91,"column":189,"offset":11166},"indent":[1,1,1]}}],"position":{"start":{"line":88,"column":1,"offset":10359},"end":{"line":91,"column":189,"offset":11166},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 5 – Disclaimer of Warranties and Limitation of Liability.","position":{"start":{"line":93,"column":5,"offset":11172},"end":{"line":93,"column":70,"offset":11237},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":11168},"end":{"line":93,"column":70,"offset":11237},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.\nTo the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.\nThe disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.","position":{"start":{"line":95,"column":1,"offset":11239},"end":{"line":97,"column":213,"offset":12637},"indent":[1,1]}}],"position":{"start":{"line":95,"column":1,"offset":11239},"end":{"line":97,"column":213,"offset":12637},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 6 – Term and Termination.","position":{"start":{"line":99,"column":5,"offset":12643},"end":{"line":99,"column":38,"offset":12676},"indent":[]}}],"position":{"start":{"line":99,"column":1,"offset":12639},"end":{"line":99,"column":38,"offset":12676},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.\nWhere Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:","position":{"start":{"line":101,"column":1,"offset":12678},"end":{"line":102,"column":96,"offset":12990},"indent":[1]}}],"position":{"start":{"line":101,"column":1,"offset":12678},"end":{"line":102,"column":96,"offset":12990},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or\nupon express reinstatement by the Licensor.\nFor the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.\nFor the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.\nSections 1, 5, 6, 7, and 8 survive termination of this Public License.","position":{"start":{"line":104,"column":1,"offset":12992},"end":{"line":108,"column":71,"offset":13616},"indent":[1,1,1,1]}}],"position":{"start":{"line":104,"column":1,"offset":12992},"end":{"line":108,"column":71,"offset":13616},"indent":[1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 7 – Other Terms and Conditions.","position":{"start":{"line":110,"column":5,"offset":13622},"end":{"line":110,"column":44,"offset":13661},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":13618},"end":{"line":110,"column":44,"offset":13661},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.\nAny arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.","position":{"start":{"line":112,"column":1,"offset":13663},"end":{"line":113,"column":184,"offset":13974},"indent":[1]}}],"position":{"start":{"line":112,"column":1,"offset":13663},"end":{"line":113,"column":184,"offset":13974},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 8 – Interpretation.","position":{"start":{"line":115,"column":5,"offset":13980},"end":{"line":115,"column":32,"offset":14007},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":13976},"end":{"line":115,"column":32,"offset":14007},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.\nTo the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.\nNo term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.\nNothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.","position":{"start":{"line":117,"column":1,"offset":14009},"end":{"line":120,"column":235,"offset":14969},"indent":[1,1,1]}}],"position":{"start":{"line":117,"column":1,"offset":14009},"end":{"line":120,"column":235,"offset":14969},"indent":[1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":123,"column":1,"offset":14972},"end":{"line":123,"column":31,"offset":15002},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":123,"column":31,"offset":15002}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`CC BY-NC-SA 4.0`}

\n

{`Summary`}

\n

{`You are free to:`}

\n
    \n
  • {`Share — copy and redistribute the material in any medium or format`}
  • \n
  • {`Adapt — remix, transform, and build upon the material`}
  • \n
\n

{`The license`}

\n

{`Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License\nBy exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License (\"Public License\"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.`}

\n

{`Section 1 – Definitions.`}

\n

{`Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.\nAdapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.\nBY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.\nCopyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.\nEffective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.\nExceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.\nLicense Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.\nLicensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.\nLicensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.\nLicensor means the individual(s) or entity(ies) granting rights under this Public License.\nNonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.\nShare means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.\nSui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.\nYou means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.`}

\n

{`Section 2 – Scope.`}

\n

{`License grant.\nSubject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:\nreproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and\nproduce, reproduce, and Share Adapted Material for NonCommercial purposes only.\nExceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.\nTerm. The term of this Public License is specified in Section 6(a).\nMedia and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.\nDownstream recipients.\nOffer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.\nAdditional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.\nNo downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.\nNo endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).\nOther rights.`}

\n

{`Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.\nPatent and trademark rights are not licensed under this Public License.\nTo the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.`}

\n

{`Section 3 – License Conditions.`}

\n

{`Your exercise of the Licensed Rights is expressly made subject to the following conditions.`}

\n

{`Attribution.`}

\n

{`If You Share the Licensed Material (including in modified form), You must:`}

\n

{`retain the following if it is supplied by the Licensor with the Licensed Material:\nidentification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);\na copyright notice;\na notice that refers to this Public License;\na notice that refers to the disclaimer of warranties;\na URI or hyperlink to the Licensed Material to the extent reasonably practicable;\nindicate if You modified the Licensed Material and retain an indication of any previous modifications; and\nindicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.\nYou may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.\nIf requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.\nShareAlike.\nIn addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.`}

\n

{`The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.\nYou must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.\nYou may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.`}

\n

{`Section 4 – Sui Generis Database Rights.`}

\n

{`Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:`}

\n

{`for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;\nif You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and\nYou must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.\nFor the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.`}

\n

{`Section 5 – Disclaimer of Warranties and Limitation of Liability.`}

\n

{`Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.\nTo the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.\nThe disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.`}

\n

{`Section 6 – Term and Termination.`}

\n

{`This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.\nWhere Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:`}

\n

{`automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or\nupon express reinstatement by the Licensor.\nFor the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.\nFor the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.\nSections 1, 5, 6, 7, and 8 survive termination of this Public License.`}

\n

{`Section 7 – Other Terms and Conditions.`}

\n

{`The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.\nAny arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.`}

\n

{`Section 8 – Interpretation.`}

\n

{`For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.\nTo the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.\nNo term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.\nNothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760428000,"key":"gatsby-plugin-mdx-entire-payload-75a807779c87a2c180abd20b1161c154-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"CC BY-NC-SA 4.0","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":18,"offset":176},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":18,"offset":176},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Summary","position":{"start":{"line":10,"column":4,"offset":181},"end":{"line":10,"column":11,"offset":188},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":178},"end":{"line":10,"column":11,"offset":188},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You are free to:","position":{"start":{"line":12,"column":1,"offset":190},"end":{"line":12,"column":17,"offset":206},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":190},"end":{"line":12,"column":17,"offset":206},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Share — copy and redistribute the material in any medium or format","position":{"start":{"line":14,"column":3,"offset":210},"end":{"line":14,"column":69,"offset":276},"indent":[]}}],"position":{"start":{"line":14,"column":3,"offset":210},"end":{"line":14,"column":69,"offset":276},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":208},"end":{"line":14,"column":69,"offset":276},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Adapt — remix, transform, and build upon the material","position":{"start":{"line":15,"column":3,"offset":279},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":15,"column":3,"offset":279},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":15,"column":1,"offset":277},"end":{"line":15,"column":56,"offset":332},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":208},"end":{"line":15,"column":56,"offset":332},"indent":[1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"The license","position":{"start":{"line":17,"column":4,"offset":337},"end":{"line":17,"column":15,"offset":348},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":334},"end":{"line":17,"column":15,"offset":348},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License\nBy exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License (\"Public License\"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.","position":{"start":{"line":19,"column":1,"offset":350},"end":{"line":20,"column":567,"offset":1003},"indent":[1]}}],"position":{"start":{"line":19,"column":1,"offset":350},"end":{"line":20,"column":567,"offset":1003},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 1 – Definitions.","position":{"start":{"line":22,"column":5,"offset":1009},"end":{"line":22,"column":29,"offset":1033},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1005},"end":{"line":22,"column":29,"offset":1033},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.\nAdapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.\nBY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.\nCopyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.\nEffective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.\nExceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.\nLicense Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.\nLicensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.\nLicensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.\nLicensor means the individual(s) or entity(ies) granting rights under this Public License.\nNonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.\nShare means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.\nSui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.\nYou means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.","position":{"start":{"line":24,"column":1,"offset":1035},"end":{"line":37,"column":127,"offset":4698},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":24,"column":1,"offset":1035},"end":{"line":37,"column":127,"offset":4698},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 2 – Scope.","position":{"start":{"line":39,"column":5,"offset":4704},"end":{"line":39,"column":23,"offset":4722},"indent":[]}}],"position":{"start":{"line":39,"column":1,"offset":4700},"end":{"line":39,"column":23,"offset":4722},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"License grant.\nSubject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:\nreproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and\nproduce, reproduce, and Share Adapted Material for NonCommercial purposes only.\nExceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.\nTerm. The term of this Public License is specified in Section 6(a).\nMedia and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.\nDownstream recipients.\nOffer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.\nAdditional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.\nNo downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.\nNo endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).\nOther rights.","position":{"start":{"line":41,"column":1,"offset":4724},"end":{"line":53,"column":14,"offset":7185},"indent":[1,1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":41,"column":1,"offset":4724},"end":{"line":53,"column":14,"offset":7185},"indent":[1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.\nPatent and trademark rights are not licensed under this Public License.\nTo the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.","position":{"start":{"line":55,"column":1,"offset":7187},"end":{"line":57,"column":420,"offset":8052},"indent":[1,1]}}],"position":{"start":{"line":55,"column":1,"offset":7187},"end":{"line":57,"column":420,"offset":8052},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 3 – License Conditions.","position":{"start":{"line":59,"column":5,"offset":8058},"end":{"line":59,"column":36,"offset":8089},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":8054},"end":{"line":59,"column":36,"offset":8089},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Your exercise of the Licensed Rights is expressly made subject to the following conditions.","position":{"start":{"line":61,"column":1,"offset":8091},"end":{"line":61,"column":92,"offset":8182},"indent":[]}}],"position":{"start":{"line":61,"column":1,"offset":8091},"end":{"line":61,"column":92,"offset":8182},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Attribution.","position":{"start":{"line":63,"column":1,"offset":8184},"end":{"line":63,"column":13,"offset":8196},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":8184},"end":{"line":63,"column":13,"offset":8196},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If You Share the Licensed Material (including in modified form), You must:","position":{"start":{"line":65,"column":1,"offset":8198},"end":{"line":65,"column":75,"offset":8272},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":8198},"end":{"line":65,"column":75,"offset":8272},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"retain the following if it is supplied by the Licensor with the Licensed Material:\nidentification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);\na copyright notice;\na notice that refers to this Public License;\na notice that refers to the disclaimer of warranties;\na URI or hyperlink to the Licensed Material to the extent reasonably practicable;\nindicate if You modified the Licensed Material and retain an indication of any previous modifications; and\nindicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.\nYou may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.\nIf requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.\nShareAlike.\nIn addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.","position":{"start":{"line":67,"column":1,"offset":8274},"end":{"line":78,"column":127,"offset":9587},"indent":[1,1,1,1,1,1,1,1,1,1,1]}}],"position":{"start":{"line":67,"column":1,"offset":8274},"end":{"line":78,"column":127,"offset":9587},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.\nYou must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.\nYou may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.","position":{"start":{"line":80,"column":1,"offset":9589},"end":{"line":82,"column":231,"offset":10199},"indent":[1,1]}}],"position":{"start":{"line":80,"column":1,"offset":9589},"end":{"line":82,"column":231,"offset":10199},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 4 – Sui Generis Database Rights.","position":{"start":{"line":84,"column":5,"offset":10205},"end":{"line":84,"column":45,"offset":10245},"indent":[]}}],"position":{"start":{"line":84,"column":1,"offset":10201},"end":{"line":84,"column":45,"offset":10245},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:","position":{"start":{"line":86,"column":1,"offset":10247},"end":{"line":86,"column":111,"offset":10357},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":10247},"end":{"line":86,"column":111,"offset":10357},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;\nif You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and\nYou must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.\nFor the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.","position":{"start":{"line":88,"column":1,"offset":10359},"end":{"line":91,"column":189,"offset":11166},"indent":[1,1,1]}}],"position":{"start":{"line":88,"column":1,"offset":10359},"end":{"line":91,"column":189,"offset":11166},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 5 – Disclaimer of Warranties and Limitation of Liability.","position":{"start":{"line":93,"column":5,"offset":11172},"end":{"line":93,"column":70,"offset":11237},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":11168},"end":{"line":93,"column":70,"offset":11237},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.\nTo the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.\nThe disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.","position":{"start":{"line":95,"column":1,"offset":11239},"end":{"line":97,"column":213,"offset":12637},"indent":[1,1]}}],"position":{"start":{"line":95,"column":1,"offset":11239},"end":{"line":97,"column":213,"offset":12637},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 6 – Term and Termination.","position":{"start":{"line":99,"column":5,"offset":12643},"end":{"line":99,"column":38,"offset":12676},"indent":[]}}],"position":{"start":{"line":99,"column":1,"offset":12639},"end":{"line":99,"column":38,"offset":12676},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.\nWhere Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:","position":{"start":{"line":101,"column":1,"offset":12678},"end":{"line":102,"column":96,"offset":12990},"indent":[1]}}],"position":{"start":{"line":101,"column":1,"offset":12678},"end":{"line":102,"column":96,"offset":12990},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or\nupon express reinstatement by the Licensor.\nFor the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.\nFor the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.\nSections 1, 5, 6, 7, and 8 survive termination of this Public License.","position":{"start":{"line":104,"column":1,"offset":12992},"end":{"line":108,"column":71,"offset":13616},"indent":[1,1,1,1]}}],"position":{"start":{"line":104,"column":1,"offset":12992},"end":{"line":108,"column":71,"offset":13616},"indent":[1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 7 – Other Terms and Conditions.","position":{"start":{"line":110,"column":5,"offset":13622},"end":{"line":110,"column":44,"offset":13661},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":13618},"end":{"line":110,"column":44,"offset":13661},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.\nAny arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.","position":{"start":{"line":112,"column":1,"offset":13663},"end":{"line":113,"column":184,"offset":13974},"indent":[1]}}],"position":{"start":{"line":112,"column":1,"offset":13663},"end":{"line":113,"column":184,"offset":13974},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Section 8 – Interpretation.","position":{"start":{"line":115,"column":5,"offset":13980},"end":{"line":115,"column":32,"offset":14007},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":13976},"end":{"line":115,"column":32,"offset":14007},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.\nTo the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.\nNo term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.\nNothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.","position":{"start":{"line":117,"column":1,"offset":14009},"end":{"line":120,"column":235,"offset":14969},"indent":[1,1,1]}}],"position":{"start":{"line":117,"column":1,"offset":14009},"end":{"line":120,"column":235,"offset":14969},"indent":[1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":123,"column":1,"offset":14972},"end":{"line":123,"column":31,"offset":15002},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":123,"column":31,"offset":15002}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`CC BY-NC-SA 4.0`}

\n

{`Summary`}

\n

{`You are free to:`}

\n
    \n
  • {`Share — copy and redistribute the material in any medium or format`}
  • \n
  • {`Adapt — remix, transform, and build upon the material`}
  • \n
\n

{`The license`}

\n

{`Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License\nBy exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License (\"Public License\"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.`}

\n

{`Section 1 – Definitions.`}

\n

{`Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.\nAdapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.\nBY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.\nCopyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.\nEffective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.\nExceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.\nLicense Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.\nLicensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.\nLicensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.\nLicensor means the individual(s) or entity(ies) granting rights under this Public License.\nNonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.\nShare means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.\nSui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.\nYou means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.`}

\n

{`Section 2 – Scope.`}

\n

{`License grant.\nSubject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:\nreproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and\nproduce, reproduce, and Share Adapted Material for NonCommercial purposes only.\nExceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.\nTerm. The term of this Public License is specified in Section 6(a).\nMedia and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.\nDownstream recipients.\nOffer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.\nAdditional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.\nNo downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.\nNo endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).\nOther rights.`}

\n

{`Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.\nPatent and trademark rights are not licensed under this Public License.\nTo the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.`}

\n

{`Section 3 – License Conditions.`}

\n

{`Your exercise of the Licensed Rights is expressly made subject to the following conditions.`}

\n

{`Attribution.`}

\n

{`If You Share the Licensed Material (including in modified form), You must:`}

\n

{`retain the following if it is supplied by the Licensor with the Licensed Material:\nidentification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);\na copyright notice;\na notice that refers to this Public License;\na notice that refers to the disclaimer of warranties;\na URI or hyperlink to the Licensed Material to the extent reasonably practicable;\nindicate if You modified the Licensed Material and retain an indication of any previous modifications; and\nindicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.\nYou may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.\nIf requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.\nShareAlike.\nIn addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.`}

\n

{`The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.\nYou must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.\nYou may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.`}

\n

{`Section 4 – Sui Generis Database Rights.`}

\n

{`Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:`}

\n

{`for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;\nif You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and\nYou must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.\nFor the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.`}

\n

{`Section 5 – Disclaimer of Warranties and Limitation of Liability.`}

\n

{`Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.\nTo the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.\nThe disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.`}

\n

{`Section 6 – Term and Termination.`}

\n

{`This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.\nWhere Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:`}

\n

{`automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or\nupon express reinstatement by the Licensor.\nFor the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.\nFor the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.\nSections 1, 5, 6, 7, and 8 survive termination of this Public License.`}

\n

{`Section 7 – Other Terms and Conditions.`}

\n

{`The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.\nAny arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.`}

\n

{`Section 8 – Interpretation.`}

\n

{`For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.\nTo the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.\nNo term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.\nNothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-87562f3d721f36421614227b4d7731e7.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-87562f3d721f36421614227b4d7731e7.json new file mode 100644 index 0000000..137abf3 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-87562f3d721f36421614227b4d7731e7.json @@ -0,0 +1 @@ +{"expireTime":9007200838783512000,"key":"gatsby-plugin-mdx-entire-payload-d7b4d1ae0ec1f76528f8b480120e533c-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":73,"column":1,"offset":2191},"end":{"line":84,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":86,"column":4,"offset":2497},"end":{"line":86,"column":11,"offset":2504},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2494},"end":{"line":86,"column":11,"offset":2504},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":88,"column":4,"offset":2509},"end":{"line":88,"column":11,"offset":2516},"indent":[]}}],"position":{"start":{"line":88,"column":2,"offset":2507},"end":{"line":88,"column":13,"offset":2518},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":44,"offset":2549},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.","position":{"start":{"line":88,"column":44,"offset":2549},"end":{"line":88,"column":204,"offset":2709},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":204,"offset":2709},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":90,"column":1,"offset":2711},"end":{"line":90,"column":72,"offset":2782},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":92,"column":1,"offset":2784},"end":{"line":92,"column":22,"offset":2805},"indent":[]}}],"position":{"start":{"line":92,"column":1,"offset":2784},"end":{"line":92,"column":22,"offset":2805},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":94,"column":1,"offset":2807},"end":{"line":99,"column":22,"offset":2931},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":100,"column":4,"offset":2935},"end":{"line":100,"column":11,"offset":2942},"indent":[]}}],"position":{"start":{"line":100,"column":1,"offset":2932},"end":{"line":100,"column":11,"offset":2942},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database.","position":{"start":{"line":102,"column":1,"offset":2944},"end":{"line":103,"column":44,"offset":3121},"indent":[1]}}],"position":{"start":{"line":102,"column":1,"offset":2944},"end":{"line":103,"column":44,"offset":3121},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":105,"column":1,"offset":3123},"end":{"line":105,"column":78,"offset":3200},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":108,"column":1,"offset":3203},"end":{"line":108,"column":31,"offset":3233},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":108,"column":31,"offset":3233}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-88932312069a6f83a8a3f8c6bc5f1280.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-88932312069a6f83a8a3f8c6bc5f1280.json deleted file mode 100644 index 5922699..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-88932312069a6f83a8a3f8c6bc5f1280.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838684476000,"key":"gatsby-plugin-mdx-entire-payload-5eb144d4bd253230905ece157a7bbfd2-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).","position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Cloud or on premise","position":{"start":{"line":26,"column":4,"offset":1715},"end":{"line":26,"column":23,"offset":1734},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1712},"end":{"line":26,"column":23,"offset":1734},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster. This means that whatever security policy you have, you can run it where you want.","position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":193,"offset":1928},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":193,"offset":1928},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes-cloud.png","alt":"architecture kubernetes","position":{"start":{"line":30,"column":1,"offset":1930},"end":{"line":30,"column":97,"offset":2026},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":1930},"end":{"line":30,"column":97,"offset":2026},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":33,"column":1,"offset":2029},"end":{"line":33,"column":31,"offset":2059},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":33,"column":31,"offset":2059}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n

{`Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).`}

\n

{`Cloud or on premise`}

\n

{`You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster. This means that whatever security policy you have, you can run it where you want.`}

\n

\"architecture

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-900840e189f23019cdb8c89722cc1918.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-900840e189f23019cdb8c89722cc1918.json new file mode 100644 index 0000000..7704997 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-900840e189f23019cdb8c89722cc1918.json @@ -0,0 +1 @@ +{"expireTime":9007200838825065000,"key":"gatsby-plugin-mdx-entire-payload-b7a2b65abe0263d696735aa3ba07b530-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":113,"column":4,"offset":3479},"end":{"line":113,"column":11,"offset":3486},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":11,"offset":3486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":115,"column":1,"offset":3488},"end":{"line":115,"column":74,"offset":3561},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":115,"column":76,"offset":3563},"end":{"line":115,"column":83,"offset":3570},"indent":[]}}],"position":{"start":{"line":115,"column":74,"offset":3561},"end":{"line":115,"column":85,"offset":3572},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":115,"column":85,"offset":3572},"end":{"line":118,"column":76,"offset":3953},"indent":[1,1,1]}}],"position":{"start":{"line":115,"column":1,"offset":3488},"end":{"line":118,"column":76,"offset":3953},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":120,"column":1,"offset":3955},"end":{"line":120,"column":47,"offset":4001},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":122,"column":1,"offset":4003},"end":{"line":122,"column":26,"offset":4028},"indent":[]}}],"position":{"start":{"line":122,"column":1,"offset":4003},"end":{"line":122,"column":26,"offset":4028},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: factory\nspec:\n replicas: 1\n selector:\n matchLabels:\n app: factory\n minReadySeconds: 10\n strategy:\n type: RollingUpdate\n rollingUpdate:\n maxUnavailable: 1\n maxSurge: 1\n template:\n metadata:\n labels:\n app: factory\n spec:\n containers:\n - name: machinery\n image: cedricvers/factory-buildx:1.0.5\n ports:\n - containerPort: 80\n - containerPort: 8081\n env:\n - name: MACHINERY_VERSION\n value: \"1.0.1\"\n - name: FACTORY_ENVIRONMENT\n value: \"kubernetes\"\n - name: FACTORY_PWD\n value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"\n - name: MONGODB_HOST\n value: \"mongodb\"\n - name: MONGODB_DATABASE_CREDENTIALS\n value: \"admin\"\n - name: MONGODB_USERNAME\n value: \"root\"\n - name: MONGODB_PASSWORD\n value: \"9832sfascvn31\"\n - name: MQTT_URL\n value: \"tcp://127.0.0.1:1883\"\n - name: MQTT_USERNAME\n value: \"\"\n - name: MQTT_PASSWORD\n value: \"\"\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: factory\n labels:\n app: factory\nspec:\n ports:\n - port: 80\n targetPort: 80\n name: frontend\n protocol: TCP\n - port: 8081\n name: backend\n targetPort: 8081\n protocol: TCP\n selector:\n app: factory\n---\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n name: factory\n annotations:\n kubernetes.io/ingress.class: traefik\nspec:\n rules:\n - host: factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 80\n - host: api.factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 8081","position":{"start":{"line":124,"column":1,"offset":4030},"end":{"line":212,"column":32,"offset":6224},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":215,"column":1,"offset":6227},"end":{"line":215,"column":31,"offset":6257},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":215,"column":31,"offset":6257}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`apiVersion: apps/v1`}{`\n`}{`kind: Deployment`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`spec:`}{`\n`}{`  replicas: 1`}{`\n`}{`  selector:`}{`\n`}{`    matchLabels:`}{`\n`}{`      app: factory`}{`\n`}{`  minReadySeconds: 10`}{`\n`}{`  strategy:`}{`\n`}{`    type: RollingUpdate`}{`\n`}{`    rollingUpdate:`}{`\n`}{`      maxUnavailable: 1`}{`\n`}{`      maxSurge: 1`}{`\n`}{`  template:`}{`\n`}{`    metadata:`}{`\n`}{`      labels:`}{`\n`}{`        app: factory`}{`\n`}{`    spec:`}{`\n`}{`      containers:`}{`\n`}{`      - name: machinery`}{`\n`}{`        image: cedricvers/factory-buildx:1.0.5`}{`\n`}{`        ports:`}{`\n`}{`          - containerPort: 80`}{`\n`}{`          - containerPort: 8081`}{`\n`}{`        env:`}{`\n`}{`        - name: MACHINERY_VERSION`}{`\n`}{`          value: \"1.0.1\"`}{`\n`}{`        - name: FACTORY_ENVIRONMENT`}{`\n`}{`          value: \"kubernetes\"`}{`\n`}{`        - name: FACTORY_PWD`}{`\n`}{`          value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"`}{`\n`}{`        - name: MONGODB_HOST`}{`\n`}{`          value: \"mongodb\"`}{`\n`}{`        - name: MONGODB_DATABASE_CREDENTIALS`}{`\n`}{`          value: \"admin\"`}{`\n`}{`        - name: MONGODB_USERNAME`}{`\n`}{`          value: \"root\"`}{`\n`}{`        - name: MONGODB_PASSWORD`}{`\n`}{`          value: \"9832sfascvn31\"`}{`\n`}{`        - name: MQTT_URL`}{`\n`}{`          value: \"tcp://127.0.0.1:1883\"`}{`\n`}{`        - name: MQTT_USERNAME`}{`\n`}{`          value: \"\"`}{`\n`}{`        - name: MQTT_PASSWORD`}{`\n`}{`          value: \"\"`}{`\n`}{`---`}{`\n`}{`apiVersion: v1`}{`\n`}{`kind: Service`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  labels:`}{`\n`}{`    app: factory`}{`\n`}{`spec:`}{`\n`}{`  ports:`}{`\n`}{`  - port: 80`}{`\n`}{`    targetPort: 80`}{`\n`}{`    name: frontend`}{`\n`}{`    protocol: TCP`}{`\n`}{`  - port: 8081`}{`\n`}{`    name: backend`}{`\n`}{`    targetPort: 8081`}{`\n`}{`    protocol: TCP`}{`\n`}{`  selector:`}{`\n`}{`    app: factory`}{`\n`}{`---`}{`\n`}{`apiVersion: extensions/v1beta1`}{`\n`}{`kind: Ingress`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  annotations:`}{`\n`}{`    kubernetes.io/ingress.class: traefik`}{`\n`}{`spec:`}{`\n`}{`  rules:`}{`\n`}{`  - host: factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 80`}{`\n`}{`  - host: api.factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 8081`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-93d1228f76d979359e37fed98a7d5ba1.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-93d1228f76d979359e37fed98a7d5ba1.json deleted file mode 100644 index cb640ef..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-93d1228f76d979359e37fed98a7d5ba1.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838684429000,"key":"gatsby-plugin-mdx-entire-payload-ec7c950b77dd6c8a86e33ebf08554e5b-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).","position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Cloud or on premise","position":{"start":{"line":26,"column":4,"offset":1715},"end":{"line":26,"column":23,"offset":1734},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1712},"end":{"line":26,"column":23,"offset":1734},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster. This means that whatever security policy you have, you can run it where you want.","position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":193,"offset":1928},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":193,"offset":1928},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":31,"column":1,"offset":1931},"end":{"line":31,"column":31,"offset":1961},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":31,"column":31,"offset":1961}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n

{`Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).`}

\n

{`Cloud or on premise`}

\n

{`You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster. This means that whatever security policy you have, you can run it where you want.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-9485fe549507dfbf38dab4c3beb8d3fe.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-9485fe549507dfbf38dab4c3beb8d3fe.json index ac69bc9..cd8c52d 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-9485fe549507dfbf38dab4c3beb8d3fe.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-9485fe549507dfbf38dab4c3beb8d3fe.json @@ -1 +1 @@ -{"expireTime":9007200838510859000,"key":"gatsby-plugin-mdx-entire-payload-1014fe6e16c6f7a87574e8b769397d41-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Cloud","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":8,"offset":166},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":8,"offset":166},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When installing a Kerberos agent inside your local network, it's possible to review your activity by using the agent's web interface. By nature, you will not be able to access the web interface from the cloud (outside your local network). On top of that, the Kerberos agent doesn't come with a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera.","position":{"start":{"line":10,"column":1,"offset":168},"end":{"line":10,"column":424,"offset":591},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":168},"end":{"line":10,"column":424,"offset":591},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To simplify and resolve all of these challenges, Kerberos Cloud was developed.","position":{"start":{"line":12,"column":1,"offset":593},"end":{"line":12,"column":79,"offset":671},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":593},"end":{"line":12,"column":79,"offset":671},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://cloud.kerberos.io","children":[{"type":"text","value":"Kerberos Cloud","position":{"start":{"line":14,"column":4,"offset":676},"end":{"line":14,"column":18,"offset":690},"indent":[]}}],"position":{"start":{"line":14,"column":3,"offset":675},"end":{"line":14,"column":46,"offset":718},"indent":[]}},{"type":"text","value":" is a cloud solution which allows you to have a single overview of all the media recordings generated by your surveillance cameras. It's not a solution for processing your surveillance cameras in the cloud. For processing of your surveillance cameras, a Kerberos agent is used.","position":{"start":{"line":14,"column":46,"offset":718},"end":{"line":14,"column":323,"offset":995},"indent":[]}}],"position":{"start":{"line":14,"column":3,"offset":675},"end":{"line":14,"column":323,"offset":995},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":673},"end":{"line":14,"column":323,"offset":995},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A brief list of the key features of Kerberos Cloud are:","position":{"start":{"line":16,"column":1,"offset":997},"end":{"line":16,"column":56,"offset":1052},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":997},"end":{"line":16,"column":56,"offset":1052},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Secured storage","position":{"start":{"line":18,"column":3,"offset":1056},"end":{"line":18,"column":18,"offset":1071},"indent":[]}}],"position":{"start":{"line":18,"column":3,"offset":1056},"end":{"line":18,"column":18,"offset":1071},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1054},"end":{"line":18,"column":18,"offset":1071},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Consolidated overview","position":{"start":{"line":19,"column":3,"offset":1074},"end":{"line":19,"column":24,"offset":1095},"indent":[]}}],"position":{"start":{"line":19,"column":3,"offset":1074},"end":{"line":19,"column":24,"offset":1095},"indent":[]}}],"position":{"start":{"line":19,"column":1,"offset":1072},"end":{"line":19,"column":24,"offset":1095},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Advanced searching","position":{"start":{"line":20,"column":3,"offset":1098},"end":{"line":20,"column":21,"offset":1116},"indent":[]}}],"position":{"start":{"line":20,"column":3,"offset":1098},"end":{"line":20,"column":21,"offset":1116},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1096},"end":{"line":20,"column":21,"offset":1116},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Machine learning","position":{"start":{"line":21,"column":3,"offset":1119},"end":{"line":21,"column":19,"offset":1135},"indent":[]}}],"position":{"start":{"line":21,"column":3,"offset":1119},"end":{"line":21,"column":19,"offset":1135},"indent":[]}}],"position":{"start":{"line":21,"column":1,"offset":1117},"end":{"line":21,"column":19,"offset":1135},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Alerts","position":{"start":{"line":22,"column":3,"offset":1138},"end":{"line":22,"column":9,"offset":1144},"indent":[]}}],"position":{"start":{"line":22,"column":3,"offset":1138},"end":{"line":22,"column":9,"offset":1144},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1136},"end":{"line":22,"column":9,"offset":1144},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Live streaming","position":{"start":{"line":23,"column":3,"offset":1147},"end":{"line":23,"column":17,"offset":1161},"indent":[]}}],"position":{"start":{"line":23,"column":3,"offset":1147},"end":{"line":23,"column":17,"offset":1161},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":1145},"end":{"line":23,"column":17,"offset":1161},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Accounts","position":{"start":{"line":24,"column":3,"offset":1164},"end":{"line":24,"column":11,"offset":1172},"indent":[]}}],"position":{"start":{"line":24,"column":3,"offset":1164},"end":{"line":24,"column":11,"offset":1172},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1162},"end":{"line":24,"column":11,"offset":1172},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Logging","position":{"start":{"line":25,"column":3,"offset":1175},"end":{"line":25,"column":10,"offset":1182},"indent":[]}}],"position":{"start":{"line":25,"column":3,"offset":1175},"end":{"line":25,"column":10,"offset":1182},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":1173},"end":{"line":25,"column":10,"offset":1182},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1054},"end":{"line":25,"column":10,"offset":1182},"indent":[1,1,1,1,1,1,1]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Checkout ","position":{"start":{"line":27,"column":3,"offset":1186},"end":{"line":27,"column":12,"offset":1195},"indent":[]}},{"type":"link","title":null,"url":"https://app-demo.kerberos.io","children":[{"type":"text","value":"the demo environment","position":{"start":{"line":27,"column":13,"offset":1196},"end":{"line":27,"column":33,"offset":1216},"indent":[]}}],"position":{"start":{"line":27,"column":12,"offset":1195},"end":{"line":27,"column":64,"offset":1247},"indent":[]}},{"type":"text","value":" to see and feel the Kerberos Cloud solution yourself.","position":{"start":{"line":27,"column":64,"offset":1247},"end":{"line":27,"column":118,"offset":1301},"indent":[]}}],"position":{"start":{"line":27,"column":3,"offset":1186},"end":{"line":27,"column":118,"offset":1301},"indent":[]}}],"position":{"start":{"line":27,"column":1,"offset":1184},"end":{"line":27,"column":118,"offset":1301},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Architecture","position":{"start":{"line":29,"column":4,"offset":1306},"end":{"line":29,"column":16,"offset":1318},"indent":[]}}],"position":{"start":{"line":29,"column":1,"offset":1303},"end":{"line":29,"column":16,"offset":1318},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A simplified architecture is found below. In this architecture the Kerberos agents are installed on-premise, next to the surveillance cameras. Once one of the agents recorded something it will send the recording to our AWS S3 bucket, using the credentials you've defined inside the agent.","position":{"start":{"line":31,"column":1,"offset":1320},"end":{"line":31,"column":289,"offset":1608},"indent":[]}}],"position":{"start":{"line":31,"column":1,"offset":1320},"end":{"line":31,"column":289,"offset":1608},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"As soon as the recording is succesfully received several engines will be executed, that will further process the recording and extract metadata from it (classification, origin of the surveillance camera, etc). A lot of processing is happening behind the scenes.","position":{"start":{"line":33,"column":1,"offset":1610},"end":{"line":33,"column":262,"offset":1871},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":1610},"end":{"line":33,"column":262,"offset":1871},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By using a browser you can navigate to Kerberos Cloud, and review all the recordings made by the Kerberos agents on-premise. On top of that you will receive more context about the recordings, get notifications, view a livestream and much more.","position":{"start":{"line":35,"column":1,"offset":1873},"end":{"line":35,"column":244,"offset":2116},"indent":[]}}],"position":{"start":{"line":35,"column":1,"offset":1873},"end":{"line":35,"column":244,"offset":2116},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-architecture.png","alt":"cloud","position":{"start":{"line":37,"column":1,"offset":2118},"end":{"line":37,"column":56,"offset":2173},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":2118},"end":{"line":37,"column":56,"offset":2173},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Public or Private cloud (Bring Your Own Cloud)","position":{"start":{"line":39,"column":5,"offset":2179},"end":{"line":39,"column":51,"offset":2225},"indent":[]}}],"position":{"start":{"line":39,"column":1,"offset":2175},"end":{"line":39,"column":51,"offset":2225},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"We run Kerberos Cloud in the public cloud on different services such as AWS, GCP and Scaleway. However if needed we can host our entire solution within your Private cloud (create a support ticket).","position":{"start":{"line":41,"column":1,"offset":2227},"end":{"line":41,"column":198,"offset":2424},"indent":[]}}],"position":{"start":{"line":41,"column":1,"offset":2227},"end":{"line":41,"column":198,"offset":2424},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Secured storage","position":{"start":{"line":43,"column":4,"offset":2429},"end":{"line":43,"column":19,"offset":2444},"indent":[]}}],"position":{"start":{"line":43,"column":1,"offset":2426},"end":{"line":43,"column":19,"offset":2444},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Cloud allows you to store your data in the cloud, and make it available using a secured web interface. This is how it works.","position":{"start":{"line":45,"column":1,"offset":2446},"end":{"line":45,"column":134,"offset":2579},"indent":[]}}],"position":{"start":{"line":45,"column":1,"offset":2446},"end":{"line":45,"column":134,"offset":2579},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you've installed a Kerberos agent, and created an account on ","position":{"start":{"line":47,"column":1,"offset":2581},"end":{"line":47,"column":67,"offset":2647},"indent":[]}},{"type":"link","title":null,"url":"https://cloud.kerberos.io","children":[{"type":"text","value":"Kerberos Cloud","position":{"start":{"line":47,"column":68,"offset":2648},"end":{"line":47,"column":82,"offset":2662},"indent":[]}}],"position":{"start":{"line":47,"column":67,"offset":2647},"end":{"line":47,"column":110,"offset":2690},"indent":[]}},{"type":"text","value":", you will be able to connect both systems together. By entering credentials received from Kerberos Cloud, into your Kerberos agent, your media recordings will be send to our cloud storage.","position":{"start":{"line":47,"column":110,"offset":2690},"end":{"line":47,"column":299,"offset":2879},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":2581},"end":{"line":47,"column":299,"offset":2879},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"You can link one or more Kerberos agents to your Kerberos Cloud account.","position":{"start":{"line":49,"column":3,"offset":2883},"end":{"line":49,"column":75,"offset":2955},"indent":[]}}],"position":{"start":{"line":49,"column":3,"offset":2883},"end":{"line":49,"column":75,"offset":2955},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":2881},"end":{"line":49,"column":75,"offset":2955},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-linking.png","alt":"cloud linking","position":{"start":{"line":51,"column":1,"offset":2957},"end":{"line":51,"column":65,"offset":3021},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":2957},"end":{"line":51,"column":65,"offset":3021},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"After linking your media recorded by a Kerberos agent will be send to a secure cloud storage, AWS S3 (multiple regions are supported). By default our own S3 buckets are used, however we can negotiate to have your own S3 bucket (open a support ticket).","position":{"start":{"line":53,"column":1,"offset":3023},"end":{"line":53,"column":252,"offset":3274},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":3023},"end":{"line":53,"column":252,"offset":3274},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-network-onprem.png","alt":"cloud","position":{"start":{"line":55,"column":1,"offset":3276},"end":{"line":55,"column":58,"offset":3333},"indent":[]}}],"position":{"start":{"line":55,"column":1,"offset":3276},"end":{"line":55,"column":58,"offset":3333},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once stored your media recordings will be processed by different functions and algorithms to send alerts, apply machine learning and much more.","position":{"start":{"line":57,"column":1,"offset":3335},"end":{"line":57,"column":144,"offset":3478},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":3335},"end":{"line":57,"column":144,"offset":3478},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Kerberos Cloud is much more than a storage service, you get intelligent capabilities as well. Read on to discover more.","position":{"start":{"line":59,"column":3,"offset":3482},"end":{"line":59,"column":122,"offset":3601},"indent":[]}}],"position":{"start":{"line":59,"column":3,"offset":3482},"end":{"line":59,"column":122,"offset":3601},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":3480},"end":{"line":59,"column":122,"offset":3601},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Consolidated overview","position":{"start":{"line":61,"column":4,"offset":3606},"end":{"line":61,"column":25,"offset":3627},"indent":[]}}],"position":{"start":{"line":61,"column":1,"offset":3603},"end":{"line":61,"column":25,"offset":3627},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Cloud will group your media recordings (coming from one or more Kerberos agents) into time bundles. We do this to simplify the searching of a specific event. Less data is shown at once, and when needed you can drill down a level deeper to see more details.","position":{"start":{"line":63,"column":1,"offset":3629},"end":{"line":63,"column":266,"offset":3894},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":3629},"end":{"line":63,"column":266,"offset":3894},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-overview.png","alt":"cloud overview","position":{"start":{"line":65,"column":1,"offset":3896},"end":{"line":65,"column":67,"offset":3962},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":3896},"end":{"line":65,"column":67,"offset":3962},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"In a sneak peek you will see how many media recordings were generated during a certain time period, and which Kerberos agents were involved. For example, this might give you an indication of a particular event (more about in the machine learning section).","position":{"start":{"line":67,"column":1,"offset":3964},"end":{"line":67,"column":256,"offset":4219},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":3964},"end":{"line":67,"column":256,"offset":4219},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Security","position":{"start":{"line":69,"column":5,"offset":4225},"end":{"line":69,"column":13,"offset":4233},"indent":[]}}],"position":{"start":{"line":69,"column":1,"offset":4221},"end":{"line":69,"column":13,"offset":4233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you're inside your Kerberos Cloud account, you will see all the available media recordings of your Kerberos agents in a single interface. So how does this work?","position":{"start":{"line":71,"column":1,"offset":4235},"end":{"line":71,"column":166,"offset":4400},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":4235},"end":{"line":71,"column":166,"offset":4400},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you open Kerberos Cloud we will generate temporary and private links for every media recording within your account. This link includes a random and unique hash, and is only available for a couple of minutes. So this means that your recording cannot be shared afterwards, or the risk someone else accessing that link is minimised.","position":{"start":{"line":73,"column":1,"offset":4402},"end":{"line":73,"column":335,"offset":4736},"indent":[]}}],"position":{"start":{"line":73,"column":1,"offset":4402},"end":{"line":73,"column":335,"offset":4736},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Advanced searching","position":{"start":{"line":75,"column":4,"offset":4741},"end":{"line":75,"column":22,"offset":4759},"indent":[]}}],"position":{"start":{"line":75,"column":1,"offset":4738},"end":{"line":75,"column":22,"offset":4759},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Next to showing all your recordings in one overview, we also give you the capabilities to search for a recording more easily. For example you can search for recordings within a specific time boundary, recordings generated by a specific Kerberos agent, recordings which are marked as important, classified recordings such as pedestrians or animals, and more.","position":{"start":{"line":77,"column":1,"offset":4761},"end":{"line":77,"column":358,"offset":5118},"indent":[]}}],"position":{"start":{"line":77,"column":1,"offset":4761},"end":{"line":77,"column":358,"offset":5118},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-search.png","alt":"cloud search","position":{"start":{"line":79,"column":1,"offset":5120},"end":{"line":79,"column":63,"offset":5182},"indent":[]}}],"position":{"start":{"line":79,"column":1,"offset":5120},"end":{"line":79,"column":63,"offset":5182},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Machine learning","position":{"start":{"line":81,"column":4,"offset":5187},"end":{"line":81,"column":20,"offset":5203},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":5184},"end":{"line":81,"column":20,"offset":5203},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"With Kerberos Cloud you will get far more than just a nice interface for finding back your recordings. When a recording is uploaded to Kerberos Cloud, we will execute all kind of algorithms. One of these algorithms is classification. This algorithm is used to classify/recognise all the objects inside your recording. Any human, vehicle or animal in the recording will be labeled.","position":{"start":{"line":83,"column":1,"offset":5205},"end":{"line":83,"column":381,"offset":5585},"indent":[]}}],"position":{"start":{"line":83,"column":1,"offset":5205},"end":{"line":83,"column":381,"offset":5585},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Next to classifying, the algorithm is also tracing the classified objects. By doing this we can label the recording with the object of interest. For example at the image below you see the traject of a pedestrian walking by (710 pixels).","position":{"start":{"line":85,"column":1,"offset":5587},"end":{"line":85,"column":237,"offset":5823},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":5587},"end":{"line":85,"column":237,"offset":5823},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-ml.png","alt":"cloud ml","position":{"start":{"line":87,"column":1,"offset":5825},"end":{"line":87,"column":55,"offset":5879},"indent":[]}}],"position":{"start":{"line":87,"column":1,"offset":5825},"end":{"line":87,"column":55,"offset":5879},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Alerts","position":{"start":{"line":89,"column":4,"offset":5884},"end":{"line":89,"column":10,"offset":5890},"indent":[]}}],"position":{"start":{"line":89,"column":1,"offset":5881},"end":{"line":89,"column":10,"offset":5890},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When a specific event occurred, a notification can be send to one or more channels. A user can compose an event by selecting one or more conditions. Once the event is triggered, a notification is sent to all the enabled channels.","position":{"start":{"line":91,"column":1,"offset":5892},"end":{"line":91,"column":230,"offset":6121},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":5892},"end":{"line":91,"column":230,"offset":6121},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Notifications","position":{"start":{"line":93,"column":5,"offset":6127},"end":{"line":93,"column":18,"offset":6140},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":6123},"end":{"line":93,"column":18,"offset":6140},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" Kerberos Cloud supports different types of notifications:","position":{"start":{"line":95,"column":1,"offset":6142},"end":{"line":95,"column":59,"offset":6200},"indent":[]}}],"position":{"start":{"line":95,"column":1,"offset":6142},"end":{"line":95,"column":59,"offset":6200},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Detections","position":{"start":{"line":97,"column":6,"offset":6207},"end":{"line":97,"column":16,"offset":6217},"indent":[]}}],"position":{"start":{"line":97,"column":4,"offset":6205},"end":{"line":97,"column":18,"offset":6219},"indent":[]}},{"type":"text","value":": send a notification if a recording was received from a specific Kerberos agent, within a time range, with a specific classification, etc.","position":{"start":{"line":97,"column":18,"offset":6219},"end":{"line":97,"column":157,"offset":6358},"indent":[]}}],"position":{"start":{"line":97,"column":4,"offset":6205},"end":{"line":97,"column":157,"offset":6358},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":6202},"end":{"line":97,"column":157,"offset":6358},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Devices","position":{"start":{"line":98,"column":6,"offset":6364},"end":{"line":98,"column":13,"offset":6371},"indent":[]}}],"position":{"start":{"line":98,"column":4,"offset":6362},"end":{"line":98,"column":15,"offset":6373},"indent":[]}},{"type":"text","value":": when one of your Kerberos agents stopped working, a notification can be send.","position":{"start":{"line":98,"column":15,"offset":6373},"end":{"line":98,"column":94,"offset":6452},"indent":[]}}],"position":{"start":{"line":98,"column":4,"offset":6362},"end":{"line":98,"column":94,"offset":6452},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":6359},"end":{"line":98,"column":94,"offset":6452},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"High upload","position":{"start":{"line":99,"column":6,"offset":6458},"end":{"line":99,"column":17,"offset":6469},"indent":[]}}],"position":{"start":{"line":99,"column":4,"offset":6456},"end":{"line":99,"column":19,"offset":6471},"indent":[]}},{"type":"text","value":": when a lot of recordings are generated within a specific period of time, a notification can be send.","position":{"start":{"line":99,"column":19,"offset":6471},"end":{"line":99,"column":121,"offset":6573},"indent":[]}}],"position":{"start":{"line":99,"column":4,"offset":6456},"end":{"line":99,"column":121,"offset":6573},"indent":[]}}],"position":{"start":{"line":99,"column":1,"offset":6453},"end":{"line":99,"column":121,"offset":6573},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":6202},"end":{"line":99,"column":121,"offset":6573},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-notifications.png","alt":"cloud notifications","position":{"start":{"line":101,"column":1,"offset":6575},"end":{"line":101,"column":77,"offset":6651},"indent":[]}}],"position":{"start":{"line":101,"column":1,"offset":6575},"end":{"line":101,"column":77,"offset":6651},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Channels","position":{"start":{"line":103,"column":5,"offset":6657},"end":{"line":103,"column":13,"offset":6665},"indent":[]}}],"position":{"start":{"line":103,"column":1,"offset":6653},"end":{"line":103,"column":13,"offset":6665},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" Kerberos Cloud supports different types of channels, towards notifications can be send:","position":{"start":{"line":105,"column":1,"offset":6667},"end":{"line":105,"column":89,"offset":6755},"indent":[]}}],"position":{"start":{"line":105,"column":1,"offset":6667},"end":{"line":105,"column":89,"offset":6755},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Browser","position":{"start":{"line":107,"column":6,"offset":6762},"end":{"line":107,"column":13,"offset":6769},"indent":[]}}],"position":{"start":{"line":107,"column":4,"offset":6760},"end":{"line":107,"column":15,"offset":6771},"indent":[]}},{"type":"text","value":": notifications inside the browser (if the used browser supports this).","position":{"start":{"line":107,"column":15,"offset":6771},"end":{"line":107,"column":86,"offset":6842},"indent":[]}}],"position":{"start":{"line":107,"column":4,"offset":6760},"end":{"line":107,"column":86,"offset":6842},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":6757},"end":{"line":107,"column":86,"offset":6842},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"E-mail","position":{"start":{"line":108,"column":6,"offset":6848},"end":{"line":108,"column":12,"offset":6854},"indent":[]}}],"position":{"start":{"line":108,"column":4,"offset":6846},"end":{"line":108,"column":14,"offset":6856},"indent":[]}},{"type":"text","value":": a personal email can be send.","position":{"start":{"line":108,"column":14,"offset":6856},"end":{"line":108,"column":45,"offset":6887},"indent":[]}}],"position":{"start":{"line":108,"column":4,"offset":6846},"end":{"line":108,"column":45,"offset":6887},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":6843},"end":{"line":108,"column":45,"offset":6887},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Slack","position":{"start":{"line":109,"column":6,"offset":6893},"end":{"line":109,"column":11,"offset":6898},"indent":[]}}],"position":{"start":{"line":109,"column":4,"offset":6891},"end":{"line":109,"column":13,"offset":6900},"indent":[]}},{"type":"text","value":": send a message to a slack channel.","position":{"start":{"line":109,"column":13,"offset":6900},"end":{"line":109,"column":49,"offset":6936},"indent":[]}}],"position":{"start":{"line":109,"column":4,"offset":6891},"end":{"line":109,"column":49,"offset":6936},"indent":[]}}],"position":{"start":{"line":109,"column":1,"offset":6888},"end":{"line":109,"column":49,"offset":6936},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Alexa","position":{"start":{"line":110,"column":6,"offset":6942},"end":{"line":110,"column":11,"offset":6947},"indent":[]}}],"position":{"start":{"line":110,"column":4,"offset":6940},"end":{"line":110,"column":13,"offset":6949},"indent":[]}},{"type":"text","value":": send a notification to Alexa skill (","position":{"start":{"line":110,"column":13,"offset":6949},"end":{"line":110,"column":51,"offset":6987},"indent":[]}},{"type":"link","title":null,"url":"https://www.amazon.com/Thomptronics-Notify-Me/dp/B07BB2FYFS","children":[{"type":"text","value":"Notify Me","position":{"start":{"line":110,"column":52,"offset":6988},"end":{"line":110,"column":61,"offset":6997},"indent":[]}}],"position":{"start":{"line":110,"column":51,"offset":6987},"end":{"line":110,"column":123,"offset":7059},"indent":[]}},{"type":"text","value":").","position":{"start":{"line":110,"column":123,"offset":7059},"end":{"line":110,"column":125,"offset":7061},"indent":[]}}],"position":{"start":{"line":110,"column":4,"offset":6940},"end":{"line":110,"column":125,"offset":7061},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":6937},"end":{"line":110,"column":125,"offset":7061},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Telegram","position":{"start":{"line":111,"column":6,"offset":7067},"end":{"line":111,"column":14,"offset":7075},"indent":[]}}],"position":{"start":{"line":111,"column":4,"offset":7065},"end":{"line":111,"column":16,"offset":7077},"indent":[]}},{"type":"text","value":": send a message to a Telegram channel.","position":{"start":{"line":111,"column":16,"offset":7077},"end":{"line":111,"column":55,"offset":7116},"indent":[]}}],"position":{"start":{"line":111,"column":4,"offset":7065},"end":{"line":111,"column":55,"offset":7116},"indent":[]}}],"position":{"start":{"line":111,"column":1,"offset":7062},"end":{"line":111,"column":55,"offset":7116},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Pushbullet","position":{"start":{"line":112,"column":6,"offset":7122},"end":{"line":112,"column":16,"offset":7132},"indent":[]}}],"position":{"start":{"line":112,"column":4,"offset":7120},"end":{"line":112,"column":18,"offset":7134},"indent":[]}},{"type":"text","value":": send a message to a Pushbullet channel.","position":{"start":{"line":112,"column":18,"offset":7134},"end":{"line":112,"column":59,"offset":7175},"indent":[]}}],"position":{"start":{"line":112,"column":4,"offset":7120},"end":{"line":112,"column":59,"offset":7175},"indent":[]}}],"position":{"start":{"line":112,"column":1,"offset":7117},"end":{"line":112,"column":59,"offset":7175},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Pushover","position":{"start":{"line":113,"column":6,"offset":7181},"end":{"line":113,"column":14,"offset":7189},"indent":[]}}],"position":{"start":{"line":113,"column":4,"offset":7179},"end":{"line":113,"column":16,"offset":7191},"indent":[]}},{"type":"text","value":": send a message to a Pushover channel.","position":{"start":{"line":113,"column":16,"offset":7191},"end":{"line":113,"column":55,"offset":7230},"indent":[]}}],"position":{"start":{"line":113,"column":4,"offset":7179},"end":{"line":113,"column":55,"offset":7230},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":7176},"end":{"line":113,"column":55,"offset":7230},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Webhook","position":{"start":{"line":114,"column":6,"offset":7236},"end":{"line":114,"column":13,"offset":7243},"indent":[]}}],"position":{"start":{"line":114,"column":4,"offset":7234},"end":{"line":114,"column":15,"offset":7245},"indent":[]}},{"type":"text","value":": trigger a webhook (POST).","position":{"start":{"line":114,"column":15,"offset":7245},"end":{"line":114,"column":42,"offset":7272},"indent":[]}}],"position":{"start":{"line":114,"column":4,"offset":7234},"end":{"line":114,"column":42,"offset":7272},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":7231},"end":{"line":114,"column":42,"offset":7272},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"IFTTT","position":{"start":{"line":115,"column":6,"offset":7278},"end":{"line":115,"column":11,"offset":7283},"indent":[]}}],"position":{"start":{"line":115,"column":4,"offset":7276},"end":{"line":115,"column":13,"offset":7285},"indent":[]}},{"type":"text","value":": send a message to IFTTT.","position":{"start":{"line":115,"column":13,"offset":7285},"end":{"line":115,"column":39,"offset":7311},"indent":[]}}],"position":{"start":{"line":115,"column":4,"offset":7276},"end":{"line":115,"column":39,"offset":7311},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":7273},"end":{"line":115,"column":39,"offset":7311},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"SMS","position":{"start":{"line":116,"column":6,"offset":7317},"end":{"line":116,"column":9,"offset":7320},"indent":[]}}],"position":{"start":{"line":116,"column":4,"offset":7315},"end":{"line":116,"column":11,"offset":7322},"indent":[]}},{"type":"text","value":": send a text message to a mobile number.","position":{"start":{"line":116,"column":11,"offset":7322},"end":{"line":116,"column":52,"offset":7363},"indent":[]}}],"position":{"start":{"line":116,"column":4,"offset":7315},"end":{"line":116,"column":52,"offset":7363},"indent":[]}}],"position":{"start":{"line":116,"column":1,"offset":7312},"end":{"line":116,"column":52,"offset":7363},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":6757},"end":{"line":116,"column":52,"offset":7363},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-channels.png","alt":"cloud notifications","position":{"start":{"line":118,"column":1,"offset":7365},"end":{"line":118,"column":72,"offset":7436},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":7365},"end":{"line":118,"column":72,"offset":7436},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Live streaming","position":{"start":{"line":120,"column":4,"offset":7441},"end":{"line":120,"column":18,"offset":7455},"indent":[]}}],"position":{"start":{"line":120,"column":1,"offset":7438},"end":{"line":120,"column":18,"offset":7455},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Cloud allows you to live stream from your Kerberos agents to your account. A low resolution livestream (this will be improved in future), will allow you see what is happening in front of your surveillance camera in real-time.","position":{"start":{"line":122,"column":1,"offset":7457},"end":{"line":122,"column":235,"offset":7691},"indent":[]}}],"position":{"start":{"line":122,"column":1,"offset":7457},"end":{"line":122,"column":235,"offset":7691},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-livestream.png","alt":"cloud livestream","position":{"start":{"line":124,"column":1,"offset":7693},"end":{"line":124,"column":71,"offset":7763},"indent":[]}}],"position":{"start":{"line":124,"column":1,"offset":7693},"end":{"line":124,"column":71,"offset":7763},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Accounts","position":{"start":{"line":126,"column":4,"offset":7768},"end":{"line":126,"column":12,"offset":7776},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":7765},"end":{"line":126,"column":12,"offset":7776},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It's possible to create multiple accounts (also called subaccounts) within your main account. Their are two different roles:","position":{"start":{"line":128,"column":1,"offset":7778},"end":{"line":128,"column":125,"offset":7902},"indent":[]}}],"position":{"start":{"line":128,"column":1,"offset":7778},"end":{"line":128,"column":125,"offset":7902},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Guest: will only see your media recordings. A guest cannot modify, delete or create something.","position":{"start":{"line":130,"column":3,"offset":7906},"end":{"line":130,"column":97,"offset":8000},"indent":[]}}],"position":{"start":{"line":130,"column":3,"offset":7906},"end":{"line":130,"column":97,"offset":8000},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":7904},"end":{"line":130,"column":97,"offset":8000},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Editor: has full access, same permissions as the main account.","position":{"start":{"line":131,"column":3,"offset":8003},"end":{"line":131,"column":65,"offset":8065},"indent":[]}}],"position":{"start":{"line":131,"column":3,"offset":8003},"end":{"line":131,"column":65,"offset":8065},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":8001},"end":{"line":131,"column":65,"offset":8065},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":7904},"end":{"line":131,"column":65,"offset":8065},"indent":[1]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-accounts.png","alt":"cloud accounts","position":{"start":{"line":133,"column":1,"offset":8067},"end":{"line":133,"column":67,"offset":8133},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":8067},"end":{"line":133,"column":67,"offset":8133},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Logging","position":{"start":{"line":135,"column":4,"offset":8138},"end":{"line":135,"column":11,"offset":8145},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":8135},"end":{"line":135,"column":11,"offset":8145},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"All algorithms or functions which are applied to your recording on the Kerberos Cloud platform, are shown on the logging page. You can use this to debug.","position":{"start":{"line":137,"column":1,"offset":8147},"end":{"line":137,"column":154,"offset":8300},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":8147},"end":{"line":137,"column":154,"offset":8300},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-logging.png","alt":"cloud logging","position":{"start":{"line":139,"column":1,"offset":8302},"end":{"line":139,"column":65,"offset":8366},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":8302},"end":{"line":139,"column":65,"offset":8366},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":142,"column":1,"offset":8369},"end":{"line":142,"column":31,"offset":8399},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":142,"column":31,"offset":8399}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Cloud`}

\n

{`When installing a Kerberos agent inside your local network, it's possible to review your activity by using the agent's web interface. By nature, you will not be able to access the web interface from the cloud (outside your local network). On top of that, the Kerberos agent doesn't come with a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera.`}

\n

{`To simplify and resolve all of these challenges, Kerberos Cloud was developed.`}

\n
\n

{`Kerberos Cloud`}{` is a cloud solution which allows you to have a single overview of all the media recordings generated by your surveillance cameras. It's not a solution for processing your surveillance cameras in the cloud. For processing of your surveillance cameras, a Kerberos agent is used.`}

\n
\n

{`A brief list of the key features of Kerberos Cloud are:`}

\n
    \n
  • {`Secured storage`}
  • \n
  • {`Consolidated overview`}
  • \n
  • {`Advanced searching`}
  • \n
  • {`Machine learning`}
  • \n
  • {`Alerts`}
  • \n
  • {`Live streaming`}
  • \n
  • {`Accounts`}
  • \n
  • {`Logging`}
  • \n
\n
\n

{`Checkout `}{`the demo environment`}{` to see and feel the Kerberos Cloud solution yourself.`}

\n
\n

{`Architecture`}

\n

{`A simplified architecture is found below. In this architecture the Kerberos agents are installed on-premise, next to the surveillance cameras. Once one of the agents recorded something it will send the recording to our AWS S3 bucket, using the credentials you've defined inside the agent.`}

\n

{`As soon as the recording is succesfully received several engines will be executed, that will further process the recording and extract metadata from it (classification, origin of the surveillance camera, etc). A lot of processing is happening behind the scenes.`}

\n

{`By using a browser you can navigate to Kerberos Cloud, and review all the recordings made by the Kerberos agents on-premise. On top of that you will receive more context about the recordings, get notifications, view a livestream and much more.`}

\n

\"cloud\"

\n

{`Public or Private cloud (Bring Your Own Cloud)`}

\n

{`We run Kerberos Cloud in the public cloud on different services such as AWS, GCP and Scaleway. However if needed we can host our entire solution within your Private cloud (create a support ticket).`}

\n

{`Secured storage`}

\n

{`Kerberos Cloud allows you to store your data in the cloud, and make it available using a secured web interface. This is how it works.`}

\n

{`Once you've installed a Kerberos agent, and created an account on `}{`Kerberos Cloud`}{`, you will be able to connect both systems together. By entering credentials received from Kerberos Cloud, into your Kerberos agent, your media recordings will be send to our cloud storage.`}

\n
\n

{`You can link one or more Kerberos agents to your Kerberos Cloud account.`}

\n
\n

\"cloud

\n

{`After linking your media recorded by a Kerberos agent will be send to a secure cloud storage, AWS S3 (multiple regions are supported). By default our own S3 buckets are used, however we can negotiate to have your own S3 bucket (open a support ticket).`}

\n

\"cloud\"

\n

{`Once stored your media recordings will be processed by different functions and algorithms to send alerts, apply machine learning and much more.`}

\n
\n

{`Kerberos Cloud is much more than a storage service, you get intelligent capabilities as well. Read on to discover more.`}

\n
\n

{`Consolidated overview`}

\n

{`Kerberos Cloud will group your media recordings (coming from one or more Kerberos agents) into time bundles. We do this to simplify the searching of a specific event. Less data is shown at once, and when needed you can drill down a level deeper to see more details.`}

\n

\"cloud

\n

{`In a sneak peek you will see how many media recordings were generated during a certain time period, and which Kerberos agents were involved. For example, this might give you an indication of a particular event (more about in the machine learning section).`}

\n

{`Security`}

\n

{`Once you're inside your Kerberos Cloud account, you will see all the available media recordings of your Kerberos agents in a single interface. So how does this work?`}

\n

{`When you open Kerberos Cloud we will generate temporary and private links for every media recording within your account. This link includes a random and unique hash, and is only available for a couple of minutes. So this means that your recording cannot be shared afterwards, or the risk someone else accessing that link is minimised.`}

\n

{`Advanced searching`}

\n

{`Next to showing all your recordings in one overview, we also give you the capabilities to search for a recording more easily. For example you can search for recordings within a specific time boundary, recordings generated by a specific Kerberos agent, recordings which are marked as important, classified recordings such as pedestrians or animals, and more.`}

\n

\"cloud

\n

{`Machine learning`}

\n

{`With Kerberos Cloud you will get far more than just a nice interface for finding back your recordings. When a recording is uploaded to Kerberos Cloud, we will execute all kind of algorithms. One of these algorithms is classification. This algorithm is used to classify/recognise all the objects inside your recording. Any human, vehicle or animal in the recording will be labeled.`}

\n

{`Next to classifying, the algorithm is also tracing the classified objects. By doing this we can label the recording with the object of interest. For example at the image below you see the traject of a pedestrian walking by (710 pixels).`}

\n

\"cloud

\n

{`Alerts`}

\n

{`When a specific event occurred, a notification can be send to one or more channels. A user can compose an event by selecting one or more conditions. Once the event is triggered, a notification is sent to all the enabled channels.`}

\n

{`Notifications`}

\n

{` Kerberos Cloud supports different types of notifications:`}

\n
    \n
  • {`Detections`}{`: send a notification if a recording was received from a specific Kerberos agent, within a time range, with a specific classification, etc.`}
  • \n
  • {`Devices`}{`: when one of your Kerberos agents stopped working, a notification can be send.`}
  • \n
  • {`High upload`}{`: when a lot of recordings are generated within a specific period of time, a notification can be send.`}
  • \n
\n

\"cloud

\n

{`Channels`}

\n

{` Kerberos Cloud supports different types of channels, towards notifications can be send:`}

\n
    \n
  • {`Browser`}{`: notifications inside the browser (if the used browser supports this).`}
  • \n
  • {`E-mail`}{`: a personal email can be send.`}
  • \n
  • {`Slack`}{`: send a message to a slack channel.`}
  • \n
  • {`Alexa`}{`: send a notification to Alexa skill (`}{`Notify Me`}{`).`}
  • \n
  • {`Telegram`}{`: send a message to a Telegram channel.`}
  • \n
  • {`Pushbullet`}{`: send a message to a Pushbullet channel.`}
  • \n
  • {`Pushover`}{`: send a message to a Pushover channel.`}
  • \n
  • {`Webhook`}{`: trigger a webhook (POST).`}
  • \n
  • {`IFTTT`}{`: send a message to IFTTT.`}
  • \n
  • {`SMS`}{`: send a text message to a mobile number.`}
  • \n
\n

\"cloud

\n

{`Live streaming`}

\n

{`Kerberos Cloud allows you to live stream from your Kerberos agents to your account. A low resolution livestream (this will be improved in future), will allow you see what is happening in front of your surveillance camera in real-time.`}

\n

\"cloud

\n

{`Accounts`}

\n

{`It's possible to create multiple accounts (also called subaccounts) within your main account. Their are two different roles:`}

\n
    \n
  • {`Guest: will only see your media recordings. A guest cannot modify, delete or create something.`}
  • \n
  • {`Editor: has full access, same permissions as the main account.`}
  • \n
\n

\"cloud

\n

{`Logging`}

\n

{`All algorithms or functions which are applied to your recording on the Kerberos Cloud platform, are shown on the logging page. You can use this to debug.`}

\n

\"cloud

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760428000,"key":"gatsby-plugin-mdx-entire-payload-1014fe6e16c6f7a87574e8b769397d41-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Cloud","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":8,"offset":166},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":8,"offset":166},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When installing a Kerberos agent inside your local network, it's possible to review your activity by using the agent's web interface. By nature, you will not be able to access the web interface from the cloud (outside your local network). On top of that, the Kerberos agent doesn't come with a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera.","position":{"start":{"line":10,"column":1,"offset":168},"end":{"line":10,"column":424,"offset":591},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":168},"end":{"line":10,"column":424,"offset":591},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To simplify and resolve all of these challenges, Kerberos Cloud was developed.","position":{"start":{"line":12,"column":1,"offset":593},"end":{"line":12,"column":79,"offset":671},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":593},"end":{"line":12,"column":79,"offset":671},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://cloud.kerberos.io","children":[{"type":"text","value":"Kerberos Cloud","position":{"start":{"line":14,"column":4,"offset":676},"end":{"line":14,"column":18,"offset":690},"indent":[]}}],"position":{"start":{"line":14,"column":3,"offset":675},"end":{"line":14,"column":46,"offset":718},"indent":[]}},{"type":"text","value":" is a cloud solution which allows you to have a single overview of all the media recordings generated by your surveillance cameras. It's not a solution for processing your surveillance cameras in the cloud. For processing of your surveillance cameras, a Kerberos agent is used.","position":{"start":{"line":14,"column":46,"offset":718},"end":{"line":14,"column":323,"offset":995},"indent":[]}}],"position":{"start":{"line":14,"column":3,"offset":675},"end":{"line":14,"column":323,"offset":995},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":673},"end":{"line":14,"column":323,"offset":995},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A brief list of the key features of Kerberos Cloud are:","position":{"start":{"line":16,"column":1,"offset":997},"end":{"line":16,"column":56,"offset":1052},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":997},"end":{"line":16,"column":56,"offset":1052},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Secured storage","position":{"start":{"line":18,"column":3,"offset":1056},"end":{"line":18,"column":18,"offset":1071},"indent":[]}}],"position":{"start":{"line":18,"column":3,"offset":1056},"end":{"line":18,"column":18,"offset":1071},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1054},"end":{"line":18,"column":18,"offset":1071},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Consolidated overview","position":{"start":{"line":19,"column":3,"offset":1074},"end":{"line":19,"column":24,"offset":1095},"indent":[]}}],"position":{"start":{"line":19,"column":3,"offset":1074},"end":{"line":19,"column":24,"offset":1095},"indent":[]}}],"position":{"start":{"line":19,"column":1,"offset":1072},"end":{"line":19,"column":24,"offset":1095},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Advanced searching","position":{"start":{"line":20,"column":3,"offset":1098},"end":{"line":20,"column":21,"offset":1116},"indent":[]}}],"position":{"start":{"line":20,"column":3,"offset":1098},"end":{"line":20,"column":21,"offset":1116},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1096},"end":{"line":20,"column":21,"offset":1116},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Machine learning","position":{"start":{"line":21,"column":3,"offset":1119},"end":{"line":21,"column":19,"offset":1135},"indent":[]}}],"position":{"start":{"line":21,"column":3,"offset":1119},"end":{"line":21,"column":19,"offset":1135},"indent":[]}}],"position":{"start":{"line":21,"column":1,"offset":1117},"end":{"line":21,"column":19,"offset":1135},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Alerts","position":{"start":{"line":22,"column":3,"offset":1138},"end":{"line":22,"column":9,"offset":1144},"indent":[]}}],"position":{"start":{"line":22,"column":3,"offset":1138},"end":{"line":22,"column":9,"offset":1144},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1136},"end":{"line":22,"column":9,"offset":1144},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Live streaming","position":{"start":{"line":23,"column":3,"offset":1147},"end":{"line":23,"column":17,"offset":1161},"indent":[]}}],"position":{"start":{"line":23,"column":3,"offset":1147},"end":{"line":23,"column":17,"offset":1161},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":1145},"end":{"line":23,"column":17,"offset":1161},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Accounts","position":{"start":{"line":24,"column":3,"offset":1164},"end":{"line":24,"column":11,"offset":1172},"indent":[]}}],"position":{"start":{"line":24,"column":3,"offset":1164},"end":{"line":24,"column":11,"offset":1172},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1162},"end":{"line":24,"column":11,"offset":1172},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Logging","position":{"start":{"line":25,"column":3,"offset":1175},"end":{"line":25,"column":10,"offset":1182},"indent":[]}}],"position":{"start":{"line":25,"column":3,"offset":1175},"end":{"line":25,"column":10,"offset":1182},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":1173},"end":{"line":25,"column":10,"offset":1182},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1054},"end":{"line":25,"column":10,"offset":1182},"indent":[1,1,1,1,1,1,1]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Checkout ","position":{"start":{"line":27,"column":3,"offset":1186},"end":{"line":27,"column":12,"offset":1195},"indent":[]}},{"type":"link","title":null,"url":"https://app-demo.kerberos.io","children":[{"type":"text","value":"the demo environment","position":{"start":{"line":27,"column":13,"offset":1196},"end":{"line":27,"column":33,"offset":1216},"indent":[]}}],"position":{"start":{"line":27,"column":12,"offset":1195},"end":{"line":27,"column":64,"offset":1247},"indent":[]}},{"type":"text","value":" to see and feel the Kerberos Cloud solution yourself.","position":{"start":{"line":27,"column":64,"offset":1247},"end":{"line":27,"column":118,"offset":1301},"indent":[]}}],"position":{"start":{"line":27,"column":3,"offset":1186},"end":{"line":27,"column":118,"offset":1301},"indent":[]}}],"position":{"start":{"line":27,"column":1,"offset":1184},"end":{"line":27,"column":118,"offset":1301},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Architecture","position":{"start":{"line":29,"column":4,"offset":1306},"end":{"line":29,"column":16,"offset":1318},"indent":[]}}],"position":{"start":{"line":29,"column":1,"offset":1303},"end":{"line":29,"column":16,"offset":1318},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A simplified architecture is found below. In this architecture the Kerberos agents are installed on-premise, next to the surveillance cameras. Once one of the agents recorded something it will send the recording to our AWS S3 bucket, using the credentials you've defined inside the agent.","position":{"start":{"line":31,"column":1,"offset":1320},"end":{"line":31,"column":289,"offset":1608},"indent":[]}}],"position":{"start":{"line":31,"column":1,"offset":1320},"end":{"line":31,"column":289,"offset":1608},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"As soon as the recording is succesfully received several engines will be executed, that will further process the recording and extract metadata from it (classification, origin of the surveillance camera, etc). A lot of processing is happening behind the scenes.","position":{"start":{"line":33,"column":1,"offset":1610},"end":{"line":33,"column":262,"offset":1871},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":1610},"end":{"line":33,"column":262,"offset":1871},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By using a browser you can navigate to Kerberos Cloud, and review all the recordings made by the Kerberos agents on-premise. On top of that you will receive more context about the recordings, get notifications, view a livestream and much more.","position":{"start":{"line":35,"column":1,"offset":1873},"end":{"line":35,"column":244,"offset":2116},"indent":[]}}],"position":{"start":{"line":35,"column":1,"offset":1873},"end":{"line":35,"column":244,"offset":2116},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-architecture.png","alt":"cloud","position":{"start":{"line":37,"column":1,"offset":2118},"end":{"line":37,"column":56,"offset":2173},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":2118},"end":{"line":37,"column":56,"offset":2173},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Public or Private cloud (Bring Your Own Cloud)","position":{"start":{"line":39,"column":5,"offset":2179},"end":{"line":39,"column":51,"offset":2225},"indent":[]}}],"position":{"start":{"line":39,"column":1,"offset":2175},"end":{"line":39,"column":51,"offset":2225},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"We run Kerberos Cloud in the public cloud on different services such as AWS, GCP and Scaleway. However if needed we can host our entire solution within your Private cloud (create a support ticket).","position":{"start":{"line":41,"column":1,"offset":2227},"end":{"line":41,"column":198,"offset":2424},"indent":[]}}],"position":{"start":{"line":41,"column":1,"offset":2227},"end":{"line":41,"column":198,"offset":2424},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Secured storage","position":{"start":{"line":43,"column":4,"offset":2429},"end":{"line":43,"column":19,"offset":2444},"indent":[]}}],"position":{"start":{"line":43,"column":1,"offset":2426},"end":{"line":43,"column":19,"offset":2444},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Cloud allows you to store your data in the cloud, and make it available using a secured web interface. This is how it works.","position":{"start":{"line":45,"column":1,"offset":2446},"end":{"line":45,"column":134,"offset":2579},"indent":[]}}],"position":{"start":{"line":45,"column":1,"offset":2446},"end":{"line":45,"column":134,"offset":2579},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you've installed a Kerberos agent, and created an account on ","position":{"start":{"line":47,"column":1,"offset":2581},"end":{"line":47,"column":67,"offset":2647},"indent":[]}},{"type":"link","title":null,"url":"https://cloud.kerberos.io","children":[{"type":"text","value":"Kerberos Cloud","position":{"start":{"line":47,"column":68,"offset":2648},"end":{"line":47,"column":82,"offset":2662},"indent":[]}}],"position":{"start":{"line":47,"column":67,"offset":2647},"end":{"line":47,"column":110,"offset":2690},"indent":[]}},{"type":"text","value":", you will be able to connect both systems together. By entering credentials received from Kerberos Cloud, into your Kerberos agent, your media recordings will be send to our cloud storage.","position":{"start":{"line":47,"column":110,"offset":2690},"end":{"line":47,"column":299,"offset":2879},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":2581},"end":{"line":47,"column":299,"offset":2879},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"You can link one or more Kerberos agents to your Kerberos Cloud account.","position":{"start":{"line":49,"column":3,"offset":2883},"end":{"line":49,"column":75,"offset":2955},"indent":[]}}],"position":{"start":{"line":49,"column":3,"offset":2883},"end":{"line":49,"column":75,"offset":2955},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":2881},"end":{"line":49,"column":75,"offset":2955},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-linking.png","alt":"cloud linking","position":{"start":{"line":51,"column":1,"offset":2957},"end":{"line":51,"column":65,"offset":3021},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":2957},"end":{"line":51,"column":65,"offset":3021},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"After linking your media recorded by a Kerberos agent will be send to a secure cloud storage, AWS S3 (multiple regions are supported). By default our own S3 buckets are used, however we can negotiate to have your own S3 bucket (open a support ticket).","position":{"start":{"line":53,"column":1,"offset":3023},"end":{"line":53,"column":252,"offset":3274},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":3023},"end":{"line":53,"column":252,"offset":3274},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-network-onprem.png","alt":"cloud","position":{"start":{"line":55,"column":1,"offset":3276},"end":{"line":55,"column":58,"offset":3333},"indent":[]}}],"position":{"start":{"line":55,"column":1,"offset":3276},"end":{"line":55,"column":58,"offset":3333},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once stored your media recordings will be processed by different functions and algorithms to send alerts, apply machine learning and much more.","position":{"start":{"line":57,"column":1,"offset":3335},"end":{"line":57,"column":144,"offset":3478},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":3335},"end":{"line":57,"column":144,"offset":3478},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Kerberos Cloud is much more than a storage service, you get intelligent capabilities as well. Read on to discover more.","position":{"start":{"line":59,"column":3,"offset":3482},"end":{"line":59,"column":122,"offset":3601},"indent":[]}}],"position":{"start":{"line":59,"column":3,"offset":3482},"end":{"line":59,"column":122,"offset":3601},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":3480},"end":{"line":59,"column":122,"offset":3601},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Consolidated overview","position":{"start":{"line":61,"column":4,"offset":3606},"end":{"line":61,"column":25,"offset":3627},"indent":[]}}],"position":{"start":{"line":61,"column":1,"offset":3603},"end":{"line":61,"column":25,"offset":3627},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Cloud will group your media recordings (coming from one or more Kerberos agents) into time bundles. We do this to simplify the searching of a specific event. Less data is shown at once, and when needed you can drill down a level deeper to see more details.","position":{"start":{"line":63,"column":1,"offset":3629},"end":{"line":63,"column":266,"offset":3894},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":3629},"end":{"line":63,"column":266,"offset":3894},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-overview.png","alt":"cloud overview","position":{"start":{"line":65,"column":1,"offset":3896},"end":{"line":65,"column":67,"offset":3962},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":3896},"end":{"line":65,"column":67,"offset":3962},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"In a sneak peek you will see how many media recordings were generated during a certain time period, and which Kerberos agents were involved. For example, this might give you an indication of a particular event (more about in the machine learning section).","position":{"start":{"line":67,"column":1,"offset":3964},"end":{"line":67,"column":256,"offset":4219},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":3964},"end":{"line":67,"column":256,"offset":4219},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Security","position":{"start":{"line":69,"column":5,"offset":4225},"end":{"line":69,"column":13,"offset":4233},"indent":[]}}],"position":{"start":{"line":69,"column":1,"offset":4221},"end":{"line":69,"column":13,"offset":4233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you're inside your Kerberos Cloud account, you will see all the available media recordings of your Kerberos agents in a single interface. So how does this work?","position":{"start":{"line":71,"column":1,"offset":4235},"end":{"line":71,"column":166,"offset":4400},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":4235},"end":{"line":71,"column":166,"offset":4400},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you open Kerberos Cloud we will generate temporary and private links for every media recording within your account. This link includes a random and unique hash, and is only available for a couple of minutes. So this means that your recording cannot be shared afterwards, or the risk someone else accessing that link is minimised.","position":{"start":{"line":73,"column":1,"offset":4402},"end":{"line":73,"column":335,"offset":4736},"indent":[]}}],"position":{"start":{"line":73,"column":1,"offset":4402},"end":{"line":73,"column":335,"offset":4736},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Advanced searching","position":{"start":{"line":75,"column":4,"offset":4741},"end":{"line":75,"column":22,"offset":4759},"indent":[]}}],"position":{"start":{"line":75,"column":1,"offset":4738},"end":{"line":75,"column":22,"offset":4759},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Next to showing all your recordings in one overview, we also give you the capabilities to search for a recording more easily. For example you can search for recordings within a specific time boundary, recordings generated by a specific Kerberos agent, recordings which are marked as important, classified recordings such as pedestrians or animals, and more.","position":{"start":{"line":77,"column":1,"offset":4761},"end":{"line":77,"column":358,"offset":5118},"indent":[]}}],"position":{"start":{"line":77,"column":1,"offset":4761},"end":{"line":77,"column":358,"offset":5118},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-search.png","alt":"cloud search","position":{"start":{"line":79,"column":1,"offset":5120},"end":{"line":79,"column":63,"offset":5182},"indent":[]}}],"position":{"start":{"line":79,"column":1,"offset":5120},"end":{"line":79,"column":63,"offset":5182},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Machine learning","position":{"start":{"line":81,"column":4,"offset":5187},"end":{"line":81,"column":20,"offset":5203},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":5184},"end":{"line":81,"column":20,"offset":5203},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"With Kerberos Cloud you will get far more than just a nice interface for finding back your recordings. When a recording is uploaded to Kerberos Cloud, we will execute all kind of algorithms. One of these algorithms is classification. This algorithm is used to classify/recognise all the objects inside your recording. Any human, vehicle or animal in the recording will be labeled.","position":{"start":{"line":83,"column":1,"offset":5205},"end":{"line":83,"column":381,"offset":5585},"indent":[]}}],"position":{"start":{"line":83,"column":1,"offset":5205},"end":{"line":83,"column":381,"offset":5585},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Next to classifying, the algorithm is also tracing the classified objects. By doing this we can label the recording with the object of interest. For example at the image below you see the traject of a pedestrian walking by (710 pixels).","position":{"start":{"line":85,"column":1,"offset":5587},"end":{"line":85,"column":237,"offset":5823},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":5587},"end":{"line":85,"column":237,"offset":5823},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-ml.png","alt":"cloud ml","position":{"start":{"line":87,"column":1,"offset":5825},"end":{"line":87,"column":55,"offset":5879},"indent":[]}}],"position":{"start":{"line":87,"column":1,"offset":5825},"end":{"line":87,"column":55,"offset":5879},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Alerts","position":{"start":{"line":89,"column":4,"offset":5884},"end":{"line":89,"column":10,"offset":5890},"indent":[]}}],"position":{"start":{"line":89,"column":1,"offset":5881},"end":{"line":89,"column":10,"offset":5890},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When a specific event occurred, a notification can be send to one or more channels. A user can compose an event by selecting one or more conditions. Once the event is triggered, a notification is sent to all the enabled channels.","position":{"start":{"line":91,"column":1,"offset":5892},"end":{"line":91,"column":230,"offset":6121},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":5892},"end":{"line":91,"column":230,"offset":6121},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Notifications","position":{"start":{"line":93,"column":5,"offset":6127},"end":{"line":93,"column":18,"offset":6140},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":6123},"end":{"line":93,"column":18,"offset":6140},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" Kerberos Cloud supports different types of notifications:","position":{"start":{"line":95,"column":1,"offset":6142},"end":{"line":95,"column":59,"offset":6200},"indent":[]}}],"position":{"start":{"line":95,"column":1,"offset":6142},"end":{"line":95,"column":59,"offset":6200},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Detections","position":{"start":{"line":97,"column":6,"offset":6207},"end":{"line":97,"column":16,"offset":6217},"indent":[]}}],"position":{"start":{"line":97,"column":4,"offset":6205},"end":{"line":97,"column":18,"offset":6219},"indent":[]}},{"type":"text","value":": send a notification if a recording was received from a specific Kerberos agent, within a time range, with a specific classification, etc.","position":{"start":{"line":97,"column":18,"offset":6219},"end":{"line":97,"column":157,"offset":6358},"indent":[]}}],"position":{"start":{"line":97,"column":4,"offset":6205},"end":{"line":97,"column":157,"offset":6358},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":6202},"end":{"line":97,"column":157,"offset":6358},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Devices","position":{"start":{"line":98,"column":6,"offset":6364},"end":{"line":98,"column":13,"offset":6371},"indent":[]}}],"position":{"start":{"line":98,"column":4,"offset":6362},"end":{"line":98,"column":15,"offset":6373},"indent":[]}},{"type":"text","value":": when one of your Kerberos agents stopped working, a notification can be send.","position":{"start":{"line":98,"column":15,"offset":6373},"end":{"line":98,"column":94,"offset":6452},"indent":[]}}],"position":{"start":{"line":98,"column":4,"offset":6362},"end":{"line":98,"column":94,"offset":6452},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":6359},"end":{"line":98,"column":94,"offset":6452},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"High upload","position":{"start":{"line":99,"column":6,"offset":6458},"end":{"line":99,"column":17,"offset":6469},"indent":[]}}],"position":{"start":{"line":99,"column":4,"offset":6456},"end":{"line":99,"column":19,"offset":6471},"indent":[]}},{"type":"text","value":": when a lot of recordings are generated within a specific period of time, a notification can be send.","position":{"start":{"line":99,"column":19,"offset":6471},"end":{"line":99,"column":121,"offset":6573},"indent":[]}}],"position":{"start":{"line":99,"column":4,"offset":6456},"end":{"line":99,"column":121,"offset":6573},"indent":[]}}],"position":{"start":{"line":99,"column":1,"offset":6453},"end":{"line":99,"column":121,"offset":6573},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":6202},"end":{"line":99,"column":121,"offset":6573},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-notifications.png","alt":"cloud notifications","position":{"start":{"line":101,"column":1,"offset":6575},"end":{"line":101,"column":77,"offset":6651},"indent":[]}}],"position":{"start":{"line":101,"column":1,"offset":6575},"end":{"line":101,"column":77,"offset":6651},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Channels","position":{"start":{"line":103,"column":5,"offset":6657},"end":{"line":103,"column":13,"offset":6665},"indent":[]}}],"position":{"start":{"line":103,"column":1,"offset":6653},"end":{"line":103,"column":13,"offset":6665},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" Kerberos Cloud supports different types of channels, towards notifications can be send:","position":{"start":{"line":105,"column":1,"offset":6667},"end":{"line":105,"column":89,"offset":6755},"indent":[]}}],"position":{"start":{"line":105,"column":1,"offset":6667},"end":{"line":105,"column":89,"offset":6755},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Browser","position":{"start":{"line":107,"column":6,"offset":6762},"end":{"line":107,"column":13,"offset":6769},"indent":[]}}],"position":{"start":{"line":107,"column":4,"offset":6760},"end":{"line":107,"column":15,"offset":6771},"indent":[]}},{"type":"text","value":": notifications inside the browser (if the used browser supports this).","position":{"start":{"line":107,"column":15,"offset":6771},"end":{"line":107,"column":86,"offset":6842},"indent":[]}}],"position":{"start":{"line":107,"column":4,"offset":6760},"end":{"line":107,"column":86,"offset":6842},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":6757},"end":{"line":107,"column":86,"offset":6842},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"E-mail","position":{"start":{"line":108,"column":6,"offset":6848},"end":{"line":108,"column":12,"offset":6854},"indent":[]}}],"position":{"start":{"line":108,"column":4,"offset":6846},"end":{"line":108,"column":14,"offset":6856},"indent":[]}},{"type":"text","value":": a personal email can be send.","position":{"start":{"line":108,"column":14,"offset":6856},"end":{"line":108,"column":45,"offset":6887},"indent":[]}}],"position":{"start":{"line":108,"column":4,"offset":6846},"end":{"line":108,"column":45,"offset":6887},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":6843},"end":{"line":108,"column":45,"offset":6887},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Slack","position":{"start":{"line":109,"column":6,"offset":6893},"end":{"line":109,"column":11,"offset":6898},"indent":[]}}],"position":{"start":{"line":109,"column":4,"offset":6891},"end":{"line":109,"column":13,"offset":6900},"indent":[]}},{"type":"text","value":": send a message to a slack channel.","position":{"start":{"line":109,"column":13,"offset":6900},"end":{"line":109,"column":49,"offset":6936},"indent":[]}}],"position":{"start":{"line":109,"column":4,"offset":6891},"end":{"line":109,"column":49,"offset":6936},"indent":[]}}],"position":{"start":{"line":109,"column":1,"offset":6888},"end":{"line":109,"column":49,"offset":6936},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Alexa","position":{"start":{"line":110,"column":6,"offset":6942},"end":{"line":110,"column":11,"offset":6947},"indent":[]}}],"position":{"start":{"line":110,"column":4,"offset":6940},"end":{"line":110,"column":13,"offset":6949},"indent":[]}},{"type":"text","value":": send a notification to Alexa skill (","position":{"start":{"line":110,"column":13,"offset":6949},"end":{"line":110,"column":51,"offset":6987},"indent":[]}},{"type":"link","title":null,"url":"https://www.amazon.com/Thomptronics-Notify-Me/dp/B07BB2FYFS","children":[{"type":"text","value":"Notify Me","position":{"start":{"line":110,"column":52,"offset":6988},"end":{"line":110,"column":61,"offset":6997},"indent":[]}}],"position":{"start":{"line":110,"column":51,"offset":6987},"end":{"line":110,"column":123,"offset":7059},"indent":[]}},{"type":"text","value":").","position":{"start":{"line":110,"column":123,"offset":7059},"end":{"line":110,"column":125,"offset":7061},"indent":[]}}],"position":{"start":{"line":110,"column":4,"offset":6940},"end":{"line":110,"column":125,"offset":7061},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":6937},"end":{"line":110,"column":125,"offset":7061},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Telegram","position":{"start":{"line":111,"column":6,"offset":7067},"end":{"line":111,"column":14,"offset":7075},"indent":[]}}],"position":{"start":{"line":111,"column":4,"offset":7065},"end":{"line":111,"column":16,"offset":7077},"indent":[]}},{"type":"text","value":": send a message to a Telegram channel.","position":{"start":{"line":111,"column":16,"offset":7077},"end":{"line":111,"column":55,"offset":7116},"indent":[]}}],"position":{"start":{"line":111,"column":4,"offset":7065},"end":{"line":111,"column":55,"offset":7116},"indent":[]}}],"position":{"start":{"line":111,"column":1,"offset":7062},"end":{"line":111,"column":55,"offset":7116},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Pushbullet","position":{"start":{"line":112,"column":6,"offset":7122},"end":{"line":112,"column":16,"offset":7132},"indent":[]}}],"position":{"start":{"line":112,"column":4,"offset":7120},"end":{"line":112,"column":18,"offset":7134},"indent":[]}},{"type":"text","value":": send a message to a Pushbullet channel.","position":{"start":{"line":112,"column":18,"offset":7134},"end":{"line":112,"column":59,"offset":7175},"indent":[]}}],"position":{"start":{"line":112,"column":4,"offset":7120},"end":{"line":112,"column":59,"offset":7175},"indent":[]}}],"position":{"start":{"line":112,"column":1,"offset":7117},"end":{"line":112,"column":59,"offset":7175},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Pushover","position":{"start":{"line":113,"column":6,"offset":7181},"end":{"line":113,"column":14,"offset":7189},"indent":[]}}],"position":{"start":{"line":113,"column":4,"offset":7179},"end":{"line":113,"column":16,"offset":7191},"indent":[]}},{"type":"text","value":": send a message to a Pushover channel.","position":{"start":{"line":113,"column":16,"offset":7191},"end":{"line":113,"column":55,"offset":7230},"indent":[]}}],"position":{"start":{"line":113,"column":4,"offset":7179},"end":{"line":113,"column":55,"offset":7230},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":7176},"end":{"line":113,"column":55,"offset":7230},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Webhook","position":{"start":{"line":114,"column":6,"offset":7236},"end":{"line":114,"column":13,"offset":7243},"indent":[]}}],"position":{"start":{"line":114,"column":4,"offset":7234},"end":{"line":114,"column":15,"offset":7245},"indent":[]}},{"type":"text","value":": trigger a webhook (POST).","position":{"start":{"line":114,"column":15,"offset":7245},"end":{"line":114,"column":42,"offset":7272},"indent":[]}}],"position":{"start":{"line":114,"column":4,"offset":7234},"end":{"line":114,"column":42,"offset":7272},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":7231},"end":{"line":114,"column":42,"offset":7272},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"IFTTT","position":{"start":{"line":115,"column":6,"offset":7278},"end":{"line":115,"column":11,"offset":7283},"indent":[]}}],"position":{"start":{"line":115,"column":4,"offset":7276},"end":{"line":115,"column":13,"offset":7285},"indent":[]}},{"type":"text","value":": send a message to IFTTT.","position":{"start":{"line":115,"column":13,"offset":7285},"end":{"line":115,"column":39,"offset":7311},"indent":[]}}],"position":{"start":{"line":115,"column":4,"offset":7276},"end":{"line":115,"column":39,"offset":7311},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":7273},"end":{"line":115,"column":39,"offset":7311},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"SMS","position":{"start":{"line":116,"column":6,"offset":7317},"end":{"line":116,"column":9,"offset":7320},"indent":[]}}],"position":{"start":{"line":116,"column":4,"offset":7315},"end":{"line":116,"column":11,"offset":7322},"indent":[]}},{"type":"text","value":": send a text message to a mobile number.","position":{"start":{"line":116,"column":11,"offset":7322},"end":{"line":116,"column":52,"offset":7363},"indent":[]}}],"position":{"start":{"line":116,"column":4,"offset":7315},"end":{"line":116,"column":52,"offset":7363},"indent":[]}}],"position":{"start":{"line":116,"column":1,"offset":7312},"end":{"line":116,"column":52,"offset":7363},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":6757},"end":{"line":116,"column":52,"offset":7363},"indent":[1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-channels.png","alt":"cloud notifications","position":{"start":{"line":118,"column":1,"offset":7365},"end":{"line":118,"column":72,"offset":7436},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":7365},"end":{"line":118,"column":72,"offset":7436},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Live streaming","position":{"start":{"line":120,"column":4,"offset":7441},"end":{"line":120,"column":18,"offset":7455},"indent":[]}}],"position":{"start":{"line":120,"column":1,"offset":7438},"end":{"line":120,"column":18,"offset":7455},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Cloud allows you to live stream from your Kerberos agents to your account. A low resolution livestream (this will be improved in future), will allow you see what is happening in front of your surveillance camera in real-time.","position":{"start":{"line":122,"column":1,"offset":7457},"end":{"line":122,"column":235,"offset":7691},"indent":[]}}],"position":{"start":{"line":122,"column":1,"offset":7457},"end":{"line":122,"column":235,"offset":7691},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-livestream.png","alt":"cloud livestream","position":{"start":{"line":124,"column":1,"offset":7693},"end":{"line":124,"column":71,"offset":7763},"indent":[]}}],"position":{"start":{"line":124,"column":1,"offset":7693},"end":{"line":124,"column":71,"offset":7763},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Accounts","position":{"start":{"line":126,"column":4,"offset":7768},"end":{"line":126,"column":12,"offset":7776},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":7765},"end":{"line":126,"column":12,"offset":7776},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It's possible to create multiple accounts (also called subaccounts) within your main account. Their are two different roles:","position":{"start":{"line":128,"column":1,"offset":7778},"end":{"line":128,"column":125,"offset":7902},"indent":[]}}],"position":{"start":{"line":128,"column":1,"offset":7778},"end":{"line":128,"column":125,"offset":7902},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Guest: will only see your media recordings. A guest cannot modify, delete or create something.","position":{"start":{"line":130,"column":3,"offset":7906},"end":{"line":130,"column":97,"offset":8000},"indent":[]}}],"position":{"start":{"line":130,"column":3,"offset":7906},"end":{"line":130,"column":97,"offset":8000},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":7904},"end":{"line":130,"column":97,"offset":8000},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Editor: has full access, same permissions as the main account.","position":{"start":{"line":131,"column":3,"offset":8003},"end":{"line":131,"column":65,"offset":8065},"indent":[]}}],"position":{"start":{"line":131,"column":3,"offset":8003},"end":{"line":131,"column":65,"offset":8065},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":8001},"end":{"line":131,"column":65,"offset":8065},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":7904},"end":{"line":131,"column":65,"offset":8065},"indent":[1]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-accounts.png","alt":"cloud accounts","position":{"start":{"line":133,"column":1,"offset":8067},"end":{"line":133,"column":67,"offset":8133},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":8067},"end":{"line":133,"column":67,"offset":8133},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Logging","position":{"start":{"line":135,"column":4,"offset":8138},"end":{"line":135,"column":11,"offset":8145},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":8135},"end":{"line":135,"column":11,"offset":8145},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"All algorithms or functions which are applied to your recording on the Kerberos Cloud platform, are shown on the logging page. You can use this to debug.","position":{"start":{"line":137,"column":1,"offset":8147},"end":{"line":137,"column":154,"offset":8300},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":8147},"end":{"line":137,"column":154,"offset":8300},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-cloud-logging.png","alt":"cloud logging","position":{"start":{"line":139,"column":1,"offset":8302},"end":{"line":139,"column":65,"offset":8366},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":8302},"end":{"line":139,"column":65,"offset":8366},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":142,"column":1,"offset":8369},"end":{"line":142,"column":31,"offset":8399},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":142,"column":31,"offset":8399}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Cloud`}

\n

{`When installing a Kerberos agent inside your local network, it's possible to review your activity by using the agent's web interface. By nature, you will not be able to access the web interface from the cloud (outside your local network). On top of that, the Kerberos agent doesn't come with a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera.`}

\n

{`To simplify and resolve all of these challenges, Kerberos Cloud was developed.`}

\n
\n

{`Kerberos Cloud`}{` is a cloud solution which allows you to have a single overview of all the media recordings generated by your surveillance cameras. It's not a solution for processing your surveillance cameras in the cloud. For processing of your surveillance cameras, a Kerberos agent is used.`}

\n
\n

{`A brief list of the key features of Kerberos Cloud are:`}

\n
    \n
  • {`Secured storage`}
  • \n
  • {`Consolidated overview`}
  • \n
  • {`Advanced searching`}
  • \n
  • {`Machine learning`}
  • \n
  • {`Alerts`}
  • \n
  • {`Live streaming`}
  • \n
  • {`Accounts`}
  • \n
  • {`Logging`}
  • \n
\n
\n

{`Checkout `}{`the demo environment`}{` to see and feel the Kerberos Cloud solution yourself.`}

\n
\n

{`Architecture`}

\n

{`A simplified architecture is found below. In this architecture the Kerberos agents are installed on-premise, next to the surveillance cameras. Once one of the agents recorded something it will send the recording to our AWS S3 bucket, using the credentials you've defined inside the agent.`}

\n

{`As soon as the recording is succesfully received several engines will be executed, that will further process the recording and extract metadata from it (classification, origin of the surveillance camera, etc). A lot of processing is happening behind the scenes.`}

\n

{`By using a browser you can navigate to Kerberos Cloud, and review all the recordings made by the Kerberos agents on-premise. On top of that you will receive more context about the recordings, get notifications, view a livestream and much more.`}

\n

\"cloud\"

\n

{`Public or Private cloud (Bring Your Own Cloud)`}

\n

{`We run Kerberos Cloud in the public cloud on different services such as AWS, GCP and Scaleway. However if needed we can host our entire solution within your Private cloud (create a support ticket).`}

\n

{`Secured storage`}

\n

{`Kerberos Cloud allows you to store your data in the cloud, and make it available using a secured web interface. This is how it works.`}

\n

{`Once you've installed a Kerberos agent, and created an account on `}{`Kerberos Cloud`}{`, you will be able to connect both systems together. By entering credentials received from Kerberos Cloud, into your Kerberos agent, your media recordings will be send to our cloud storage.`}

\n
\n

{`You can link one or more Kerberos agents to your Kerberos Cloud account.`}

\n
\n

\"cloud

\n

{`After linking your media recorded by a Kerberos agent will be send to a secure cloud storage, AWS S3 (multiple regions are supported). By default our own S3 buckets are used, however we can negotiate to have your own S3 bucket (open a support ticket).`}

\n

\"cloud\"

\n

{`Once stored your media recordings will be processed by different functions and algorithms to send alerts, apply machine learning and much more.`}

\n
\n

{`Kerberos Cloud is much more than a storage service, you get intelligent capabilities as well. Read on to discover more.`}

\n
\n

{`Consolidated overview`}

\n

{`Kerberos Cloud will group your media recordings (coming from one or more Kerberos agents) into time bundles. We do this to simplify the searching of a specific event. Less data is shown at once, and when needed you can drill down a level deeper to see more details.`}

\n

\"cloud

\n

{`In a sneak peek you will see how many media recordings were generated during a certain time period, and which Kerberos agents were involved. For example, this might give you an indication of a particular event (more about in the machine learning section).`}

\n

{`Security`}

\n

{`Once you're inside your Kerberos Cloud account, you will see all the available media recordings of your Kerberos agents in a single interface. So how does this work?`}

\n

{`When you open Kerberos Cloud we will generate temporary and private links for every media recording within your account. This link includes a random and unique hash, and is only available for a couple of minutes. So this means that your recording cannot be shared afterwards, or the risk someone else accessing that link is minimised.`}

\n

{`Advanced searching`}

\n

{`Next to showing all your recordings in one overview, we also give you the capabilities to search for a recording more easily. For example you can search for recordings within a specific time boundary, recordings generated by a specific Kerberos agent, recordings which are marked as important, classified recordings such as pedestrians or animals, and more.`}

\n

\"cloud

\n

{`Machine learning`}

\n

{`With Kerberos Cloud you will get far more than just a nice interface for finding back your recordings. When a recording is uploaded to Kerberos Cloud, we will execute all kind of algorithms. One of these algorithms is classification. This algorithm is used to classify/recognise all the objects inside your recording. Any human, vehicle or animal in the recording will be labeled.`}

\n

{`Next to classifying, the algorithm is also tracing the classified objects. By doing this we can label the recording with the object of interest. For example at the image below you see the traject of a pedestrian walking by (710 pixels).`}

\n

\"cloud

\n

{`Alerts`}

\n

{`When a specific event occurred, a notification can be send to one or more channels. A user can compose an event by selecting one or more conditions. Once the event is triggered, a notification is sent to all the enabled channels.`}

\n

{`Notifications`}

\n

{` Kerberos Cloud supports different types of notifications:`}

\n
    \n
  • {`Detections`}{`: send a notification if a recording was received from a specific Kerberos agent, within a time range, with a specific classification, etc.`}
  • \n
  • {`Devices`}{`: when one of your Kerberos agents stopped working, a notification can be send.`}
  • \n
  • {`High upload`}{`: when a lot of recordings are generated within a specific period of time, a notification can be send.`}
  • \n
\n

\"cloud

\n

{`Channels`}

\n

{` Kerberos Cloud supports different types of channels, towards notifications can be send:`}

\n
    \n
  • {`Browser`}{`: notifications inside the browser (if the used browser supports this).`}
  • \n
  • {`E-mail`}{`: a personal email can be send.`}
  • \n
  • {`Slack`}{`: send a message to a slack channel.`}
  • \n
  • {`Alexa`}{`: send a notification to Alexa skill (`}{`Notify Me`}{`).`}
  • \n
  • {`Telegram`}{`: send a message to a Telegram channel.`}
  • \n
  • {`Pushbullet`}{`: send a message to a Pushbullet channel.`}
  • \n
  • {`Pushover`}{`: send a message to a Pushover channel.`}
  • \n
  • {`Webhook`}{`: trigger a webhook (POST).`}
  • \n
  • {`IFTTT`}{`: send a message to IFTTT.`}
  • \n
  • {`SMS`}{`: send a text message to a mobile number.`}
  • \n
\n

\"cloud

\n

{`Live streaming`}

\n

{`Kerberos Cloud allows you to live stream from your Kerberos agents to your account. A low resolution livestream (this will be improved in future), will allow you see what is happening in front of your surveillance camera in real-time.`}

\n

\"cloud

\n

{`Accounts`}

\n

{`It's possible to create multiple accounts (also called subaccounts) within your main account. Their are two different roles:`}

\n
    \n
  • {`Guest: will only see your media recordings. A guest cannot modify, delete or create something.`}
  • \n
  • {`Editor: has full access, same permissions as the main account.`}
  • \n
\n

\"cloud

\n

{`Logging`}

\n

{`All algorithms or functions which are applied to your recording on the Kerberos Cloud platform, are shown on the logging page. You can use this to debug.`}

\n

\"cloud

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-96c6bd5a46263ca6eef369267d5ffe8a.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-96c6bd5a46263ca6eef369267d5ffe8a.json deleted file mode 100644 index c09c424..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-96c6bd5a46263ca6eef369267d5ffe8a.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838527196000,"key":"gatsby-plugin-mdx-entire-payload-ac6016143f46d1f9fa650060803bc68a-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":839},"end":{"line":16,"column":186,"offset":1024},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":19,"column":1,"offset":1027},"end":{"line":19,"column":31,"offset":1057},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":19,"column":31,"offset":1057}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.`}

\n
\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a316e56c69093e697f9ccd27e0d8afcb.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a316e56c69093e697f9ccd27e0d8afcb.json deleted file mode 100644 index 591c9dc..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a316e56c69093e697f9ccd27e0d8afcb.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838525746000,"key":"gatsby-plugin-mdx-entire-payload-68d870e8cd8cb24058ef5b4505d8e73e-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you want to monitor dozens of hundreds of them. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a huge amount of surveillance cameras.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":205,"offset":811},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":205,"offset":811},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":17,"column":1,"offset":814},"end":{"line":17,"column":31,"offset":844},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":17,"column":31,"offset":844}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you want to monitor dozens of hundreds of them. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a huge amount of surveillance cameras.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a68c3c29fa019a10d273faa566b1e0b7.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a68c3c29fa019a10d273faa566b1e0b7.json index 7bda25f..cc47b1d 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a68c3c29fa019a10d273faa566b1e0b7.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a68c3c29fa019a10d273faa566b1e0b7.json @@ -1 +1 @@ -{"expireTime":9007200838510859000,"key":"gatsby-plugin-mdx-entire-payload-b468dbf55b0553564a37dfaeddba3f9d-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Release notes","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":16,"offset":174},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":16,"offset":174},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.8.0","position":{"start":{"line":10,"column":5,"offset":180},"end":{"line":10,"column":10,"offset":185},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":10,"offset":185},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Aligned machinery, web and KiOS versions. Too many people were confused by the versioning.","position":{"start":{"line":12,"column":1,"offset":187},"end":{"line":12,"column":91,"offset":277},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":187},"end":{"line":12,"column":91,"offset":277},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":14,"column":6,"offset":284},"end":{"line":14,"column":9,"offset":287},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":279},"end":{"line":14,"column":9,"offset":287},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Videos displayed on canvas were blocked in latest browsers.","position":{"start":{"line":16,"column":3,"offset":291},"end":{"line":16,"column":62,"offset":350},"indent":[]}}],"position":{"start":{"line":16,"column":3,"offset":291},"end":{"line":16,"column":62,"offset":350},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":289},"end":{"line":16,"column":62,"offset":350},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disabled reboot and shutdown.","position":{"start":{"line":17,"column":3,"offset":353},"end":{"line":17,"column":32,"offset":382},"indent":[]}}],"position":{"start":{"line":17,"column":3,"offset":353},"end":{"line":17,"column":32,"offset":382},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":351},"end":{"line":17,"column":32,"offset":382},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disabled upgrade process, use fwupdate shell command instead.","position":{"start":{"line":18,"column":3,"offset":385},"end":{"line":18,"column":64,"offset":446},"indent":[]}}],"position":{"start":{"line":18,"column":3,"offset":385},"end":{"line":18,"column":64,"offset":446},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":383},"end":{"line":18,"column":64,"offset":446},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":289},"end":{"line":18,"column":64,"offset":446},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":20,"column":6,"offset":453},"end":{"line":20,"column":10,"offset":457},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":448},"end":{"line":20,"column":10,"offset":457},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Major upgrade, solved many different problems (list to long); not possible to upgrade from 2.7.0 to 2.8.0.","position":{"start":{"line":22,"column":3,"offset":461},"end":{"line":22,"column":109,"offset":567},"indent":[]}}],"position":{"start":{"line":22,"column":3,"offset":461},"end":{"line":22,"column":109,"offset":567},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":459},"end":{"line":22,"column":109,"offset":567},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).","position":{"start":{"line":23,"column":3,"offset":570},"end":{"line":23,"column":73,"offset":640},"indent":[]}}],"position":{"start":{"line":23,"column":3,"offset":570},"end":{"line":23,"column":73,"offset":640},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":568},"end":{"line":23,"column":73,"offset":640},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi 4.","position":{"start":{"line":24,"column":3,"offset":643},"end":{"line":24,"column":34,"offset":674},"indent":[]}}],"position":{"start":{"line":24,"column":3,"offset":643},"end":{"line":24,"column":34,"offset":674},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":641},"end":{"line":24,"column":34,"offset":674},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":459},"end":{"line":24,"column":34,"offset":674},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.7.2","position":{"start":{"line":26,"column":5,"offset":680},"end":{"line":26,"column":10,"offset":685},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":676},"end":{"line":26,"column":10,"offset":685},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":28,"column":6,"offset":692},"end":{"line":28,"column":15,"offset":701},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":687},"end":{"line":28,"column":15,"offset":701},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"To optimise the cloud experience we've added a proxy.kerberos.io machine in between.","position":{"start":{"line":30,"column":3,"offset":705},"end":{"line":30,"column":87,"offset":789},"indent":[]}}],"position":{"start":{"line":30,"column":3,"offset":705},"end":{"line":30,"column":87,"offset":789},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":703},"end":{"line":30,"column":87,"offset":789},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"We've changed the S3 storage scheme (class:ONEZONE_IA).","position":{"start":{"line":31,"column":3,"offset":792},"end":{"line":31,"column":58,"offset":847},"indent":[]}}],"position":{"start":{"line":31,"column":3,"offset":792},"end":{"line":31,"column":58,"offset":847},"indent":[]}}],"position":{"start":{"line":31,"column":1,"offset":790},"end":{"line":31,"column":58,"offset":847},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":703},"end":{"line":31,"column":58,"offset":847},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.7.1","position":{"start":{"line":33,"column":5,"offset":853},"end":{"line":33,"column":10,"offset":858},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":849},"end":{"line":33,"column":10,"offset":858},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":35,"column":6,"offset":865},"end":{"line":35,"column":15,"offset":874},"indent":[]}}],"position":{"start":{"line":35,"column":1,"offset":860},"end":{"line":35,"column":15,"offset":874},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved deadlock with livestreaming while restarting machinery.","position":{"start":{"line":37,"column":3,"offset":878},"end":{"line":37,"column":67,"offset":942},"indent":[]}}],"position":{"start":{"line":37,"column":3,"offset":878},"end":{"line":37,"column":67,"offset":942},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":876},"end":{"line":37,"column":67,"offset":942},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Revert logging library; enabled log rotating.","position":{"start":{"line":38,"column":3,"offset":945},"end":{"line":38,"column":48,"offset":990},"indent":[]}}],"position":{"start":{"line":38,"column":3,"offset":945},"end":{"line":38,"column":48,"offset":990},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":943},"end":{"line":38,"column":48,"offset":990},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":876},"end":{"line":38,"column":48,"offset":990},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":40,"column":6,"offset":997},"end":{"line":40,"column":10,"offset":1001},"indent":[]}}],"position":{"start":{"line":40,"column":1,"offset":992},"end":{"line":40,"column":10,"offset":1001},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).","position":{"start":{"line":42,"column":3,"offset":1005},"end":{"line":42,"column":73,"offset":1075},"indent":[]}}],"position":{"start":{"line":42,"column":3,"offset":1005},"end":{"line":42,"column":73,"offset":1075},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":1003},"end":{"line":42,"column":73,"offset":1075},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved issue with WIFI on Raspberry Pi 3B+","position":{"start":{"line":43,"column":3,"offset":1078},"end":{"line":43,"column":47,"offset":1122},"indent":[]}}],"position":{"start":{"line":43,"column":3,"offset":1078},"end":{"line":43,"column":47,"offset":1122},"indent":[]}}],"position":{"start":{"line":43,"column":1,"offset":1076},"end":{"line":43,"column":47,"offset":1122},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":1003},"end":{"line":43,"column":47,"offset":1122},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.7.0","position":{"start":{"line":45,"column":5,"offset":1128},"end":{"line":45,"column":10,"offset":1133},"indent":[]}}],"position":{"start":{"line":45,"column":1,"offset":1124},"end":{"line":45,"column":10,"offset":1133},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":47,"column":6,"offset":1140},"end":{"line":47,"column":9,"offset":1143},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":1135},"end":{"line":47,"column":9,"offset":1143},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Unique session cookie, which allows to open multiple web interfaces (e.g. when using docker).","position":{"start":{"line":49,"column":3,"offset":1147},"end":{"line":49,"column":96,"offset":1240},"indent":[]}}],"position":{"start":{"line":49,"column":3,"offset":1147},"end":{"line":49,"column":96,"offset":1240},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1145},"end":{"line":49,"column":96,"offset":1240},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1145},"end":{"line":49,"column":96,"offset":1240},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":51,"column":6,"offset":1247},"end":{"line":51,"column":15,"offset":1256},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1242},"end":{"line":51,"column":15,"offset":1256},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added live streaming feature for app.kerberos.io","position":{"start":{"line":53,"column":3,"offset":1260},"end":{"line":53,"column":51,"offset":1308},"indent":[]}}],"position":{"start":{"line":53,"column":3,"offset":1260},"end":{"line":53,"column":51,"offset":1308},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1258},"end":{"line":53,"column":51,"offset":1308},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgraded logging library: log file can be max 5MB, and will rotate.","position":{"start":{"line":54,"column":3,"offset":1311},"end":{"line":54,"column":70,"offset":1378},"indent":[]}}],"position":{"start":{"line":54,"column":3,"offset":1311},"end":{"line":54,"column":70,"offset":1378},"indent":[]}}],"position":{"start":{"line":54,"column":1,"offset":1309},"end":{"line":54,"column":70,"offset":1378},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Better logging for cloud uploads (failed information).","position":{"start":{"line":55,"column":3,"offset":1381},"end":{"line":55,"column":57,"offset":1435},"indent":[]}}],"position":{"start":{"line":55,"column":3,"offset":1381},"end":{"line":55,"column":57,"offset":1435},"indent":[]}}],"position":{"start":{"line":55,"column":1,"offset":1379},"end":{"line":55,"column":57,"offset":1435},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1258},"end":{"line":55,"column":57,"offset":1435},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":57,"column":6,"offset":1442},"end":{"line":57,"column":12,"offset":1448},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1437},"end":{"line":57,"column":12,"offset":1448},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"No longer need docker-compose, we merged the web and machinery containers to ","position":{"start":{"line":59,"column":3,"offset":1452},"end":{"line":59,"column":80,"offset":1529},"indent":[]}},{"type":"link","title":null,"url":"http://hub.docker.com/r/kerberos/kerberos","children":[{"type":"text","value":"a single container","position":{"start":{"line":59,"column":81,"offset":1530},"end":{"line":59,"column":99,"offset":1548},"indent":[]}}],"position":{"start":{"line":59,"column":80,"offset":1529},"end":{"line":59,"column":143,"offset":1592},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":59,"column":143,"offset":1592},"end":{"line":59,"column":144,"offset":1593},"indent":[]}}],"position":{"start":{"line":59,"column":3,"offset":1452},"end":{"line":59,"column":144,"offset":1593},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":1450},"end":{"line":59,"column":144,"offset":1593},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":1450},"end":{"line":59,"column":144,"offset":1593},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":61,"column":6,"offset":1600},"end":{"line":61,"column":10,"offset":1604},"indent":[]}}],"position":{"start":{"line":61,"column":1,"offset":1595},"end":{"line":61,"column":10,"offset":1604},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Updated firmware to latest Raspbian.","position":{"start":{"line":63,"column":3,"offset":1608},"end":{"line":63,"column":39,"offset":1644},"indent":[]}}],"position":{"start":{"line":63,"column":3,"offset":1608},"end":{"line":63,"column":39,"offset":1644},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1606},"end":{"line":63,"column":39,"offset":1644},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi 3B+.","position":{"start":{"line":64,"column":3,"offset":1647},"end":{"line":64,"column":36,"offset":1680},"indent":[]}}],"position":{"start":{"line":64,"column":3,"offset":1647},"end":{"line":64,"column":36,"offset":1680},"indent":[]}}],"position":{"start":{"line":64,"column":1,"offset":1645},"end":{"line":64,"column":36,"offset":1680},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1606},"end":{"line":64,"column":36,"offset":1680},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.6.1","position":{"start":{"line":66,"column":5,"offset":1686},"end":{"line":66,"column":10,"offset":1691},"indent":[]}}],"position":{"start":{"line":66,"column":1,"offset":1682},"end":{"line":66,"column":10,"offset":1691},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":68,"column":6,"offset":1698},"end":{"line":68,"column":9,"offset":1701},"indent":[]}}],"position":{"start":{"line":68,"column":1,"offset":1693},"end":{"line":68,"column":9,"offset":1701},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Solved issue with persisting login configuration. ","position":{"start":{"line":70,"column":3,"offset":1705},"end":{"line":70,"column":53,"offset":1755},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/111","children":[{"type":"text","value":"#111","position":{"start":{"line":70,"column":54,"offset":1756},"end":{"line":70,"column":58,"offset":1760},"indent":[]}}],"position":{"start":{"line":70,"column":53,"offset":1755},"end":{"line":70,"column":106,"offset":1808},"indent":[]}}],"position":{"start":{"line":70,"column":3,"offset":1705},"end":{"line":70,"column":106,"offset":1808},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":1703},"end":{"line":70,"column":106,"offset":1808},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":1703},"end":{"line":70,"column":106,"offset":1808},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":72,"column":6,"offset":1815},"end":{"line":72,"column":15,"offset":1824},"indent":[]}}],"position":{"start":{"line":72,"column":1,"offset":1810},"end":{"line":72,"column":15,"offset":1824},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added Pushbullet. ","position":{"start":{"line":74,"column":3,"offset":1828},"end":{"line":74,"column":21,"offset":1846},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/pull/139","children":[{"type":"text","value":"#139","position":{"start":{"line":74,"column":22,"offset":1847},"end":{"line":74,"column":26,"offset":1851},"indent":[]}}],"position":{"start":{"line":74,"column":21,"offset":1846},"end":{"line":74,"column":78,"offset":1903},"indent":[]}}],"position":{"start":{"line":74,"column":3,"offset":1828},"end":{"line":74,"column":78,"offset":1903},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":1826},"end":{"line":74,"column":78,"offset":1903},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Cloud upload was not longer working (hotfix also in 2.6.0).","position":{"start":{"line":75,"column":3,"offset":1906},"end":{"line":75,"column":62,"offset":1965},"indent":[]}}],"position":{"start":{"line":75,"column":3,"offset":1906},"end":{"line":75,"column":62,"offset":1965},"indent":[]}}],"position":{"start":{"line":75,"column":1,"offset":1904},"end":{"line":75,"column":62,"offset":1965},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":1826},"end":{"line":75,"column":62,"offset":1965},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.6.0","position":{"start":{"line":77,"column":5,"offset":1971},"end":{"line":77,"column":10,"offset":1976},"indent":[]}}],"position":{"start":{"line":77,"column":1,"offset":1967},"end":{"line":77,"column":10,"offset":1976},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":79,"column":6,"offset":1983},"end":{"line":79,"column":9,"offset":1986},"indent":[]}}],"position":{"start":{"line":79,"column":1,"offset":1978},"end":{"line":79,"column":9,"offset":1986},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add a cloud connection verification method. ","position":{"start":{"line":81,"column":3,"offset":1990},"end":{"line":81,"column":47,"offset":2034},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/112","children":[{"type":"text","value":"#112","position":{"start":{"line":81,"column":48,"offset":2035},"end":{"line":81,"column":52,"offset":2039},"indent":[]}}],"position":{"start":{"line":81,"column":47,"offset":2034},"end":{"line":81,"column":100,"offset":2087},"indent":[]}}],"position":{"start":{"line":81,"column":3,"offset":1990},"end":{"line":81,"column":100,"offset":2087},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":1988},"end":{"line":81,"column":100,"offset":2087},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":1988},"end":{"line":81,"column":100,"offset":2087},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":83,"column":6,"offset":2094},"end":{"line":83,"column":15,"offset":2103},"indent":[]}}],"position":{"start":{"line":83,"column":1,"offset":2089},"end":{"line":83,"column":15,"offset":2103},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add background color timestamp. ","position":{"start":{"line":85,"column":3,"offset":2107},"end":{"line":85,"column":35,"offset":2139},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/128","children":[{"type":"text","value":"#128","position":{"start":{"line":85,"column":36,"offset":2140},"end":{"line":85,"column":40,"offset":2144},"indent":[]}}],"position":{"start":{"line":85,"column":35,"offset":2139},"end":{"line":85,"column":94,"offset":2198},"indent":[]}}],"position":{"start":{"line":85,"column":3,"offset":2107},"end":{"line":85,"column":94,"offset":2198},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":2105},"end":{"line":85,"column":94,"offset":2198},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Send instanceId in AWS header when uploading to cloud (necessary for new cloud app).","position":{"start":{"line":86,"column":3,"offset":2201},"end":{"line":86,"column":87,"offset":2285},"indent":[]}}],"position":{"start":{"line":86,"column":3,"offset":2201},"end":{"line":86,"column":87,"offset":2285},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2199},"end":{"line":86,"column":87,"offset":2285},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Better support for Chinese IP cameras.","position":{"start":{"line":87,"column":3,"offset":2288},"end":{"line":87,"column":41,"offset":2326},"indent":[]}}],"position":{"start":{"line":87,"column":3,"offset":2288},"end":{"line":87,"column":41,"offset":2326},"indent":[]}}],"position":{"start":{"line":87,"column":1,"offset":2286},"end":{"line":87,"column":41,"offset":2326},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":2105},"end":{"line":87,"column":41,"offset":2326},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":89,"column":6,"offset":2333},"end":{"line":89,"column":12,"offset":2339},"indent":[]}}],"position":{"start":{"line":89,"column":1,"offset":2328},"end":{"line":89,"column":12,"offset":2339},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: Autoremove old images/video within Docker Containers. ","position":{"start":{"line":91,"column":3,"offset":2343},"end":{"line":91,"column":62,"offset":2402},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/104","children":[{"type":"text","value":"#104","position":{"start":{"line":91,"column":63,"offset":2403},"end":{"line":91,"column":67,"offset":2407},"indent":[]}}],"position":{"start":{"line":91,"column":62,"offset":2402},"end":{"line":91,"column":115,"offset":2455},"indent":[]}}],"position":{"start":{"line":91,"column":3,"offset":2343},"end":{"line":91,"column":115,"offset":2455},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2341},"end":{"line":91,"column":115,"offset":2455},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2341},"end":{"line":91,"column":115,"offset":2455},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.5.0","position":{"start":{"line":93,"column":5,"offset":2461},"end":{"line":93,"column":10,"offset":2466},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2457},"end":{"line":93,"column":10,"offset":2466},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":95,"column":6,"offset":2473},"end":{"line":95,"column":9,"offset":2476},"indent":[]}}],"position":{"start":{"line":95,"column":1,"offset":2468},"end":{"line":95,"column":9,"offset":2476},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added Chinese and Italian language.","position":{"start":{"line":97,"column":3,"offset":2480},"end":{"line":97,"column":38,"offset":2515},"indent":[]}}],"position":{"start":{"line":97,"column":3,"offset":2480},"end":{"line":97,"column":38,"offset":2515},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":2478},"end":{"line":97,"column":38,"offset":2515},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved issue with INSTALLED=true.","position":{"start":{"line":98,"column":3,"offset":2518},"end":{"line":98,"column":38,"offset":2553},"indent":[]}}],"position":{"start":{"line":98,"column":3,"offset":2518},"end":{"line":98,"column":38,"offset":2553},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2516},"end":{"line":98,"column":38,"offset":2553},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Make latest_sequence available with basic auth. ","position":{"start":{"line":99,"column":3,"offset":2556},"end":{"line":99,"column":52,"offset":2605},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/99","children":[{"type":"text","value":"#99","position":{"start":{"line":99,"column":53,"offset":2606},"end":{"line":99,"column":56,"offset":2609},"indent":[]}}],"position":{"start":{"line":99,"column":52,"offset":2605},"end":{"line":99,"column":103,"offset":2656},"indent":[]}}],"position":{"start":{"line":99,"column":3,"offset":2556},"end":{"line":99,"column":103,"offset":2656},"indent":[]}}],"position":{"start":{"line":99,"column":1,"offset":2554},"end":{"line":99,"column":103,"offset":2656},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":2478},"end":{"line":99,"column":103,"offset":2656},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":101,"column":6,"offset":2663},"end":{"line":101,"column":15,"offset":2672},"indent":[]}}],"position":{"start":{"line":101,"column":1,"offset":2658},"end":{"line":101,"column":15,"offset":2672},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Provide an IO service for publishing events to MQTT. ","position":{"start":{"line":103,"column":3,"offset":2676},"end":{"line":103,"column":56,"offset":2729},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/89","children":[{"type":"text","value":"#89","position":{"start":{"line":103,"column":57,"offset":2730},"end":{"line":103,"column":60,"offset":2733},"indent":[]}}],"position":{"start":{"line":103,"column":56,"offset":2729},"end":{"line":103,"column":113,"offset":2786},"indent":[]}}],"position":{"start":{"line":103,"column":3,"offset":2676},"end":{"line":103,"column":113,"offset":2786},"indent":[]}}],"position":{"start":{"line":103,"column":1,"offset":2674},"end":{"line":103,"column":113,"offset":2786},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimize recording with H264_OMX. ","position":{"start":{"line":104,"column":3,"offset":2789},"end":{"line":104,"column":37,"offset":2823},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/83","children":[{"type":"text","value":"#83","position":{"start":{"line":104,"column":38,"offset":2824},"end":{"line":104,"column":41,"offset":2827},"indent":[]}}],"position":{"start":{"line":104,"column":37,"offset":2823},"end":{"line":104,"column":94,"offset":2880},"indent":[]}}],"position":{"start":{"line":104,"column":3,"offset":2789},"end":{"line":104,"column":94,"offset":2880},"indent":[]}}],"position":{"start":{"line":104,"column":1,"offset":2787},"end":{"line":104,"column":94,"offset":2880},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Implement throttler for Io detections. ","position":{"start":{"line":105,"column":3,"offset":2883},"end":{"line":105,"column":42,"offset":2922},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/96","children":[{"type":"text","value":"#96","position":{"start":{"line":105,"column":43,"offset":2923},"end":{"line":105,"column":46,"offset":2926},"indent":[]}}],"position":{"start":{"line":105,"column":42,"offset":2922},"end":{"line":105,"column":99,"offset":2979},"indent":[]}}],"position":{"start":{"line":105,"column":3,"offset":2883},"end":{"line":105,"column":99,"offset":2979},"indent":[]}}],"position":{"start":{"line":105,"column":1,"offset":2881},"end":{"line":105,"column":99,"offset":2979},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"SSL version 1.0.0 is no longer accessible in Raspbian. ","position":{"start":{"line":106,"column":3,"offset":2982},"end":{"line":106,"column":58,"offset":3037},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/109","children":[{"type":"text","value":"#109","position":{"start":{"line":106,"column":59,"offset":3038},"end":{"line":106,"column":63,"offset":3042},"indent":[]}}],"position":{"start":{"line":106,"column":58,"offset":3037},"end":{"line":106,"column":117,"offset":3096},"indent":[]}}],"position":{"start":{"line":106,"column":3,"offset":2982},"end":{"line":106,"column":117,"offset":3096},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":2980},"end":{"line":106,"column":117,"offset":3096},"indent":[]}}],"position":{"start":{"line":103,"column":1,"offset":2674},"end":{"line":106,"column":117,"offset":3096},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.4.2","position":{"start":{"line":108,"column":5,"offset":3102},"end":{"line":108,"column":10,"offset":3107},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":3098},"end":{"line":108,"column":10,"offset":3107},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":110,"column":6,"offset":3114},"end":{"line":110,"column":9,"offset":3117},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":3109},"end":{"line":110,"column":9,"offset":3117},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Typo in french translation, causes the web interface crash.","position":{"start":{"line":112,"column":3,"offset":3121},"end":{"line":112,"column":62,"offset":3180},"indent":[]}}],"position":{"start":{"line":112,"column":3,"offset":3121},"end":{"line":112,"column":62,"offset":3180},"indent":[]}}],"position":{"start":{"line":112,"column":1,"offset":3119},"end":{"line":112,"column":62,"offset":3180},"indent":[]}}],"position":{"start":{"line":112,"column":1,"offset":3119},"end":{"line":112,"column":62,"offset":3180},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":114,"column":6,"offset":3187},"end":{"line":114,"column":15,"offset":3196},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3182},"end":{"line":114,"column":15,"offset":3196},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved major bug in livestream: memory leak in stream class. ","position":{"start":{"line":116,"column":3,"offset":3200},"end":{"line":116,"column":66,"offset":3263},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/94","children":[{"type":"text","value":"#94","position":{"start":{"line":116,"column":67,"offset":3264},"end":{"line":116,"column":70,"offset":3267},"indent":[]}}],"position":{"start":{"line":116,"column":66,"offset":3263},"end":{"line":116,"column":123,"offset":3320},"indent":[]}}],"position":{"start":{"line":116,"column":3,"offset":3200},"end":{"line":116,"column":123,"offset":3320},"indent":[]}}],"position":{"start":{"line":116,"column":1,"offset":3198},"end":{"line":116,"column":123,"offset":3320},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Capture health verification: check if the chosen capture device is still grabbing (and didn't stalled).","position":{"start":{"line":117,"column":3,"offset":3323},"end":{"line":117,"column":106,"offset":3426},"indent":[]}}],"position":{"start":{"line":117,"column":3,"offset":3323},"end":{"line":117,"column":106,"offset":3426},"indent":[]}}],"position":{"start":{"line":117,"column":1,"offset":3321},"end":{"line":117,"column":106,"offset":3426},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Extra logging when recording with raspberry pi camera.","position":{"start":{"line":118,"column":3,"offset":3429},"end":{"line":118,"column":57,"offset":3483},"indent":[]}}],"position":{"start":{"line":118,"column":3,"offset":3429},"end":{"line":118,"column":57,"offset":3483},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3427},"end":{"line":118,"column":57,"offset":3483},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Make sure the cloud upload is functioning properly, after an upload it's verified if the files really exist in the cloud.","position":{"start":{"line":119,"column":3,"offset":3486},"end":{"line":119,"column":124,"offset":3607},"indent":[]}}],"position":{"start":{"line":119,"column":3,"offset":3486},"end":{"line":119,"column":124,"offset":3607},"indent":[]}}],"position":{"start":{"line":119,"column":1,"offset":3484},"end":{"line":119,"column":124,"offset":3607},"indent":[]}}],"position":{"start":{"line":116,"column":1,"offset":3198},"end":{"line":119,"column":124,"offset":3607},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.4.1","position":{"start":{"line":121,"column":5,"offset":3613},"end":{"line":121,"column":10,"offset":3618},"indent":[]}}],"position":{"start":{"line":121,"column":1,"offset":3609},"end":{"line":121,"column":10,"offset":3618},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":123,"column":6,"offset":3625},"end":{"line":123,"column":9,"offset":3628},"indent":[]}}],"position":{"start":{"line":123,"column":1,"offset":3620},"end":{"line":123,"column":9,"offset":3628},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Show warning when system is disabled. ","position":{"start":{"line":125,"column":3,"offset":3632},"end":{"line":125,"column":41,"offset":3670},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/88","children":[{"type":"text","value":"#88","position":{"start":{"line":125,"column":42,"offset":3671},"end":{"line":125,"column":45,"offset":3674},"indent":[]}}],"position":{"start":{"line":125,"column":41,"offset":3670},"end":{"line":125,"column":92,"offset":3721},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":125,"column":92,"offset":3721},"end":{"line":125,"column":93,"offset":3722},"indent":[]}}],"position":{"start":{"line":125,"column":3,"offset":3632},"end":{"line":125,"column":93,"offset":3722},"indent":[]}}],"position":{"start":{"line":125,"column":1,"offset":3630},"end":{"line":125,"column":93,"offset":3722},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Hull selector in basic view not always working.","position":{"start":{"line":126,"column":3,"offset":3725},"end":{"line":126,"column":50,"offset":3772},"indent":[]}}],"position":{"start":{"line":126,"column":3,"offset":3725},"end":{"line":126,"column":50,"offset":3772},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":3723},"end":{"line":126,"column":50,"offset":3772},"indent":[]}}],"position":{"start":{"line":125,"column":1,"offset":3630},"end":{"line":126,"column":50,"offset":3772},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.4.0","position":{"start":{"line":128,"column":5,"offset":3778},"end":{"line":128,"column":10,"offset":3783},"indent":[]}}],"position":{"start":{"line":128,"column":1,"offset":3774},"end":{"line":128,"column":10,"offset":3783},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":130,"column":6,"offset":3790},"end":{"line":130,"column":15,"offset":3799},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":3785},"end":{"line":130,"column":15,"offset":3799},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Enable/Disable force network mode.","position":{"start":{"line":132,"column":3,"offset":3803},"end":{"line":132,"column":37,"offset":3837},"indent":[]}}],"position":{"start":{"line":132,"column":3,"offset":3803},"end":{"line":132,"column":37,"offset":3837},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":3801},"end":{"line":132,"column":37,"offset":3837},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Enable/Disable auto removal media.","position":{"start":{"line":133,"column":3,"offset":3840},"end":{"line":133,"column":37,"offset":3874},"indent":[]}}],"position":{"start":{"line":133,"column":3,"offset":3840},"end":{"line":133,"column":37,"offset":3874},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":3838},"end":{"line":133,"column":37,"offset":3874},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":3801},"end":{"line":133,"column":37,"offset":3874},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":135,"column":6,"offset":3881},"end":{"line":135,"column":9,"offset":3884},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":3876},"end":{"line":135,"column":9,"offset":3884},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgrade from Laravel 4.2 to Laravel 5.4 ","position":{"start":{"line":137,"column":3,"offset":3888},"end":{"line":137,"column":43,"offset":3928},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/70","children":[{"type":"text","value":"#70","position":{"start":{"line":137,"column":44,"offset":3929},"end":{"line":137,"column":47,"offset":3932},"indent":[]}}],"position":{"start":{"line":137,"column":43,"offset":3928},"end":{"line":137,"column":94,"offset":3979},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":137,"column":94,"offset":3979},"end":{"line":137,"column":95,"offset":3980},"indent":[]}}],"position":{"start":{"line":137,"column":3,"offset":3888},"end":{"line":137,"column":95,"offset":3980},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":3886},"end":{"line":137,"column":95,"offset":3980},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fix bug with heatmap radius slider ","position":{"start":{"line":138,"column":3,"offset":3983},"end":{"line":138,"column":38,"offset":4018},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/84","children":[{"type":"text","value":"#84","position":{"start":{"line":138,"column":39,"offset":4019},"end":{"line":138,"column":42,"offset":4022},"indent":[]}}],"position":{"start":{"line":138,"column":38,"offset":4018},"end":{"line":138,"column":89,"offset":4069},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":138,"column":89,"offset":4069},"end":{"line":138,"column":90,"offset":4070},"indent":[]}}],"position":{"start":{"line":138,"column":3,"offset":3983},"end":{"line":138,"column":90,"offset":4070},"indent":[]}}],"position":{"start":{"line":138,"column":1,"offset":3981},"end":{"line":138,"column":90,"offset":4070},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Design tweaks toggle button (remove outline).","position":{"start":{"line":139,"column":3,"offset":4073},"end":{"line":139,"column":48,"offset":4118},"indent":[]}}],"position":{"start":{"line":139,"column":3,"offset":4073},"end":{"line":139,"column":48,"offset":4118},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4071},"end":{"line":139,"column":48,"offset":4118},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disabled possibility to timestamp video when using hardware acceleration.","position":{"start":{"line":140,"column":3,"offset":4121},"end":{"line":140,"column":76,"offset":4194},"indent":[]}}],"position":{"start":{"line":140,"column":3,"offset":4121},"end":{"line":140,"column":76,"offset":4194},"indent":[]}}],"position":{"start":{"line":140,"column":1,"offset":4119},"end":{"line":140,"column":76,"offset":4194},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":3886},"end":{"line":140,"column":76,"offset":4194},"indent":[1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":142,"column":6,"offset":4201},"end":{"line":142,"column":12,"offset":4207},"indent":[]}}],"position":{"start":{"line":142,"column":1,"offset":4196},"end":{"line":142,"column":12,"offset":4207},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fix SSL support ","position":{"start":{"line":144,"column":3,"offset":4211},"end":{"line":144,"column":19,"offset":4227},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/docker/issues/4","children":[{"type":"text","value":"#4","position":{"start":{"line":144,"column":20,"offset":4228},"end":{"line":144,"column":22,"offset":4230},"indent":[]}}],"position":{"start":{"line":144,"column":19,"offset":4227},"end":{"line":144,"column":71,"offset":4279},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":144,"column":71,"offset":4279},"end":{"line":144,"column":72,"offset":4280},"indent":[]}}],"position":{"start":{"line":144,"column":3,"offset":4211},"end":{"line":144,"column":72,"offset":4280},"indent":[]}}],"position":{"start":{"line":144,"column":1,"offset":4209},"end":{"line":144,"column":72,"offset":4280},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Auto removal if disk is full.","position":{"start":{"line":145,"column":3,"offset":4283},"end":{"line":145,"column":32,"offset":4312},"indent":[]}}],"position":{"start":{"line":145,"column":3,"offset":4283},"end":{"line":145,"column":32,"offset":4312},"indent":[]}}],"position":{"start":{"line":145,"column":1,"offset":4281},"end":{"line":145,"column":32,"offset":4312},"indent":[]}}],"position":{"start":{"line":144,"column":1,"offset":4209},"end":{"line":145,"column":32,"offset":4312},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":147,"column":6,"offset":4319},"end":{"line":147,"column":15,"offset":4328},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4314},"end":{"line":147,"column":15,"offset":4328},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"OpenMAX IL hardware encoding for Raspberry Pi camera. ","position":{"start":{"line":149,"column":3,"offset":4332},"end":{"line":149,"column":57,"offset":4386},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/83","children":[{"type":"text","value":"#83","position":{"start":{"line":149,"column":58,"offset":4387},"end":{"line":149,"column":61,"offset":4390},"indent":[]}}],"position":{"start":{"line":149,"column":57,"offset":4386},"end":{"line":149,"column":114,"offset":4443},"indent":[]}}],"position":{"start":{"line":149,"column":3,"offset":4332},"end":{"line":149,"column":114,"offset":4443},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimized live streaming.","position":{"start":{"line":150,"column":5,"offset":4448},"end":{"line":150,"column":30,"offset":4473},"indent":[]}}],"position":{"start":{"line":150,"column":5,"offset":4448},"end":{"line":150,"column":30,"offset":4473},"indent":[]}}],"position":{"start":{"line":150,"column":3,"offset":4446},"end":{"line":150,"column":30,"offset":4473},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimized h264 recording.","position":{"start":{"line":151,"column":5,"offset":4478},"end":{"line":151,"column":30,"offset":4503},"indent":[]}}],"position":{"start":{"line":151,"column":5,"offset":4478},"end":{"line":151,"column":30,"offset":4503},"indent":[]}}],"position":{"start":{"line":151,"column":3,"offset":4476},"end":{"line":151,"column":30,"offset":4503},"indent":[]}}],"position":{"start":{"line":150,"column":3,"offset":4446},"end":{"line":151,"column":30,"offset":4503},"indent":[3]}}],"position":{"start":{"line":149,"column":1,"offset":4330},"end":{"line":151,"column":30,"offset":4503},"indent":[1,1]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Basic authentication for live streaming (username and password). ","position":{"start":{"line":152,"column":3,"offset":4506},"end":{"line":152,"column":68,"offset":4571},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/80","children":[{"type":"text","value":"#80","position":{"start":{"line":152,"column":69,"offset":4572},"end":{"line":152,"column":72,"offset":4575},"indent":[]}}],"position":{"start":{"line":152,"column":68,"offset":4571},"end":{"line":152,"column":125,"offset":4628},"indent":[]}}],"position":{"start":{"line":152,"column":3,"offset":4506},"end":{"line":152,"column":125,"offset":4628},"indent":[]}}],"position":{"start":{"line":152,"column":1,"offset":4504},"end":{"line":152,"column":125,"offset":4628},"indent":[]}}],"position":{"start":{"line":149,"column":1,"offset":4330},"end":{"line":152,"column":125,"offset":4628},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.3.1","position":{"start":{"line":154,"column":5,"offset":4634},"end":{"line":154,"column":10,"offset":4639},"indent":[]}}],"position":{"start":{"line":154,"column":1,"offset":4630},"end":{"line":154,"column":10,"offset":4639},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":156,"column":6,"offset":4646},"end":{"line":156,"column":15,"offset":4655},"indent":[]}}],"position":{"start":{"line":156,"column":1,"offset":4641},"end":{"line":156,"column":15,"offset":4655},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Update for kerberos.cloud: pushing content-type.","position":{"start":{"line":158,"column":3,"offset":4659},"end":{"line":158,"column":51,"offset":4707},"indent":[]}}],"position":{"start":{"line":158,"column":3,"offset":4659},"end":{"line":158,"column":51,"offset":4707},"indent":[]}}],"position":{"start":{"line":158,"column":1,"offset":4657},"end":{"line":158,"column":51,"offset":4707},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Change default configurations.","position":{"start":{"line":159,"column":3,"offset":4710},"end":{"line":159,"column":33,"offset":4740},"indent":[]}}],"position":{"start":{"line":159,"column":3,"offset":4710},"end":{"line":159,"column":33,"offset":4740},"indent":[]}}],"position":{"start":{"line":159,"column":1,"offset":4708},"end":{"line":159,"column":33,"offset":4740},"indent":[]}}],"position":{"start":{"line":158,"column":1,"offset":4657},"end":{"line":159,"column":33,"offset":4740},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.3.0","position":{"start":{"line":161,"column":5,"offset":4746},"end":{"line":161,"column":10,"offset":4751},"indent":[]}}],"position":{"start":{"line":161,"column":1,"offset":4742},"end":{"line":161,"column":10,"offset":4751},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":163,"column":6,"offset":4758},"end":{"line":163,"column":15,"offset":4767},"indent":[]}}],"position":{"start":{"line":163,"column":1,"offset":4753},"end":{"line":163,"column":15,"offset":4767},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for Raspberry Pi Zero W. ","position":{"start":{"line":165,"column":3,"offset":4771},"end":{"line":165,"column":36,"offset":4804},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/8","children":[{"type":"text","value":"#8","position":{"start":{"line":165,"column":37,"offset":4805},"end":{"line":165,"column":39,"offset":4807},"indent":[]}}],"position":{"start":{"line":165,"column":36,"offset":4804},"end":{"line":165,"column":86,"offset":4854},"indent":[]}}],"position":{"start":{"line":165,"column":3,"offset":4771},"end":{"line":165,"column":86,"offset":4854},"indent":[]}}],"position":{"start":{"line":165,"column":1,"offset":4769},"end":{"line":165,"column":86,"offset":4854},"indent":[]}}],"position":{"start":{"line":165,"column":1,"offset":4769},"end":{"line":165,"column":86,"offset":4854},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.2.1","position":{"start":{"line":167,"column":5,"offset":4860},"end":{"line":167,"column":10,"offset":4865},"indent":[]}}],"position":{"start":{"line":167,"column":1,"offset":4856},"end":{"line":167,"column":10,"offset":4865},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":169,"column":6,"offset":4872},"end":{"line":169,"column":15,"offset":4881},"indent":[]}}],"position":{"start":{"line":169,"column":1,"offset":4867},"end":{"line":169,"column":15,"offset":4881},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgraded FFmpeg and libx264 on KiOS.","position":{"start":{"line":171,"column":3,"offset":4885},"end":{"line":171,"column":39,"offset":4921},"indent":[]}}],"position":{"start":{"line":171,"column":3,"offset":4885},"end":{"line":171,"column":39,"offset":4921},"indent":[]}}],"position":{"start":{"line":171,"column":1,"offset":4883},"end":{"line":171,"column":39,"offset":4921},"indent":[]}}],"position":{"start":{"line":171,"column":1,"offset":4883},"end":{"line":171,"column":39,"offset":4921},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":173,"column":6,"offset":4928},"end":{"line":173,"column":9,"offset":4931},"indent":[]}}],"position":{"start":{"line":173,"column":1,"offset":4923},"end":{"line":173,"column":9,"offset":4931},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add Bulgarian translation. ","position":{"start":{"line":175,"column":3,"offset":4935},"end":{"line":175,"column":30,"offset":4962},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/pull/81","children":[{"type":"text","value":"#81","position":{"start":{"line":175,"column":31,"offset":4963},"end":{"line":175,"column":34,"offset":4966},"indent":[]}}],"position":{"start":{"line":175,"column":30,"offset":4962},"end":{"line":175,"column":79,"offset":5011},"indent":[]}}],"position":{"start":{"line":175,"column":3,"offset":4935},"end":{"line":175,"column":79,"offset":5011},"indent":[]}}],"position":{"start":{"line":175,"column":1,"offset":4933},"end":{"line":175,"column":79,"offset":5011},"indent":[]}}],"position":{"start":{"line":175,"column":1,"offset":4933},"end":{"line":175,"column":79,"offset":5011},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":177,"column":6,"offset":5018},"end":{"line":177,"column":15,"offset":5027},"indent":[]}}],"position":{"start":{"line":177,"column":1,"offset":5013},"end":{"line":177,"column":15,"offset":5027},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: IoVideo crashes due to a memory leak. ","position":{"start":{"line":179,"column":3,"offset":5031},"end":{"line":179,"column":46,"offset":5074},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/70","children":[{"type":"text","value":"#70","position":{"start":{"line":179,"column":47,"offset":5075},"end":{"line":179,"column":50,"offset":5078},"indent":[]}}],"position":{"start":{"line":179,"column":46,"offset":5074},"end":{"line":179,"column":103,"offset":5131},"indent":[]}}],"position":{"start":{"line":179,"column":3,"offset":5031},"end":{"line":179,"column":103,"offset":5131},"indent":[]}}],"position":{"start":{"line":179,"column":1,"offset":5029},"end":{"line":179,"column":103,"offset":5131},"indent":[]}}],"position":{"start":{"line":179,"column":1,"offset":5029},"end":{"line":179,"column":103,"offset":5131},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.2.0","position":{"start":{"line":181,"column":5,"offset":5137},"end":{"line":181,"column":10,"offset":5142},"indent":[]}}],"position":{"start":{"line":181,"column":1,"offset":5133},"end":{"line":181,"column":10,"offset":5142},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":183,"column":6,"offset":5149},"end":{"line":183,"column":15,"offset":5158},"indent":[]}}],"position":{"start":{"line":183,"column":1,"offset":5144},"end":{"line":183,"column":15,"offset":5158},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added support for Armbian.","position":{"start":{"line":185,"column":3,"offset":5162},"end":{"line":185,"column":29,"offset":5188},"indent":[]}}],"position":{"start":{"line":185,"column":3,"offset":5162},"end":{"line":185,"column":29,"offset":5188},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":5160},"end":{"line":185,"column":29,"offset":5188},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Raspbian: Async requests causes session corruption. ","position":{"start":{"line":186,"column":3,"offset":5191},"end":{"line":186,"column":55,"offset":5243},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/78","children":[{"type":"text","value":"#78","position":{"start":{"line":186,"column":56,"offset":5244},"end":{"line":186,"column":59,"offset":5247},"indent":[]}}],"position":{"start":{"line":186,"column":55,"offset":5243},"end":{"line":186,"column":106,"offset":5294},"indent":[]}}],"position":{"start":{"line":186,"column":3,"offset":5191},"end":{"line":186,"column":106,"offset":5294},"indent":[]}}],"position":{"start":{"line":186,"column":1,"offset":5189},"end":{"line":186,"column":106,"offset":5294},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":5160},"end":{"line":186,"column":106,"offset":5294},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":188,"column":6,"offset":5301},"end":{"line":188,"column":9,"offset":5304},"indent":[]}}],"position":{"start":{"line":188,"column":1,"offset":5296},"end":{"line":188,"column":9,"offset":5304},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: Issue format instance name. ","position":{"start":{"line":190,"column":3,"offset":5308},"end":{"line":190,"column":36,"offset":5341},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/57","children":[{"type":"text","value":"#57","position":{"start":{"line":190,"column":37,"offset":5342},"end":{"line":190,"column":40,"offset":5345},"indent":[]}}],"position":{"start":{"line":190,"column":36,"offset":5341},"end":{"line":190,"column":87,"offset":5392},"indent":[]}}],"position":{"start":{"line":190,"column":3,"offset":5308},"end":{"line":190,"column":87,"offset":5392},"indent":[]}}],"position":{"start":{"line":190,"column":1,"offset":5306},"end":{"line":190,"column":87,"offset":5392},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Redesign settings page (better UX). ","position":{"start":{"line":191,"column":3,"offset":5395},"end":{"line":191,"column":39,"offset":5431},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/39","children":[{"type":"text","value":"#39","position":{"start":{"line":191,"column":40,"offset":5432},"end":{"line":191,"column":43,"offset":5435},"indent":[]}}],"position":{"start":{"line":191,"column":39,"offset":5431},"end":{"line":191,"column":90,"offset":5482},"indent":[]}}],"position":{"start":{"line":191,"column":3,"offset":5395},"end":{"line":191,"column":90,"offset":5482},"indent":[]}}],"position":{"start":{"line":191,"column":1,"offset":5393},"end":{"line":191,"column":90,"offset":5482},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Possibility to edit password through web interface. ","position":{"start":{"line":192,"column":3,"offset":5485},"end":{"line":192,"column":55,"offset":5537},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/63","children":[{"type":"text","value":"#63","position":{"start":{"line":192,"column":56,"offset":5538},"end":{"line":192,"column":59,"offset":5541},"indent":[]}}],"position":{"start":{"line":192,"column":55,"offset":5537},"end":{"line":192,"column":106,"offset":5588},"indent":[]}}],"position":{"start":{"line":192,"column":3,"offset":5485},"end":{"line":192,"column":106,"offset":5588},"indent":[]}}],"position":{"start":{"line":192,"column":1,"offset":5483},"end":{"line":192,"column":106,"offset":5588},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for viewing videos.","position":{"start":{"line":193,"column":3,"offset":5591},"end":{"line":193,"column":30,"offset":5618},"indent":[]}}],"position":{"start":{"line":193,"column":3,"offset":5591},"end":{"line":193,"column":30,"offset":5618},"indent":[]}}],"position":{"start":{"line":193,"column":1,"offset":5589},"end":{"line":193,"column":30,"offset":5618},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Update radius of heatmap.","position":{"start":{"line":194,"column":3,"offset":5621},"end":{"line":194,"column":28,"offset":5646},"indent":[]}}],"position":{"start":{"line":194,"column":3,"offset":5621},"end":{"line":194,"column":28,"offset":5646},"indent":[]}}],"position":{"start":{"line":194,"column":1,"offset":5619},"end":{"line":194,"column":28,"offset":5646},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"PHP7 support. ","position":{"start":{"line":195,"column":3,"offset":5649},"end":{"line":195,"column":17,"offset":5663},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/60","children":[{"type":"text","value":"#60","position":{"start":{"line":195,"column":18,"offset":5664},"end":{"line":195,"column":21,"offset":5667},"indent":[]}}],"position":{"start":{"line":195,"column":17,"offset":5663},"end":{"line":195,"column":68,"offset":5714},"indent":[]}}],"position":{"start":{"line":195,"column":3,"offset":5649},"end":{"line":195,"column":68,"offset":5714},"indent":[]}}],"position":{"start":{"line":195,"column":1,"offset":5647},"end":{"line":195,"column":68,"offset":5714},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Welcome/installation page. ","position":{"start":{"line":196,"column":3,"offset":5717},"end":{"line":196,"column":30,"offset":5744},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/60","children":[{"type":"text","value":"#60","position":{"start":{"line":196,"column":31,"offset":5745},"end":{"line":196,"column":34,"offset":5748},"indent":[]}}],"position":{"start":{"line":196,"column":30,"offset":5744},"end":{"line":196,"column":81,"offset":5795},"indent":[]}}],"position":{"start":{"line":196,"column":3,"offset":5717},"end":{"line":196,"column":81,"offset":5795},"indent":[]}}],"position":{"start":{"line":196,"column":1,"offset":5715},"end":{"line":196,"column":81,"offset":5795},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Translation updated. ","position":{"start":{"line":197,"column":3,"offset":5798},"end":{"line":197,"column":24,"offset":5819},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/74","children":[{"type":"text","value":"#74","position":{"start":{"line":197,"column":25,"offset":5820},"end":{"line":197,"column":28,"offset":5823},"indent":[]}}],"position":{"start":{"line":197,"column":24,"offset":5819},"end":{"line":197,"column":75,"offset":5870},"indent":[]}}],"position":{"start":{"line":197,"column":3,"offset":5798},"end":{"line":197,"column":75,"offset":5870},"indent":[]}}],"position":{"start":{"line":197,"column":1,"offset":5796},"end":{"line":197,"column":75,"offset":5870},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Privacy mode. ","position":{"start":{"line":198,"column":3,"offset":5873},"end":{"line":198,"column":17,"offset":5887},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/54","children":[{"type":"text","value":"#54","position":{"start":{"line":198,"column":18,"offset":5888},"end":{"line":198,"column":21,"offset":5891},"indent":[]}}],"position":{"start":{"line":198,"column":17,"offset":5887},"end":{"line":198,"column":68,"offset":5938},"indent":[]}}],"position":{"start":{"line":198,"column":3,"offset":5873},"end":{"line":198,"column":68,"offset":5938},"indent":[]}}],"position":{"start":{"line":198,"column":1,"offset":5871},"end":{"line":198,"column":68,"offset":5938},"indent":[]}}],"position":{"start":{"line":190,"column":1,"offset":5306},"end":{"line":198,"column":68,"offset":5938},"indent":[1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":200,"column":6,"offset":5945},"end":{"line":200,"column":15,"offset":5954},"indent":[]}}],"position":{"start":{"line":200,"column":1,"offset":5940},"end":{"line":200,"column":15,"offset":5954},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Output as video file. ","position":{"start":{"line":202,"column":3,"offset":5958},"end":{"line":202,"column":25,"offset":5980},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/60","children":[{"type":"text","value":"#60","position":{"start":{"line":202,"column":26,"offset":5981},"end":{"line":202,"column":29,"offset":5984},"indent":[]}}],"position":{"start":{"line":202,"column":25,"offset":5980},"end":{"line":202,"column":82,"offset":6037},"indent":[]}}],"position":{"start":{"line":202,"column":3,"offset":5958},"end":{"line":202,"column":82,"offset":6037},"indent":[]}}],"position":{"start":{"line":202,"column":1,"offset":5956},"end":{"line":202,"column":82,"offset":6037},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: System hangs when a wrong IP camera url was defined. ","position":{"start":{"line":203,"column":3,"offset":6040},"end":{"line":203,"column":61,"offset":6098},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/48","children":[{"type":"text","value":"#48","position":{"start":{"line":203,"column":62,"offset":6099},"end":{"line":203,"column":65,"offset":6102},"indent":[]}}],"position":{"start":{"line":203,"column":61,"offset":6098},"end":{"line":203,"column":118,"offset":6155},"indent":[]}}],"position":{"start":{"line":203,"column":3,"offset":6040},"end":{"line":203,"column":118,"offset":6155},"indent":[]}}],"position":{"start":{"line":203,"column":1,"offset":6038},"end":{"line":203,"column":118,"offset":6155},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Run arbitrary script/program. ","position":{"start":{"line":204,"column":3,"offset":6158},"end":{"line":204,"column":33,"offset":6188},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/31","children":[{"type":"text","value":"#31","position":{"start":{"line":204,"column":34,"offset":6189},"end":{"line":204,"column":37,"offset":6192},"indent":[]}}],"position":{"start":{"line":204,"column":33,"offset":6188},"end":{"line":204,"column":90,"offset":6245},"indent":[]}}],"position":{"start":{"line":204,"column":3,"offset":6158},"end":{"line":204,"column":90,"offset":6245},"indent":[]}}],"position":{"start":{"line":204,"column":1,"offset":6156},"end":{"line":204,"column":90,"offset":6245},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: Weird colors from RPi Camera. ","position":{"start":{"line":205,"column":3,"offset":6248},"end":{"line":205,"column":38,"offset":6283},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/64","children":[{"type":"text","value":"#64","position":{"start":{"line":205,"column":39,"offset":6284},"end":{"line":205,"column":42,"offset":6287},"indent":[]}}],"position":{"start":{"line":205,"column":38,"offset":6283},"end":{"line":205,"column":95,"offset":6340},"indent":[]}}],"position":{"start":{"line":205,"column":3,"offset":6248},"end":{"line":205,"column":95,"offset":6340},"indent":[]}}],"position":{"start":{"line":205,"column":1,"offset":6246},"end":{"line":205,"column":95,"offset":6340},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgrade to OpenCV 3.2.0.","position":{"start":{"line":206,"column":3,"offset":6343},"end":{"line":206,"column":27,"offset":6367},"indent":[]}}],"position":{"start":{"line":206,"column":3,"offset":6343},"end":{"line":206,"column":27,"offset":6367},"indent":[]}}],"position":{"start":{"line":206,"column":1,"offset":6341},"end":{"line":206,"column":27,"offset":6367},"indent":[]}}],"position":{"start":{"line":202,"column":1,"offset":5956},"end":{"line":206,"column":27,"offset":6367},"indent":[1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.1.0","position":{"start":{"line":208,"column":5,"offset":6373},"end":{"line":208,"column":10,"offset":6378},"indent":[]}}],"position":{"start":{"line":208,"column":1,"offset":6369},"end":{"line":208,"column":10,"offset":6378},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":210,"column":6,"offset":6385},"end":{"line":210,"column":9,"offset":6388},"indent":[]}}],"position":{"start":{"line":210,"column":1,"offset":6380},"end":{"line":210,"column":9,"offset":6388},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added PhotoSwipe for image overview (easier to browse through images). ","position":{"start":{"line":212,"column":3,"offset":6392},"end":{"line":212,"column":74,"offset":6463},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/45","children":[{"type":"text","value":"#45","position":{"start":{"line":212,"column":75,"offset":6464},"end":{"line":212,"column":78,"offset":6467},"indent":[]}}],"position":{"start":{"line":212,"column":74,"offset":6463},"end":{"line":212,"column":125,"offset":6514},"indent":[]}}],"position":{"start":{"line":212,"column":3,"offset":6392},"end":{"line":212,"column":125,"offset":6514},"indent":[]}}],"position":{"start":{"line":212,"column":1,"offset":6390},"end":{"line":212,"column":125,"offset":6514},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added reboot and shutdown commands. ","position":{"start":{"line":213,"column":3,"offset":6517},"end":{"line":213,"column":39,"offset":6553},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/46","children":[{"type":"text","value":"#46","position":{"start":{"line":213,"column":40,"offset":6554},"end":{"line":213,"column":43,"offset":6557},"indent":[]}}],"position":{"start":{"line":213,"column":39,"offset":6553},"end":{"line":213,"column":90,"offset":6604},"indent":[]}}],"position":{"start":{"line":213,"column":3,"offset":6517},"end":{"line":213,"column":90,"offset":6604},"indent":[]}}],"position":{"start":{"line":213,"column":1,"offset":6515},"end":{"line":213,"column":90,"offset":6604},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added logging view to system page. ","position":{"start":{"line":214,"column":3,"offset":6607},"end":{"line":214,"column":38,"offset":6642},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/33","children":[{"type":"text","value":"#33","position":{"start":{"line":214,"column":39,"offset":6643},"end":{"line":214,"column":42,"offset":6646},"indent":[]}}],"position":{"start":{"line":214,"column":38,"offset":6642},"end":{"line":214,"column":89,"offset":6693},"indent":[]}}],"position":{"start":{"line":214,"column":3,"offset":6607},"end":{"line":214,"column":89,"offset":6693},"indent":[]}}],"position":{"start":{"line":214,"column":1,"offset":6605},"end":{"line":214,"column":89,"offset":6693},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added labels to check if machinery is running.","position":{"start":{"line":215,"column":3,"offset":6696},"end":{"line":215,"column":49,"offset":6742},"indent":[]}}],"position":{"start":{"line":215,"column":3,"offset":6696},"end":{"line":215,"column":49,"offset":6742},"indent":[]}}],"position":{"start":{"line":215,"column":1,"offset":6694},"end":{"line":215,"column":49,"offset":6742},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added error handling if web interface isn’t working properly.","position":{"start":{"line":216,"column":3,"offset":6745},"end":{"line":216,"column":64,"offset":6806},"indent":[]}}],"position":{"start":{"line":216,"column":3,"offset":6745},"end":{"line":216,"column":64,"offset":6806},"indent":[]}}],"position":{"start":{"line":216,"column":1,"offset":6743},"end":{"line":216,"column":64,"offset":6806},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed Heatmap.js fail to load by ad-blocker. ","position":{"start":{"line":217,"column":3,"offset":6809},"end":{"line":217,"column":48,"offset":6854},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/42","children":[{"type":"text","value":"#42","position":{"start":{"line":217,"column":49,"offset":6855},"end":{"line":217,"column":52,"offset":6858},"indent":[]}}],"position":{"start":{"line":217,"column":48,"offset":6854},"end":{"line":217,"column":99,"offset":6905},"indent":[]}}],"position":{"start":{"line":217,"column":3,"offset":6809},"end":{"line":217,"column":99,"offset":6905},"indent":[]}}],"position":{"start":{"line":217,"column":1,"offset":6807},"end":{"line":217,"column":99,"offset":6905},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Show additional information on the dashboard (streaming is opening or not) there is no data available.","position":{"start":{"line":218,"column":3,"offset":6908},"end":{"line":218,"column":105,"offset":7010},"indent":[]}}],"position":{"start":{"line":218,"column":3,"offset":6908},"end":{"line":218,"column":105,"offset":7010},"indent":[]}}],"position":{"start":{"line":218,"column":1,"offset":6906},"end":{"line":218,"column":105,"offset":7010},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Settings page is now visible on mobile (+ changed icon).","position":{"start":{"line":219,"column":3,"offset":7013},"end":{"line":219,"column":59,"offset":7069},"indent":[]}}],"position":{"start":{"line":219,"column":3,"offset":7013},"end":{"line":219,"column":59,"offset":7069},"indent":[]}}],"position":{"start":{"line":219,"column":1,"offset":7011},"end":{"line":219,"column":59,"offset":7069},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed sorting of news articles.","position":{"start":{"line":220,"column":3,"offset":7072},"end":{"line":220,"column":34,"offset":7103},"indent":[]}}],"position":{"start":{"line":220,"column":3,"offset":7072},"end":{"line":220,"column":34,"offset":7103},"indent":[]}}],"position":{"start":{"line":220,"column":1,"offset":7070},"end":{"line":220,"column":34,"offset":7103},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Removed links to assets in the cloud (.css files).","position":{"start":{"line":221,"column":3,"offset":7106},"end":{"line":221,"column":53,"offset":7156},"indent":[]}}],"position":{"start":{"line":221,"column":3,"offset":7106},"end":{"line":221,"column":53,"offset":7156},"indent":[]}}],"position":{"start":{"line":221,"column":1,"offset":7104},"end":{"line":221,"column":53,"offset":7156},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Design: improved layout of login page, async loading of image view.","position":{"start":{"line":222,"column":3,"offset":7159},"end":{"line":222,"column":70,"offset":7226},"indent":[]}}],"position":{"start":{"line":222,"column":3,"offset":7159},"end":{"line":222,"column":70,"offset":7226},"indent":[]}}],"position":{"start":{"line":222,"column":1,"offset":7157},"end":{"line":222,"column":70,"offset":7226},"indent":[]}}],"position":{"start":{"line":212,"column":1,"offset":6390},"end":{"line":222,"column":70,"offset":7226},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":224,"column":6,"offset":7233},"end":{"line":224,"column":15,"offset":7242},"indent":[]}}],"position":{"start":{"line":224,"column":1,"offset":7228},"end":{"line":224,"column":15,"offset":7242},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added configurable streaming port and quality. ","position":{"start":{"line":226,"column":3,"offset":7246},"end":{"line":226,"column":50,"offset":7293},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/41","children":[{"type":"text","value":"#41","position":{"start":{"line":226,"column":51,"offset":7294},"end":{"line":226,"column":54,"offset":7297},"indent":[]}}],"position":{"start":{"line":226,"column":50,"offset":7293},"end":{"line":226,"column":107,"offset":7350},"indent":[]}}],"position":{"start":{"line":226,"column":3,"offset":7246},"end":{"line":226,"column":107,"offset":7350},"indent":[]}}],"position":{"start":{"line":226,"column":1,"offset":7244},"end":{"line":226,"column":107,"offset":7350},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added new algorithm: Background subtraction.","position":{"start":{"line":227,"column":3,"offset":7353},"end":{"line":227,"column":47,"offset":7397},"indent":[]}}],"position":{"start":{"line":227,"column":3,"offset":7353},"end":{"line":227,"column":47,"offset":7397},"indent":[]}}],"position":{"start":{"line":227,"column":1,"offset":7351},"end":{"line":227,"column":47,"offset":7397},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added new heuristic: Counter (for object/people counting). ","position":{"start":{"line":228,"column":3,"offset":7400},"end":{"line":228,"column":62,"offset":7459},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/42","children":[{"type":"text","value":"#42","position":{"start":{"line":228,"column":63,"offset":7460},"end":{"line":228,"column":66,"offset":7463},"indent":[]}}],"position":{"start":{"line":228,"column":62,"offset":7459},"end":{"line":228,"column":119,"offset":7516},"indent":[]}}],"position":{"start":{"line":228,"column":3,"offset":7400},"end":{"line":228,"column":119,"offset":7516},"indent":[]}}],"position":{"start":{"line":228,"column":1,"offset":7398},"end":{"line":228,"column":119,"offset":7516},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added video capture, which can be used for debugging purposes (replay a video fragment).","position":{"start":{"line":229,"column":3,"offset":7519},"end":{"line":229,"column":91,"offset":7607},"indent":[]}}],"position":{"start":{"line":229,"column":3,"offset":7519},"end":{"line":229,"column":91,"offset":7607},"indent":[]}}],"position":{"start":{"line":229,"column":1,"offset":7517},"end":{"line":229,"column":91,"offset":7607},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"It’s now possible to mark the images with a timestamp. ","position":{"start":{"line":230,"column":3,"offset":7610},"end":{"line":230,"column":58,"offset":7665},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/36","children":[{"type":"text","value":"#36","position":{"start":{"line":230,"column":59,"offset":7666},"end":{"line":230,"column":62,"offset":7669},"indent":[]}}],"position":{"start":{"line":230,"column":58,"offset":7665},"end":{"line":230,"column":115,"offset":7722},"indent":[]}}],"position":{"start":{"line":230,"column":3,"offset":7610},"end":{"line":230,"column":115,"offset":7722},"indent":[]}}],"position":{"start":{"line":230,"column":1,"offset":7608},"end":{"line":230,"column":115,"offset":7722},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed blocking streaming socket. ","position":{"start":{"line":231,"column":3,"offset":7725},"end":{"line":231,"column":36,"offset":7758},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/39","children":[{"type":"text","value":"#39","position":{"start":{"line":231,"column":37,"offset":7759},"end":{"line":231,"column":40,"offset":7762},"indent":[]}}],"position":{"start":{"line":231,"column":36,"offset":7758},"end":{"line":231,"column":93,"offset":7815},"indent":[]}}],"position":{"start":{"line":231,"column":3,"offset":7725},"end":{"line":231,"column":93,"offset":7815},"indent":[]}}],"position":{"start":{"line":231,"column":1,"offset":7723},"end":{"line":231,"column":93,"offset":7815},"indent":[]}}],"position":{"start":{"line":226,"column":1,"offset":7244},"end":{"line":231,"column":93,"offset":7815},"indent":[1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":233,"column":6,"offset":7822},"end":{"line":233,"column":15,"offset":7831},"indent":[]}}],"position":{"start":{"line":233,"column":1,"offset":7817},"end":{"line":233,"column":15,"offset":7831},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fix removal images if disk is almost full (wrong path was defined).","position":{"start":{"line":235,"column":3,"offset":7835},"end":{"line":235,"column":70,"offset":7902},"indent":[]}}],"position":{"start":{"line":235,"column":3,"offset":7835},"end":{"line":235,"column":70,"offset":7902},"indent":[]}}],"position":{"start":{"line":235,"column":1,"offset":7833},"end":{"line":235,"column":70,"offset":7902},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi Camera module v2.1. ","position":{"start":{"line":236,"column":3,"offset":7905},"end":{"line":236,"column":52,"offset":7954},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/3","children":[{"type":"text","value":"#3","position":{"start":{"line":236,"column":53,"offset":7955},"end":{"line":236,"column":55,"offset":7957},"indent":[]}}],"position":{"start":{"line":236,"column":52,"offset":7954},"end":{"line":236,"column":102,"offset":8004},"indent":[]}}],"position":{"start":{"line":236,"column":3,"offset":7905},"end":{"line":236,"column":102,"offset":8004},"indent":[]}}],"position":{"start":{"line":236,"column":1,"offset":7903},"end":{"line":236,"column":102,"offset":8004},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi Zero; updated kernel to latest Raspbian. ","position":{"start":{"line":237,"column":3,"offset":8007},"end":{"line":237,"column":73,"offset":8077},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/3","children":[{"type":"text","value":"#3","position":{"start":{"line":237,"column":74,"offset":8078},"end":{"line":237,"column":76,"offset":8080},"indent":[]}}],"position":{"start":{"line":237,"column":73,"offset":8077},"end":{"line":237,"column":123,"offset":8127},"indent":[]}}],"position":{"start":{"line":237,"column":3,"offset":8007},"end":{"line":237,"column":123,"offset":8127},"indent":[]}}],"position":{"start":{"line":237,"column":1,"offset":8005},"end":{"line":237,"column":123,"offset":8127},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"KiOS GUI installer.","position":{"start":{"line":238,"column":3,"offset":8130},"end":{"line":238,"column":22,"offset":8149},"indent":[]}}],"position":{"start":{"line":238,"column":3,"offset":8130},"end":{"line":238,"column":22,"offset":8149},"indent":[]}}],"position":{"start":{"line":238,"column":1,"offset":8128},"end":{"line":238,"column":22,"offset":8149},"indent":[]}}],"position":{"start":{"line":235,"column":1,"offset":7833},"end":{"line":238,"column":22,"offset":8149},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.0.0","position":{"start":{"line":240,"column":5,"offset":8155},"end":{"line":240,"column":10,"offset":8160},"indent":[]}}],"position":{"start":{"line":240,"column":1,"offset":8151},"end":{"line":240,"column":10,"offset":8160},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":242,"column":6,"offset":8167},"end":{"line":242,"column":9,"offset":8170},"indent":[]}}],"position":{"start":{"line":242,"column":1,"offset":8162},"end":{"line":242,"column":9,"offset":8170},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add simple ON/OFF toggle. ","position":{"start":{"line":244,"column":3,"offset":8174},"end":{"line":244,"column":29,"offset":8200},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/24","children":[{"type":"text","value":"#24","position":{"start":{"line":244,"column":30,"offset":8201},"end":{"line":244,"column":33,"offset":8204},"indent":[]}}],"position":{"start":{"line":244,"column":29,"offset":8200},"end":{"line":244,"column":80,"offset":8251},"indent":[]}}],"position":{"start":{"line":244,"column":3,"offset":8174},"end":{"line":244,"column":80,"offset":8251},"indent":[]}}],"position":{"start":{"line":244,"column":1,"offset":8172},"end":{"line":244,"column":80,"offset":8251},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added update strategy when using KiOS. ","position":{"start":{"line":245,"column":3,"offset":8254},"end":{"line":245,"column":42,"offset":8293},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/23","children":[{"type":"text","value":"#23","position":{"start":{"line":245,"column":43,"offset":8294},"end":{"line":245,"column":46,"offset":8297},"indent":[]}}],"position":{"start":{"line":245,"column":42,"offset":8293},"end":{"line":245,"column":93,"offset":8344},"indent":[]}}],"position":{"start":{"line":245,"column":3,"offset":8254},"end":{"line":245,"column":93,"offset":8344},"indent":[]}}],"position":{"start":{"line":245,"column":1,"offset":8252},"end":{"line":245,"column":93,"offset":8344},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"A system page which shows system information. ","position":{"start":{"line":246,"column":3,"offset":8347},"end":{"line":246,"column":49,"offset":8393},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/20","children":[{"type":"text","value":"#20","position":{"start":{"line":246,"column":50,"offset":8394},"end":{"line":246,"column":53,"offset":8397},"indent":[]}}],"position":{"start":{"line":246,"column":49,"offset":8393},"end":{"line":246,"column":100,"offset":8444},"indent":[]}}],"position":{"start":{"line":246,"column":3,"offset":8347},"end":{"line":246,"column":100,"offset":8444},"indent":[]}}],"position":{"start":{"line":246,"column":1,"offset":8345},"end":{"line":246,"column":100,"offset":8444},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Heatmap on dashboard page ","position":{"start":{"line":247,"column":3,"offset":8447},"end":{"line":247,"column":29,"offset":8473},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/19","children":[{"type":"text","value":"#19","position":{"start":{"line":247,"column":30,"offset":8474},"end":{"line":247,"column":33,"offset":8477},"indent":[]}}],"position":{"start":{"line":247,"column":29,"offset":8473},"end":{"line":247,"column":80,"offset":8524},"indent":[]}}],"position":{"start":{"line":247,"column":3,"offset":8447},"end":{"line":247,"column":80,"offset":8524},"indent":[]}}],"position":{"start":{"line":247,"column":1,"offset":8445},"end":{"line":247,"column":80,"offset":8524},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added live stream view on the dashboard page ","position":{"start":{"line":248,"column":3,"offset":8527},"end":{"line":248,"column":48,"offset":8572},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/2","children":[{"type":"text","value":"#2","position":{"start":{"line":248,"column":49,"offset":8573},"end":{"line":248,"column":51,"offset":8575},"indent":[]}}],"position":{"start":{"line":248,"column":48,"offset":8572},"end":{"line":248,"column":97,"offset":8621},"indent":[]}}],"position":{"start":{"line":248,"column":3,"offset":8527},"end":{"line":248,"column":97,"offset":8621},"indent":[]}}],"position":{"start":{"line":248,"column":1,"offset":8525},"end":{"line":248,"column":97,"offset":8621},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed bug cloud syncing ","position":{"start":{"line":249,"column":3,"offset":8624},"end":{"line":249,"column":27,"offset":8648},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/16","children":[{"type":"text","value":"#16","position":{"start":{"line":249,"column":28,"offset":8649},"end":{"line":249,"column":31,"offset":8652},"indent":[]}}],"position":{"start":{"line":249,"column":27,"offset":8648},"end":{"line":249,"column":78,"offset":8699},"indent":[]}}],"position":{"start":{"line":249,"column":3,"offset":8624},"end":{"line":249,"column":78,"offset":8699},"indent":[]}}],"position":{"start":{"line":249,"column":1,"offset":8622},"end":{"line":249,"column":78,"offset":8699},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed broken settings page when space in instane name ","position":{"start":{"line":250,"column":3,"offset":8702},"end":{"line":250,"column":57,"offset":8756},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/16","children":[{"type":"text","value":"#16","position":{"start":{"line":250,"column":58,"offset":8757},"end":{"line":250,"column":61,"offset":8760},"indent":[]}}],"position":{"start":{"line":250,"column":57,"offset":8756},"end":{"line":250,"column":108,"offset":8807},"indent":[]}}],"position":{"start":{"line":250,"column":3,"offset":8702},"end":{"line":250,"column":108,"offset":8807},"indent":[]}}],"position":{"start":{"line":250,"column":1,"offset":8700},"end":{"line":250,"column":108,"offset":8807},"indent":[]}}],"position":{"start":{"line":244,"column":1,"offset":8172},"end":{"line":250,"column":108,"offset":8807},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":252,"column":6,"offset":8814},"end":{"line":252,"column":15,"offset":8823},"indent":[]}}],"position":{"start":{"line":252,"column":1,"offset":8809},"end":{"line":252,"column":15,"offset":8823},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"RTSP support for IP-camera's. ","position":{"start":{"line":254,"column":3,"offset":8827},"end":{"line":254,"column":33,"offset":8857},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/21","children":[{"type":"text","value":"#21","position":{"start":{"line":254,"column":34,"offset":8858},"end":{"line":254,"column":37,"offset":8861},"indent":[]}}],"position":{"start":{"line":254,"column":33,"offset":8857},"end":{"line":254,"column":90,"offset":8914},"indent":[]}}],"position":{"start":{"line":254,"column":3,"offset":8827},"end":{"line":254,"column":90,"offset":8914},"indent":[]}}],"position":{"start":{"line":254,"column":1,"offset":8825},"end":{"line":254,"column":90,"offset":8914},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Verbose logging. ","position":{"start":{"line":255,"column":3,"offset":8917},"end":{"line":255,"column":20,"offset":8934},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/35","children":[{"type":"text","value":"#35","position":{"start":{"line":255,"column":21,"offset":8935},"end":{"line":255,"column":24,"offset":8938},"indent":[]}}],"position":{"start":{"line":255,"column":20,"offset":8934},"end":{"line":255,"column":77,"offset":8991},"indent":[]}}],"position":{"start":{"line":255,"column":3,"offset":8917},"end":{"line":255,"column":77,"offset":8991},"indent":[]}}],"position":{"start":{"line":255,"column":1,"offset":8915},"end":{"line":255,"column":77,"offset":8991},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"IO-devices are executed in a seperate thread. ","position":{"start":{"line":256,"column":3,"offset":8994},"end":{"line":256,"column":49,"offset":9040},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/28","children":[{"type":"text","value":"#28","position":{"start":{"line":256,"column":50,"offset":9041},"end":{"line":256,"column":53,"offset":9044},"indent":[]}}],"position":{"start":{"line":256,"column":49,"offset":9040},"end":{"line":256,"column":106,"offset":9097},"indent":[]}}],"position":{"start":{"line":256,"column":3,"offset":8994},"end":{"line":256,"column":106,"offset":9097},"indent":[]}}],"position":{"start":{"line":256,"column":1,"offset":8992},"end":{"line":256,"column":106,"offset":9097},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Live streaming (MJPEG). ","position":{"start":{"line":257,"column":3,"offset":9100},"end":{"line":257,"column":27,"offset":9124},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/26","children":[{"type":"text","value":"#26","position":{"start":{"line":257,"column":28,"offset":9125},"end":{"line":257,"column":31,"offset":9128},"indent":[]}}],"position":{"start":{"line":257,"column":27,"offset":9124},"end":{"line":257,"column":84,"offset":9181},"indent":[]}}],"position":{"start":{"line":257,"column":3,"offset":9100},"end":{"line":257,"column":84,"offset":9181},"indent":[]}}],"position":{"start":{"line":257,"column":1,"offset":9098},"end":{"line":257,"column":84,"offset":9181},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Execute multiple instances on a machine. ","position":{"start":{"line":258,"column":3,"offset":9184},"end":{"line":258,"column":44,"offset":9225},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/24","children":[{"type":"text","value":"#24","position":{"start":{"line":258,"column":45,"offset":9226},"end":{"line":258,"column":48,"offset":9229},"indent":[]}}],"position":{"start":{"line":258,"column":44,"offset":9225},"end":{"line":258,"column":101,"offset":9282},"indent":[]}}],"position":{"start":{"line":258,"column":3,"offset":9184},"end":{"line":258,"column":101,"offset":9282},"indent":[]}}],"position":{"start":{"line":258,"column":1,"offset":9182},"end":{"line":258,"column":101,"offset":9282},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Override config by arguments. ","position":{"start":{"line":259,"column":3,"offset":9285},"end":{"line":259,"column":33,"offset":9315},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/22","children":[{"type":"text","value":"#22","position":{"start":{"line":259,"column":34,"offset":9316},"end":{"line":259,"column":37,"offset":9319},"indent":[]}}],"position":{"start":{"line":259,"column":33,"offset":9315},"end":{"line":259,"column":90,"offset":9372},"indent":[]}}],"position":{"start":{"line":259,"column":3,"offset":9285},"end":{"line":259,"column":90,"offset":9372},"indent":[]}}],"position":{"start":{"line":259,"column":1,"offset":9283},"end":{"line":259,"column":90,"offset":9372},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Move S3 upload to machinery and remove sync-s3 repository. ","position":{"start":{"line":260,"column":3,"offset":9375},"end":{"line":260,"column":62,"offset":9434},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/16","children":[{"type":"text","value":"#16","position":{"start":{"line":260,"column":63,"offset":9435},"end":{"line":260,"column":66,"offset":9438},"indent":[]}}],"position":{"start":{"line":260,"column":62,"offset":9434},"end":{"line":260,"column":119,"offset":9491},"indent":[]}}],"position":{"start":{"line":260,"column":3,"offset":9375},"end":{"line":260,"column":119,"offset":9491},"indent":[]}}],"position":{"start":{"line":260,"column":1,"offset":9373},"end":{"line":260,"column":119,"offset":9491},"indent":[]}}],"position":{"start":{"line":254,"column":1,"offset":8825},"end":{"line":260,"column":119,"offset":9491},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":262,"column":6,"offset":9498},"end":{"line":262,"column":12,"offset":9504},"indent":[]}}],"position":{"start":{"line":262,"column":1,"offset":9493},"end":{"line":262,"column":12,"offset":9504},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added Docker image (x86_x64) to Docker Hub.","position":{"start":{"line":264,"column":3,"offset":9508},"end":{"line":264,"column":46,"offset":9551},"indent":[]}}],"position":{"start":{"line":264,"column":3,"offset":9508},"end":{"line":264,"column":46,"offset":9551},"indent":[]}}],"position":{"start":{"line":264,"column":1,"offset":9506},"end":{"line":264,"column":46,"offset":9551},"indent":[]}}],"position":{"start":{"line":264,"column":1,"offset":9506},"end":{"line":264,"column":46,"offset":9551},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":266,"column":6,"offset":9558},"end":{"line":266,"column":15,"offset":9567},"indent":[]}}],"position":{"start":{"line":266,"column":1,"offset":9553},"end":{"line":266,"column":15,"offset":9567},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add support for Raspberry Pi 1, 2 and 3. ","position":{"start":{"line":268,"column":3,"offset":9571},"end":{"line":268,"column":44,"offset":9612},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/1","children":[{"type":"text","value":"#1","position":{"start":{"line":268,"column":45,"offset":9613},"end":{"line":268,"column":47,"offset":9615},"indent":[]}}],"position":{"start":{"line":268,"column":44,"offset":9612},"end":{"line":268,"column":94,"offset":9662},"indent":[]}}],"position":{"start":{"line":268,"column":3,"offset":9571},"end":{"line":268,"column":94,"offset":9662},"indent":[]}}],"position":{"start":{"line":268,"column":1,"offset":9569},"end":{"line":268,"column":94,"offset":9662},"indent":[]}}],"position":{"start":{"line":268,"column":1,"offset":9569},"end":{"line":268,"column":94,"offset":9662},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.1.0","position":{"start":{"line":270,"column":5,"offset":9668},"end":{"line":270,"column":10,"offset":9673},"indent":[]}}],"position":{"start":{"line":270,"column":1,"offset":9664},"end":{"line":270,"column":10,"offset":9673},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":272,"column":6,"offset":9680},"end":{"line":272,"column":9,"offset":9683},"indent":[]}}],"position":{"start":{"line":272,"column":1,"offset":9675},"end":{"line":272,"column":9,"offset":9683},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support IP camera's with MJPEG stream. ","position":{"start":{"line":274,"column":3,"offset":9687},"end":{"line":274,"column":42,"offset":9726},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/3","children":[{"type":"text","value":"#3","position":{"start":{"line":274,"column":43,"offset":9727},"end":{"line":274,"column":45,"offset":9729},"indent":[]}}],"position":{"start":{"line":274,"column":42,"offset":9726},"end":{"line":274,"column":91,"offset":9775},"indent":[]}}],"position":{"start":{"line":274,"column":3,"offset":9687},"end":{"line":274,"column":91,"offset":9775},"indent":[]}}],"position":{"start":{"line":274,"column":1,"offset":9685},"end":{"line":274,"column":91,"offset":9775},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Introduce new API methods to configure the machinery, using basic auth. ","position":{"start":{"line":275,"column":3,"offset":9778},"end":{"line":275,"column":75,"offset":9850},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/4","children":[{"type":"text","value":"#4","position":{"start":{"line":275,"column":76,"offset":9851},"end":{"line":275,"column":78,"offset":9853},"indent":[]}}],"position":{"start":{"line":275,"column":75,"offset":9850},"end":{"line":275,"column":124,"offset":9899},"indent":[]}}],"position":{"start":{"line":275,"column":3,"offset":9778},"end":{"line":275,"column":124,"offset":9899},"indent":[]}}],"position":{"start":{"line":275,"column":1,"offset":9776},"end":{"line":275,"column":124,"offset":9899},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimization of loading image and dashboard page, completely redesigned the retrieval of images. ","position":{"start":{"line":276,"column":3,"offset":9902},"end":{"line":276,"column":100,"offset":9999},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/5","children":[{"type":"text","value":"#5","position":{"start":{"line":276,"column":101,"offset":10000},"end":{"line":276,"column":103,"offset":10002},"indent":[]}}],"position":{"start":{"line":276,"column":100,"offset":9999},"end":{"line":276,"column":149,"offset":10048},"indent":[]}}],"position":{"start":{"line":276,"column":3,"offset":9902},"end":{"line":276,"column":149,"offset":10048},"indent":[]}}],"position":{"start":{"line":276,"column":1,"offset":9900},"end":{"line":276,"column":149,"offset":10048},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimization of settings page. ","position":{"start":{"line":277,"column":3,"offset":10051},"end":{"line":277,"column":34,"offset":10082},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/5","children":[{"type":"text","value":"#5","position":{"start":{"line":277,"column":35,"offset":10083},"end":{"line":277,"column":37,"offset":10085},"indent":[]}}],"position":{"start":{"line":277,"column":34,"offset":10082},"end":{"line":277,"column":83,"offset":10131},"indent":[]}}],"position":{"start":{"line":277,"column":3,"offset":10051},"end":{"line":277,"column":83,"offset":10131},"indent":[]}}],"position":{"start":{"line":277,"column":1,"offset":10049},"end":{"line":277,"column":83,"offset":10131},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Timebar gradient only works in Chrome. ","position":{"start":{"line":278,"column":3,"offset":10134},"end":{"line":278,"column":42,"offset":10173},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/6","children":[{"type":"text","value":"#6","position":{"start":{"line":278,"column":43,"offset":10174},"end":{"line":278,"column":45,"offset":10176},"indent":[]}}],"position":{"start":{"line":278,"column":42,"offset":10173},"end":{"line":278,"column":91,"offset":10222},"indent":[]}}],"position":{"start":{"line":278,"column":3,"offset":10134},"end":{"line":278,"column":91,"offset":10222},"indent":[]}}],"position":{"start":{"line":278,"column":1,"offset":10132},"end":{"line":278,"column":91,"offset":10222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Minor CSS fixes for responsive layout.","position":{"start":{"line":279,"column":3,"offset":10225},"end":{"line":279,"column":41,"offset":10263},"indent":[]}}],"position":{"start":{"line":279,"column":3,"offset":10225},"end":{"line":279,"column":41,"offset":10263},"indent":[]}}],"position":{"start":{"line":279,"column":1,"offset":10223},"end":{"line":279,"column":41,"offset":10263},"indent":[]}}],"position":{"start":{"line":274,"column":1,"offset":9685},"end":{"line":279,"column":41,"offset":10263},"indent":[1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":281,"column":6,"offset":10270},"end":{"line":281,"column":15,"offset":10279},"indent":[]}}],"position":{"start":{"line":281,"column":1,"offset":10265},"end":{"line":281,"column":15,"offset":10279},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Flip/rotate option for capture devices. ","position":{"start":{"line":283,"column":3,"offset":10283},"end":{"line":283,"column":43,"offset":10323},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/1","children":[{"type":"text","value":"#5","position":{"start":{"line":283,"column":44,"offset":10324},"end":{"line":283,"column":46,"offset":10326},"indent":[]}}],"position":{"start":{"line":283,"column":43,"offset":10323},"end":{"line":283,"column":98,"offset":10378},"indent":[]}}],"position":{"start":{"line":283,"column":3,"offset":10283},"end":{"line":283,"column":98,"offset":10378},"indent":[]}}],"position":{"start":{"line":283,"column":1,"offset":10281},"end":{"line":283,"column":98,"offset":10378},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support IP camera's with MJPEG stream. ","position":{"start":{"line":284,"column":3,"offset":10381},"end":{"line":284,"column":42,"offset":10420},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/4","children":[{"type":"text","value":"#4","position":{"start":{"line":284,"column":43,"offset":10421},"end":{"line":284,"column":45,"offset":10423},"indent":[]}}],"position":{"start":{"line":284,"column":42,"offset":10420},"end":{"line":284,"column":97,"offset":10475},"indent":[]}}],"position":{"start":{"line":284,"column":3,"offset":10381},"end":{"line":284,"column":97,"offset":10475},"indent":[]}}],"position":{"start":{"line":284,"column":1,"offset":10379},"end":{"line":284,"column":97,"offset":10475},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Introduced webhook io device. ","position":{"start":{"line":285,"column":3,"offset":10478},"end":{"line":285,"column":33,"offset":10508},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/5","children":[{"type":"text","value":"#5","position":{"start":{"line":285,"column":34,"offset":10509},"end":{"line":285,"column":36,"offset":10511},"indent":[]}}],"position":{"start":{"line":285,"column":33,"offset":10508},"end":{"line":285,"column":88,"offset":10563},"indent":[]}}],"position":{"start":{"line":285,"column":3,"offset":10478},"end":{"line":285,"column":88,"offset":10563},"indent":[]}}],"position":{"start":{"line":285,"column":1,"offset":10476},"end":{"line":285,"column":88,"offset":10563},"indent":[]}}],"position":{"start":{"line":283,"column":1,"offset":10281},"end":{"line":285,"column":88,"offset":10563},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Cloud","position":{"start":{"line":287,"column":6,"offset":10570},"end":{"line":287,"column":11,"offset":10575},"indent":[]}}],"position":{"start":{"line":287,"column":1,"offset":10565},"end":{"line":287,"column":11,"offset":10575},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed problem when syncing a huge amount of images. ","position":{"start":{"line":289,"column":3,"offset":10579},"end":{"line":289,"column":55,"offset":10631},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/sync-s3/issues/1","children":[{"type":"text","value":"#1","position":{"start":{"line":289,"column":56,"offset":10632},"end":{"line":289,"column":58,"offset":10634},"indent":[]}}],"position":{"start":{"line":289,"column":55,"offset":10631},"end":{"line":289,"column":108,"offset":10684},"indent":[]}}],"position":{"start":{"line":289,"column":3,"offset":10579},"end":{"line":289,"column":108,"offset":10684},"indent":[]}}],"position":{"start":{"line":289,"column":1,"offset":10577},"end":{"line":289,"column":108,"offset":10684},"indent":[]}}],"position":{"start":{"line":289,"column":1,"offset":10577},"end":{"line":289,"column":108,"offset":10684},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.3","position":{"start":{"line":291,"column":5,"offset":10690},"end":{"line":291,"column":10,"offset":10695},"indent":[]}}],"position":{"start":{"line":291,"column":1,"offset":10686},"end":{"line":291,"column":10,"offset":10695},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":293,"column":6,"offset":10702},"end":{"line":293,"column":9,"offset":10705},"indent":[]}}],"position":{"start":{"line":293,"column":1,"offset":10697},"end":{"line":293,"column":9,"offset":10705},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimize performance, new datastructure has been implemented.","position":{"start":{"line":295,"column":3,"offset":10709},"end":{"line":295,"column":64,"offset":10770},"indent":[]}}],"position":{"start":{"line":295,"column":3,"offset":10709},"end":{"line":295,"column":64,"offset":10770},"indent":[]}}],"position":{"start":{"line":295,"column":1,"offset":10707},"end":{"line":295,"column":64,"offset":10770},"indent":[]}}],"position":{"start":{"line":295,"column":1,"offset":10707},"end":{"line":295,"column":64,"offset":10770},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":297,"column":6,"offset":10777},"end":{"line":297,"column":15,"offset":10786},"indent":[]}}],"position":{"start":{"line":297,"column":1,"offset":10772},"end":{"line":297,"column":15,"offset":10786},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Memory optimization.","position":{"start":{"line":299,"column":3,"offset":10790},"end":{"line":299,"column":23,"offset":10810},"indent":[]}}],"position":{"start":{"line":299,"column":3,"offset":10790},"end":{"line":299,"column":23,"offset":10810},"indent":[]}}],"position":{"start":{"line":299,"column":1,"offset":10788},"end":{"line":299,"column":23,"offset":10810},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Removal of images older than 3 days have been removed.","position":{"start":{"line":300,"column":3,"offset":10813},"end":{"line":300,"column":57,"offset":10867},"indent":[]}}],"position":{"start":{"line":300,"column":3,"offset":10813},"end":{"line":300,"column":57,"offset":10867},"indent":[]}}],"position":{"start":{"line":300,"column":1,"offset":10811},"end":{"line":300,"column":57,"offset":10867},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Start machinery automatically (delay has been removed).","position":{"start":{"line":301,"column":3,"offset":10870},"end":{"line":301,"column":58,"offset":10925},"indent":[]}}],"position":{"start":{"line":301,"column":3,"offset":10870},"end":{"line":301,"column":58,"offset":10925},"indent":[]}}],"position":{"start":{"line":301,"column":1,"offset":10868},"end":{"line":301,"column":58,"offset":10925},"indent":[]}}],"position":{"start":{"line":299,"column":1,"offset":10788},"end":{"line":301,"column":58,"offset":10925},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Cloud","position":{"start":{"line":303,"column":6,"offset":10932},"end":{"line":303,"column":11,"offset":10937},"indent":[]}}],"position":{"start":{"line":303,"column":1,"offset":10927},"end":{"line":303,"column":11,"offset":10937},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved file exist problem.","position":{"start":{"line":305,"column":3,"offset":10941},"end":{"line":305,"column":31,"offset":10969},"indent":[]}}],"position":{"start":{"line":305,"column":3,"offset":10941},"end":{"line":305,"column":31,"offset":10969},"indent":[]}}],"position":{"start":{"line":305,"column":1,"offset":10939},"end":{"line":305,"column":31,"offset":10969},"indent":[]}}],"position":{"start":{"line":305,"column":1,"offset":10939},"end":{"line":305,"column":31,"offset":10969},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.2","position":{"start":{"line":307,"column":5,"offset":10975},"end":{"line":307,"column":10,"offset":10980},"indent":[]}}],"position":{"start":{"line":307,"column":1,"offset":10971},"end":{"line":307,"column":10,"offset":10980},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":309,"column":6,"offset":10987},"end":{"line":309,"column":9,"offset":10990},"indent":[]}}],"position":{"start":{"line":309,"column":1,"offset":10982},"end":{"line":309,"column":9,"offset":10990},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Timezone on settings page is also used for the webinterface.","position":{"start":{"line":311,"column":3,"offset":10994},"end":{"line":311,"column":63,"offset":11054},"indent":[]}}],"position":{"start":{"line":311,"column":3,"offset":10994},"end":{"line":311,"column":63,"offset":11054},"indent":[]}}],"position":{"start":{"line":311,"column":1,"offset":10992},"end":{"line":311,"column":63,"offset":11054},"indent":[]}}],"position":{"start":{"line":311,"column":1,"offset":10992},"end":{"line":311,"column":63,"offset":11054},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":313,"column":6,"offset":11061},"end":{"line":313,"column":15,"offset":11070},"indent":[]}}],"position":{"start":{"line":313,"column":1,"offset":11056},"end":{"line":313,"column":15,"offset":11070},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added extra timezones to timezone.xml.","position":{"start":{"line":315,"column":3,"offset":11074},"end":{"line":315,"column":41,"offset":11112},"indent":[]}}],"position":{"start":{"line":315,"column":3,"offset":11074},"end":{"line":315,"column":41,"offset":11112},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":11072},"end":{"line":315,"column":41,"offset":11112},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":11072},"end":{"line":315,"column":41,"offset":11112},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.1","position":{"start":{"line":317,"column":5,"offset":11118},"end":{"line":317,"column":10,"offset":11123},"indent":[]}}],"position":{"start":{"line":317,"column":1,"offset":11114},"end":{"line":317,"column":10,"offset":11123},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":319,"column":6,"offset":11130},"end":{"line":319,"column":9,"offset":11133},"indent":[]}}],"position":{"start":{"line":319,"column":1,"offset":11125},"end":{"line":319,"column":9,"offset":11133},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Improved error handling (date search).","position":{"start":{"line":321,"column":3,"offset":11137},"end":{"line":321,"column":41,"offset":11175},"indent":[]}}],"position":{"start":{"line":321,"column":3,"offset":11137},"end":{"line":321,"column":41,"offset":11175},"indent":[]}}],"position":{"start":{"line":321,"column":1,"offset":11135},"end":{"line":321,"column":41,"offset":11175},"indent":[]}}],"position":{"start":{"line":321,"column":1,"offset":11135},"end":{"line":321,"column":41,"offset":11175},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":323,"column":6,"offset":11182},"end":{"line":323,"column":15,"offset":11191},"indent":[]}}],"position":{"start":{"line":323,"column":1,"offset":11177},"end":{"line":323,"column":15,"offset":11191},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Improved memory cleanup.","position":{"start":{"line":325,"column":3,"offset":11195},"end":{"line":325,"column":27,"offset":11219},"indent":[]}}],"position":{"start":{"line":325,"column":3,"offset":11195},"end":{"line":325,"column":27,"offset":11219},"indent":[]}}],"position":{"start":{"line":325,"column":1,"offset":11193},"end":{"line":325,"column":27,"offset":11219},"indent":[]}}],"position":{"start":{"line":325,"column":1,"offset":11193},"end":{"line":325,"column":27,"offset":11219},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.0","position":{"start":{"line":327,"column":5,"offset":11225},"end":{"line":327,"column":10,"offset":11230},"indent":[]}}],"position":{"start":{"line":327,"column":1,"offset":11221},"end":{"line":327,"column":10,"offset":11230},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"First commit of Kerberos.io","position":{"start":{"line":329,"column":6,"offset":11237},"end":{"line":329,"column":33,"offset":11264},"indent":[]}}],"position":{"start":{"line":329,"column":1,"offset":11232},"end":{"line":329,"column":33,"offset":11264},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Camera support: ","position":{"start":{"line":331,"column":3,"offset":11268},"end":{"line":331,"column":19,"offset":11284},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"USBCamera","position":{"start":{"line":331,"column":21,"offset":11286},"end":{"line":331,"column":30,"offset":11295},"indent":[]}}],"position":{"start":{"line":331,"column":19,"offset":11284},"end":{"line":331,"column":32,"offset":11297},"indent":[]}},{"type":"text","value":" (V4L), ","position":{"start":{"line":331,"column":32,"offset":11297},"end":{"line":331,"column":40,"offset":11305},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Raspberry Pi camera module","position":{"start":{"line":331,"column":42,"offset":11307},"end":{"line":331,"column":68,"offset":11333},"indent":[]}}],"position":{"start":{"line":331,"column":40,"offset":11305},"end":{"line":331,"column":70,"offset":11335},"indent":[]}},{"type":"text","value":" (MMAL).","position":{"start":{"line":331,"column":70,"offset":11335},"end":{"line":331,"column":78,"offset":11343},"indent":[]}}],"position":{"start":{"line":331,"column":3,"offset":11268},"end":{"line":331,"column":78,"offset":11343},"indent":[]}}],"position":{"start":{"line":331,"column":1,"offset":11266},"end":{"line":331,"column":78,"offset":11343},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Conditions: ","position":{"start":{"line":332,"column":3,"offset":11346},"end":{"line":332,"column":15,"offset":11358},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Enabled","position":{"start":{"line":332,"column":17,"offset":11360},"end":{"line":332,"column":24,"offset":11367},"indent":[]}}],"position":{"start":{"line":332,"column":15,"offset":11358},"end":{"line":332,"column":26,"offset":11369},"indent":[]}},{"type":"text","value":" (turn on/off Kerberos) and active ","position":{"start":{"line":332,"column":26,"offset":11369},"end":{"line":332,"column":61,"offset":11404},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Time","position":{"start":{"line":332,"column":63,"offset":11406},"end":{"line":332,"column":67,"offset":11410},"indent":[]}}],"position":{"start":{"line":332,"column":61,"offset":11404},"end":{"line":332,"column":69,"offset":11412},"indent":[]}},{"type":"text","value":" per day.","position":{"start":{"line":332,"column":69,"offset":11412},"end":{"line":332,"column":78,"offset":11421},"indent":[]}}],"position":{"start":{"line":332,"column":3,"offset":11346},"end":{"line":332,"column":78,"offset":11421},"indent":[]}}],"position":{"start":{"line":332,"column":1,"offset":11344},"end":{"line":332,"column":78,"offset":11421},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Algorithms: ","position":{"start":{"line":333,"column":3,"offset":11424},"end":{"line":333,"column":15,"offset":11436},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Differential Images","position":{"start":{"line":333,"column":17,"offset":11438},"end":{"line":333,"column":36,"offset":11457},"indent":[]}}],"position":{"start":{"line":333,"column":15,"offset":11436},"end":{"line":333,"column":38,"offset":11459},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":333,"column":38,"offset":11459},"end":{"line":333,"column":39,"offset":11460},"indent":[]}}],"position":{"start":{"line":333,"column":3,"offset":11424},"end":{"line":333,"column":39,"offset":11460},"indent":[]}}],"position":{"start":{"line":333,"column":1,"offset":11422},"end":{"line":333,"column":39,"offset":11460},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Heuristics: ","position":{"start":{"line":334,"column":3,"offset":11463},"end":{"line":334,"column":15,"offset":11475},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Sequence","position":{"start":{"line":334,"column":17,"offset":11477},"end":{"line":334,"column":25,"offset":11485},"indent":[]}}],"position":{"start":{"line":334,"column":15,"offset":11475},"end":{"line":334,"column":27,"offset":11487},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":334,"column":27,"offset":11487},"end":{"line":334,"column":28,"offset":11488},"indent":[]}}],"position":{"start":{"line":334,"column":3,"offset":11463},"end":{"line":334,"column":28,"offset":11488},"indent":[]}}],"position":{"start":{"line":334,"column":1,"offset":11461},"end":{"line":334,"column":28,"offset":11488},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Expositors: Select a ","position":{"start":{"line":335,"column":3,"offset":11491},"end":{"line":335,"column":24,"offset":11512},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Hull","position":{"start":{"line":335,"column":26,"offset":11514},"end":{"line":335,"column":30,"offset":11518},"indent":[]}}],"position":{"start":{"line":335,"column":24,"offset":11512},"end":{"line":335,"column":32,"offset":11520},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":335,"column":32,"offset":11520},"end":{"line":335,"column":36,"offset":11524},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Rectangle","position":{"start":{"line":335,"column":38,"offset":11526},"end":{"line":335,"column":47,"offset":11535},"indent":[]}}],"position":{"start":{"line":335,"column":36,"offset":11524},"end":{"line":335,"column":49,"offset":11537},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":335,"column":49,"offset":11537},"end":{"line":335,"column":50,"offset":11538},"indent":[]}}],"position":{"start":{"line":335,"column":3,"offset":11491},"end":{"line":335,"column":50,"offset":11538},"indent":[]}}],"position":{"start":{"line":335,"column":1,"offset":11489},"end":{"line":335,"column":50,"offset":11538},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Outputs: Write image to ","position":{"start":{"line":336,"column":3,"offset":11541},"end":{"line":336,"column":27,"offset":11565},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Disk","position":{"start":{"line":336,"column":29,"offset":11567},"end":{"line":336,"column":33,"offset":11571},"indent":[]}}],"position":{"start":{"line":336,"column":27,"offset":11565},"end":{"line":336,"column":35,"offset":11573},"indent":[]}},{"type":"text","value":", trigger an ","position":{"start":{"line":336,"column":35,"offset":11573},"end":{"line":336,"column":48,"offset":11586},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GPIO","position":{"start":{"line":336,"column":50,"offset":11588},"end":{"line":336,"column":54,"offset":11592},"indent":[]}}],"position":{"start":{"line":336,"column":48,"offset":11586},"end":{"line":336,"column":56,"offset":11594},"indent":[]}},{"type":"text","value":" output pin and send a ","position":{"start":{"line":336,"column":56,"offset":11594},"end":{"line":336,"column":79,"offset":11617},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"TCP/IP packet","position":{"start":{"line":336,"column":81,"offset":11619},"end":{"line":336,"column":94,"offset":11632},"indent":[]}}],"position":{"start":{"line":336,"column":79,"offset":11617},"end":{"line":336,"column":96,"offset":11634},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":336,"column":96,"offset":11634},"end":{"line":336,"column":97,"offset":11635},"indent":[]}}],"position":{"start":{"line":336,"column":3,"offset":11541},"end":{"line":336,"column":97,"offset":11635},"indent":[]}}],"position":{"start":{"line":336,"column":1,"offset":11539},"end":{"line":336,"column":97,"offset":11635},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Cloud: send your images to the ","position":{"start":{"line":337,"column":3,"offset":11638},"end":{"line":337,"column":34,"offset":11669},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Kerberos.io cloud aplication","position":{"start":{"line":337,"column":36,"offset":11671},"end":{"line":337,"column":64,"offset":11699},"indent":[]}}],"position":{"start":{"line":337,"column":34,"offset":11669},"end":{"line":337,"column":66,"offset":11701},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":337,"column":66,"offset":11701},"end":{"line":337,"column":67,"offset":11702},"indent":[]}}],"position":{"start":{"line":337,"column":3,"offset":11638},"end":{"line":337,"column":67,"offset":11702},"indent":[]}}],"position":{"start":{"line":337,"column":1,"offset":11636},"end":{"line":337,"column":67,"offset":11702},"indent":[]}}],"position":{"start":{"line":331,"column":1,"offset":11266},"end":{"line":337,"column":67,"offset":11702},"indent":[1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":340,"column":1,"offset":11705},"end":{"line":340,"column":31,"offset":11735},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":340,"column":31,"offset":11735}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Release notes`}

\n

{`2.8.0`}

\n

{`Aligned machinery, web and KiOS versions. Too many people were confused by the versioning.`}

\n

{`Web`}

\n
    \n
  • {`Videos displayed on canvas were blocked in latest browsers.`}
  • \n
  • {`Disabled reboot and shutdown.`}
  • \n
  • {`Disabled upgrade process, use fwupdate shell command instead.`}
  • \n
\n

{`KiOS`}

\n
    \n
  • {`Major upgrade, solved many different problems (list to long); not possible to upgrade from 2.7.0 to 2.8.0.`}
  • \n
  • {`Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).`}
  • \n
  • {`Support for the Raspberry Pi 4.`}
  • \n
\n

{`2.7.2`}

\n

{`Machinery`}

\n
    \n
  • {`To optimise the cloud experience we've added a proxy.kerberos.io machine in between.`}
  • \n
  • {`We've changed the S3 storage scheme (class:ONEZONE_IA).`}
  • \n
\n

{`2.7.1`}

\n

{`Machinery`}

\n
    \n
  • {`Resolved deadlock with livestreaming while restarting machinery.`}
  • \n
  • {`Revert logging library; enabled log rotating.`}
  • \n
\n

{`KiOS`}

\n
    \n
  • {`Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).`}
  • \n
  • {`Resolved issue with WIFI on Raspberry Pi 3B+`}
  • \n
\n

{`2.7.0`}

\n

{`Web`}

\n
    \n
  • {`Unique session cookie, which allows to open multiple web interfaces (e.g. when using docker).`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added live streaming feature for app.kerberos.io`}
  • \n
  • {`Upgraded logging library: log file can be max 5MB, and will rotate.`}
  • \n
  • {`Better logging for cloud uploads (failed information).`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`No longer need docker-compose, we merged the web and machinery containers to `}{`a single container`}{`.`}
  • \n
\n

{`KiOS`}

\n
    \n
  • {`Updated firmware to latest Raspbian.`}
  • \n
  • {`Support for the Raspberry Pi 3B+.`}
  • \n
\n

{`2.6.1`}

\n

{`Web`}

\n
    \n
  • {`Solved issue with persisting login configuration. `}{`#111`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added Pushbullet. `}{`#139`}
  • \n
  • {`Cloud upload was not longer working (hotfix also in 2.6.0).`}
  • \n
\n

{`2.6.0`}

\n

{`Web`}

\n
    \n
  • {`Add a cloud connection verification method. `}{`#112`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Add background color timestamp. `}{`#128`}
  • \n
  • {`Send instanceId in AWS header when uploading to cloud (necessary for new cloud app).`}
  • \n
  • {`Better support for Chinese IP cameras.`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`Bug: Autoremove old images/video within Docker Containers. `}{`#104`}
  • \n
\n

{`2.5.0`}

\n

{`Web`}

\n
    \n
  • {`Added Chinese and Italian language.`}
  • \n
  • {`Resolved issue with INSTALLED=true.`}
  • \n
  • {`Make latest_sequence available with basic auth. `}{`#99`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Provide an IO service for publishing events to MQTT. `}{`#89`}
  • \n
  • {`Optimize recording with H264_OMX. `}{`#83`}
  • \n
  • {`Implement throttler for Io detections. `}{`#96`}
  • \n
  • {`SSL version 1.0.0 is no longer accessible in Raspbian. `}{`#109`}
  • \n
\n

{`2.4.2`}

\n

{`Web`}

\n
    \n
  • {`Typo in french translation, causes the web interface crash.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Resolved major bug in livestream: memory leak in stream class. `}{`#94`}
  • \n
  • {`Capture health verification: check if the chosen capture device is still grabbing (and didn't stalled).`}
  • \n
  • {`Extra logging when recording with raspberry pi camera.`}
  • \n
  • {`Make sure the cloud upload is functioning properly, after an upload it's verified if the files really exist in the cloud.`}
  • \n
\n

{`2.4.1`}

\n

{`Web`}

\n
    \n
  • {`Show warning when system is disabled. `}{`#88`}{`.`}
  • \n
  • {`Hull selector in basic view not always working.`}
  • \n
\n

{`2.4.0`}

\n

{`Ecosystem`}

\n
    \n
  • {`Enable/Disable force network mode.`}
  • \n
  • {`Enable/Disable auto removal media.`}
  • \n
\n

{`Web`}

\n
    \n
  • {`Upgrade from Laravel 4.2 to Laravel 5.4 `}{`#70`}{`.`}
  • \n
  • {`Fix bug with heatmap radius slider `}{`#84`}{`.`}
  • \n
  • {`Design tweaks toggle button (remove outline).`}
  • \n
  • {`Disabled possibility to timestamp video when using hardware acceleration.`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`Fix SSL support `}{`#4`}{`.`}
  • \n
  • {`Auto removal if disk is full.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`OpenMAX IL hardware encoding for Raspberry Pi camera. `}{`#83`}
      \n
    • {`Optimized live streaming.`}
    • \n
    • {`Optimized h264 recording.`}
    • \n
  • \n
  • {`Basic authentication for live streaming (username and password). `}{`#80`}
  • \n
\n

{`2.3.1`}

\n

{`Machinery`}

\n
    \n
  • {`Update for kerberos.cloud: pushing content-type.`}
  • \n
  • {`Change default configurations.`}
  • \n
\n

{`2.3.0`}

\n

{`Ecosystem`}

\n
    \n
  • {`Support for Raspberry Pi Zero W. `}{`#8`}
  • \n
\n

{`2.2.1`}

\n

{`Ecosystem`}

\n
    \n
  • {`Upgraded FFmpeg and libx264 on KiOS.`}
  • \n
\n

{`Web`}

\n
    \n
  • {`Add Bulgarian translation. `}{`#81`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Bug: IoVideo crashes due to a memory leak. `}{`#70`}
  • \n
\n

{`2.2.0`}

\n

{`Ecosystem`}

\n
    \n
  • {`Added support for Armbian.`}
  • \n
  • {`Raspbian: Async requests causes session corruption. `}{`#78`}
  • \n
\n

{`Web`}

\n
    \n
  • {`Bug: Issue format instance name. `}{`#57`}
  • \n
  • {`Redesign settings page (better UX). `}{`#39`}
  • \n
  • {`Possibility to edit password through web interface. `}{`#63`}
  • \n
  • {`Support for viewing videos.`}
  • \n
  • {`Update radius of heatmap.`}
  • \n
  • {`PHP7 support. `}{`#60`}
  • \n
  • {`Welcome/installation page. `}{`#60`}
  • \n
  • {`Translation updated. `}{`#74`}
  • \n
  • {`Privacy mode. `}{`#54`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Output as video file. `}{`#60`}
  • \n
  • {`Bug: System hangs when a wrong IP camera url was defined. `}{`#48`}
  • \n
  • {`Run arbitrary script/program. `}{`#31`}
  • \n
  • {`Bug: Weird colors from RPi Camera. `}{`#64`}
  • \n
  • {`Upgrade to OpenCV 3.2.0.`}
  • \n
\n

{`2.1.0`}

\n

{`Web`}

\n
    \n
  • {`Added PhotoSwipe for image overview (easier to browse through images). `}{`#45`}
  • \n
  • {`Added reboot and shutdown commands. `}{`#46`}
  • \n
  • {`Added logging view to system page. `}{`#33`}
  • \n
  • {`Added labels to check if machinery is running.`}
  • \n
  • {`Added error handling if web interface isn’t working properly.`}
  • \n
  • {`Fixed Heatmap.js fail to load by ad-blocker. `}{`#42`}
  • \n
  • {`Show additional information on the dashboard (streaming is opening or not) there is no data available.`}
  • \n
  • {`Settings page is now visible on mobile (+ changed icon).`}
  • \n
  • {`Fixed sorting of news articles.`}
  • \n
  • {`Removed links to assets in the cloud (.css files).`}
  • \n
  • {`Design: improved layout of login page, async loading of image view.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added configurable streaming port and quality. `}{`#41`}
  • \n
  • {`Added new algorithm: Background subtraction.`}
  • \n
  • {`Added new heuristic: Counter (for object/people counting). `}{`#42`}
  • \n
  • {`Added video capture, which can be used for debugging purposes (replay a video fragment).`}
  • \n
  • {`It’s now possible to mark the images with a timestamp. `}{`#36`}
  • \n
  • {`Fixed blocking streaming socket. `}{`#39`}
  • \n
\n

{`Ecosystem`}

\n
    \n
  • {`Fix removal images if disk is almost full (wrong path was defined).`}
  • \n
  • {`Support for the Raspberry Pi Camera module v2.1. `}{`#3`}
  • \n
  • {`Support for the Raspberry Pi Zero; updated kernel to latest Raspbian. `}{`#3`}
  • \n
  • {`KiOS GUI installer.`}
  • \n
\n

{`2.0.0`}

\n

{`Web`}

\n
    \n
  • {`Add simple ON/OFF toggle. `}{`#24`}
  • \n
  • {`Added update strategy when using KiOS. `}{`#23`}
  • \n
  • {`A system page which shows system information. `}{`#20`}
  • \n
  • {`Heatmap on dashboard page `}{`#19`}
  • \n
  • {`Added live stream view on the dashboard page `}{`#2`}
  • \n
  • {`Fixed bug cloud syncing `}{`#16`}
  • \n
  • {`Fixed broken settings page when space in instane name `}{`#16`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`RTSP support for IP-camera's. `}{`#21`}
  • \n
  • {`Verbose logging. `}{`#35`}
  • \n
  • {`IO-devices are executed in a seperate thread. `}{`#28`}
  • \n
  • {`Live streaming (MJPEG). `}{`#26`}
  • \n
  • {`Execute multiple instances on a machine. `}{`#24`}
  • \n
  • {`Override config by arguments. `}{`#22`}
  • \n
  • {`Move S3 upload to machinery and remove sync-s3 repository. `}{`#16`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`Added Docker image (x86_x64) to Docker Hub.`}
  • \n
\n

{`Ecosystem`}

\n
    \n
  • {`Add support for Raspberry Pi 1, 2 and 3. `}{`#1`}
  • \n
\n

{`1.1.0`}

\n

{`Web`}

\n
    \n
  • {`Support IP camera's with MJPEG stream. `}{`#3`}
  • \n
  • {`Introduce new API methods to configure the machinery, using basic auth. `}{`#4`}
  • \n
  • {`Optimization of loading image and dashboard page, completely redesigned the retrieval of images. `}{`#5`}
  • \n
  • {`Optimization of settings page. `}{`#5`}
  • \n
  • {`Timebar gradient only works in Chrome. `}{`#6`}
  • \n
  • {`Minor CSS fixes for responsive layout.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Flip/rotate option for capture devices. `}{`#5`}
  • \n
  • {`Support IP camera's with MJPEG stream. `}{`#4`}
  • \n
  • {`Introduced webhook io device. `}{`#5`}
  • \n
\n

{`Cloud`}

\n
    \n
  • {`Fixed problem when syncing a huge amount of images. `}{`#1`}
  • \n
\n

{`1.0.3`}

\n

{`Web`}

\n
    \n
  • {`Optimize performance, new datastructure has been implemented.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Memory optimization.`}
  • \n
  • {`Removal of images older than 3 days have been removed.`}
  • \n
  • {`Start machinery automatically (delay has been removed).`}
  • \n
\n

{`Cloud`}

\n
    \n
  • {`Resolved file exist problem.`}
  • \n
\n

{`1.0.2`}

\n

{`Web`}

\n
    \n
  • {`Timezone on settings page is also used for the webinterface.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added extra timezones to timezone.xml.`}
  • \n
\n

{`1.0.1`}

\n

{`Web`}

\n
    \n
  • {`Improved error handling (date search).`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Improved memory cleanup.`}
  • \n
\n

{`1.0.0`}

\n

{`First commit of Kerberos.io`}

\n
    \n
  • {`Camera support: `}{`USBCamera`}{` (V4L), `}{`Raspberry Pi camera module`}{` (MMAL).`}
  • \n
  • {`Conditions: `}{`Enabled`}{` (turn on/off Kerberos) and active `}{`Time`}{` per day.`}
  • \n
  • {`Algorithms: `}{`Differential Images`}{`.`}
  • \n
  • {`Heuristics: `}{`Sequence`}{`.`}
  • \n
  • {`Expositors: Select a `}{`Hull`}{` or `}{`Rectangle`}{`.`}
  • \n
  • {`Outputs: Write image to `}{`Disk`}{`, trigger an `}{`GPIO`}{` output pin and send a `}{`TCP/IP packet`}{`.`}
  • \n
  • {`Cloud: send your images to the `}{`Kerberos.io cloud aplication`}{`.`}
  • \n
\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760428000,"key":"gatsby-plugin-mdx-entire-payload-b468dbf55b0553564a37dfaeddba3f9d-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Release notes","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":16,"offset":174},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":16,"offset":174},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.8.0","position":{"start":{"line":10,"column":5,"offset":180},"end":{"line":10,"column":10,"offset":185},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":10,"offset":185},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Aligned machinery, web and KiOS versions. Too many people were confused by the versioning.","position":{"start":{"line":12,"column":1,"offset":187},"end":{"line":12,"column":91,"offset":277},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":187},"end":{"line":12,"column":91,"offset":277},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":14,"column":6,"offset":284},"end":{"line":14,"column":9,"offset":287},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":279},"end":{"line":14,"column":9,"offset":287},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Videos displayed on canvas were blocked in latest browsers.","position":{"start":{"line":16,"column":3,"offset":291},"end":{"line":16,"column":62,"offset":350},"indent":[]}}],"position":{"start":{"line":16,"column":3,"offset":291},"end":{"line":16,"column":62,"offset":350},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":289},"end":{"line":16,"column":62,"offset":350},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disabled reboot and shutdown.","position":{"start":{"line":17,"column":3,"offset":353},"end":{"line":17,"column":32,"offset":382},"indent":[]}}],"position":{"start":{"line":17,"column":3,"offset":353},"end":{"line":17,"column":32,"offset":382},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":351},"end":{"line":17,"column":32,"offset":382},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disabled upgrade process, use fwupdate shell command instead.","position":{"start":{"line":18,"column":3,"offset":385},"end":{"line":18,"column":64,"offset":446},"indent":[]}}],"position":{"start":{"line":18,"column":3,"offset":385},"end":{"line":18,"column":64,"offset":446},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":383},"end":{"line":18,"column":64,"offset":446},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":289},"end":{"line":18,"column":64,"offset":446},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":20,"column":6,"offset":453},"end":{"line":20,"column":10,"offset":457},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":448},"end":{"line":20,"column":10,"offset":457},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Major upgrade, solved many different problems (list to long); not possible to upgrade from 2.7.0 to 2.8.0.","position":{"start":{"line":22,"column":3,"offset":461},"end":{"line":22,"column":109,"offset":567},"indent":[]}}],"position":{"start":{"line":22,"column":3,"offset":461},"end":{"line":22,"column":109,"offset":567},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":459},"end":{"line":22,"column":109,"offset":567},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).","position":{"start":{"line":23,"column":3,"offset":570},"end":{"line":23,"column":73,"offset":640},"indent":[]}}],"position":{"start":{"line":23,"column":3,"offset":570},"end":{"line":23,"column":73,"offset":640},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":568},"end":{"line":23,"column":73,"offset":640},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi 4.","position":{"start":{"line":24,"column":3,"offset":643},"end":{"line":24,"column":34,"offset":674},"indent":[]}}],"position":{"start":{"line":24,"column":3,"offset":643},"end":{"line":24,"column":34,"offset":674},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":641},"end":{"line":24,"column":34,"offset":674},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":459},"end":{"line":24,"column":34,"offset":674},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.7.2","position":{"start":{"line":26,"column":5,"offset":680},"end":{"line":26,"column":10,"offset":685},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":676},"end":{"line":26,"column":10,"offset":685},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":28,"column":6,"offset":692},"end":{"line":28,"column":15,"offset":701},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":687},"end":{"line":28,"column":15,"offset":701},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"To optimise the cloud experience we've added a proxy.kerberos.io machine in between.","position":{"start":{"line":30,"column":3,"offset":705},"end":{"line":30,"column":87,"offset":789},"indent":[]}}],"position":{"start":{"line":30,"column":3,"offset":705},"end":{"line":30,"column":87,"offset":789},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":703},"end":{"line":30,"column":87,"offset":789},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"We've changed the S3 storage scheme (class:ONEZONE_IA).","position":{"start":{"line":31,"column":3,"offset":792},"end":{"line":31,"column":58,"offset":847},"indent":[]}}],"position":{"start":{"line":31,"column":3,"offset":792},"end":{"line":31,"column":58,"offset":847},"indent":[]}}],"position":{"start":{"line":31,"column":1,"offset":790},"end":{"line":31,"column":58,"offset":847},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":703},"end":{"line":31,"column":58,"offset":847},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.7.1","position":{"start":{"line":33,"column":5,"offset":853},"end":{"line":33,"column":10,"offset":858},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":849},"end":{"line":33,"column":10,"offset":858},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":35,"column":6,"offset":865},"end":{"line":35,"column":15,"offset":874},"indent":[]}}],"position":{"start":{"line":35,"column":1,"offset":860},"end":{"line":35,"column":15,"offset":874},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved deadlock with livestreaming while restarting machinery.","position":{"start":{"line":37,"column":3,"offset":878},"end":{"line":37,"column":67,"offset":942},"indent":[]}}],"position":{"start":{"line":37,"column":3,"offset":878},"end":{"line":37,"column":67,"offset":942},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":876},"end":{"line":37,"column":67,"offset":942},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Revert logging library; enabled log rotating.","position":{"start":{"line":38,"column":3,"offset":945},"end":{"line":38,"column":48,"offset":990},"indent":[]}}],"position":{"start":{"line":38,"column":3,"offset":945},"end":{"line":38,"column":48,"offset":990},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":943},"end":{"line":38,"column":48,"offset":990},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":876},"end":{"line":38,"column":48,"offset":990},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":40,"column":6,"offset":997},"end":{"line":40,"column":10,"offset":1001},"indent":[]}}],"position":{"start":{"line":40,"column":1,"offset":992},"end":{"line":40,"column":10,"offset":1001},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).","position":{"start":{"line":42,"column":3,"offset":1005},"end":{"line":42,"column":73,"offset":1075},"indent":[]}}],"position":{"start":{"line":42,"column":3,"offset":1005},"end":{"line":42,"column":73,"offset":1075},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":1003},"end":{"line":42,"column":73,"offset":1075},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved issue with WIFI on Raspberry Pi 3B+","position":{"start":{"line":43,"column":3,"offset":1078},"end":{"line":43,"column":47,"offset":1122},"indent":[]}}],"position":{"start":{"line":43,"column":3,"offset":1078},"end":{"line":43,"column":47,"offset":1122},"indent":[]}}],"position":{"start":{"line":43,"column":1,"offset":1076},"end":{"line":43,"column":47,"offset":1122},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":1003},"end":{"line":43,"column":47,"offset":1122},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.7.0","position":{"start":{"line":45,"column":5,"offset":1128},"end":{"line":45,"column":10,"offset":1133},"indent":[]}}],"position":{"start":{"line":45,"column":1,"offset":1124},"end":{"line":45,"column":10,"offset":1133},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":47,"column":6,"offset":1140},"end":{"line":47,"column":9,"offset":1143},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":1135},"end":{"line":47,"column":9,"offset":1143},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Unique session cookie, which allows to open multiple web interfaces (e.g. when using docker).","position":{"start":{"line":49,"column":3,"offset":1147},"end":{"line":49,"column":96,"offset":1240},"indent":[]}}],"position":{"start":{"line":49,"column":3,"offset":1147},"end":{"line":49,"column":96,"offset":1240},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1145},"end":{"line":49,"column":96,"offset":1240},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1145},"end":{"line":49,"column":96,"offset":1240},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":51,"column":6,"offset":1247},"end":{"line":51,"column":15,"offset":1256},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1242},"end":{"line":51,"column":15,"offset":1256},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added live streaming feature for app.kerberos.io","position":{"start":{"line":53,"column":3,"offset":1260},"end":{"line":53,"column":51,"offset":1308},"indent":[]}}],"position":{"start":{"line":53,"column":3,"offset":1260},"end":{"line":53,"column":51,"offset":1308},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1258},"end":{"line":53,"column":51,"offset":1308},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgraded logging library: log file can be max 5MB, and will rotate.","position":{"start":{"line":54,"column":3,"offset":1311},"end":{"line":54,"column":70,"offset":1378},"indent":[]}}],"position":{"start":{"line":54,"column":3,"offset":1311},"end":{"line":54,"column":70,"offset":1378},"indent":[]}}],"position":{"start":{"line":54,"column":1,"offset":1309},"end":{"line":54,"column":70,"offset":1378},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Better logging for cloud uploads (failed information).","position":{"start":{"line":55,"column":3,"offset":1381},"end":{"line":55,"column":57,"offset":1435},"indent":[]}}],"position":{"start":{"line":55,"column":3,"offset":1381},"end":{"line":55,"column":57,"offset":1435},"indent":[]}}],"position":{"start":{"line":55,"column":1,"offset":1379},"end":{"line":55,"column":57,"offset":1435},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1258},"end":{"line":55,"column":57,"offset":1435},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":57,"column":6,"offset":1442},"end":{"line":57,"column":12,"offset":1448},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1437},"end":{"line":57,"column":12,"offset":1448},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"No longer need docker-compose, we merged the web and machinery containers to ","position":{"start":{"line":59,"column":3,"offset":1452},"end":{"line":59,"column":80,"offset":1529},"indent":[]}},{"type":"link","title":null,"url":"http://hub.docker.com/r/kerberos/kerberos","children":[{"type":"text","value":"a single container","position":{"start":{"line":59,"column":81,"offset":1530},"end":{"line":59,"column":99,"offset":1548},"indent":[]}}],"position":{"start":{"line":59,"column":80,"offset":1529},"end":{"line":59,"column":143,"offset":1592},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":59,"column":143,"offset":1592},"end":{"line":59,"column":144,"offset":1593},"indent":[]}}],"position":{"start":{"line":59,"column":3,"offset":1452},"end":{"line":59,"column":144,"offset":1593},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":1450},"end":{"line":59,"column":144,"offset":1593},"indent":[]}}],"position":{"start":{"line":59,"column":1,"offset":1450},"end":{"line":59,"column":144,"offset":1593},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":61,"column":6,"offset":1600},"end":{"line":61,"column":10,"offset":1604},"indent":[]}}],"position":{"start":{"line":61,"column":1,"offset":1595},"end":{"line":61,"column":10,"offset":1604},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Updated firmware to latest Raspbian.","position":{"start":{"line":63,"column":3,"offset":1608},"end":{"line":63,"column":39,"offset":1644},"indent":[]}}],"position":{"start":{"line":63,"column":3,"offset":1608},"end":{"line":63,"column":39,"offset":1644},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1606},"end":{"line":63,"column":39,"offset":1644},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi 3B+.","position":{"start":{"line":64,"column":3,"offset":1647},"end":{"line":64,"column":36,"offset":1680},"indent":[]}}],"position":{"start":{"line":64,"column":3,"offset":1647},"end":{"line":64,"column":36,"offset":1680},"indent":[]}}],"position":{"start":{"line":64,"column":1,"offset":1645},"end":{"line":64,"column":36,"offset":1680},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1606},"end":{"line":64,"column":36,"offset":1680},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.6.1","position":{"start":{"line":66,"column":5,"offset":1686},"end":{"line":66,"column":10,"offset":1691},"indent":[]}}],"position":{"start":{"line":66,"column":1,"offset":1682},"end":{"line":66,"column":10,"offset":1691},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":68,"column":6,"offset":1698},"end":{"line":68,"column":9,"offset":1701},"indent":[]}}],"position":{"start":{"line":68,"column":1,"offset":1693},"end":{"line":68,"column":9,"offset":1701},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Solved issue with persisting login configuration. ","position":{"start":{"line":70,"column":3,"offset":1705},"end":{"line":70,"column":53,"offset":1755},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/111","children":[{"type":"text","value":"#111","position":{"start":{"line":70,"column":54,"offset":1756},"end":{"line":70,"column":58,"offset":1760},"indent":[]}}],"position":{"start":{"line":70,"column":53,"offset":1755},"end":{"line":70,"column":106,"offset":1808},"indent":[]}}],"position":{"start":{"line":70,"column":3,"offset":1705},"end":{"line":70,"column":106,"offset":1808},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":1703},"end":{"line":70,"column":106,"offset":1808},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":1703},"end":{"line":70,"column":106,"offset":1808},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":72,"column":6,"offset":1815},"end":{"line":72,"column":15,"offset":1824},"indent":[]}}],"position":{"start":{"line":72,"column":1,"offset":1810},"end":{"line":72,"column":15,"offset":1824},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added Pushbullet. ","position":{"start":{"line":74,"column":3,"offset":1828},"end":{"line":74,"column":21,"offset":1846},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/pull/139","children":[{"type":"text","value":"#139","position":{"start":{"line":74,"column":22,"offset":1847},"end":{"line":74,"column":26,"offset":1851},"indent":[]}}],"position":{"start":{"line":74,"column":21,"offset":1846},"end":{"line":74,"column":78,"offset":1903},"indent":[]}}],"position":{"start":{"line":74,"column":3,"offset":1828},"end":{"line":74,"column":78,"offset":1903},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":1826},"end":{"line":74,"column":78,"offset":1903},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Cloud upload was not longer working (hotfix also in 2.6.0).","position":{"start":{"line":75,"column":3,"offset":1906},"end":{"line":75,"column":62,"offset":1965},"indent":[]}}],"position":{"start":{"line":75,"column":3,"offset":1906},"end":{"line":75,"column":62,"offset":1965},"indent":[]}}],"position":{"start":{"line":75,"column":1,"offset":1904},"end":{"line":75,"column":62,"offset":1965},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":1826},"end":{"line":75,"column":62,"offset":1965},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.6.0","position":{"start":{"line":77,"column":5,"offset":1971},"end":{"line":77,"column":10,"offset":1976},"indent":[]}}],"position":{"start":{"line":77,"column":1,"offset":1967},"end":{"line":77,"column":10,"offset":1976},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":79,"column":6,"offset":1983},"end":{"line":79,"column":9,"offset":1986},"indent":[]}}],"position":{"start":{"line":79,"column":1,"offset":1978},"end":{"line":79,"column":9,"offset":1986},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add a cloud connection verification method. ","position":{"start":{"line":81,"column":3,"offset":1990},"end":{"line":81,"column":47,"offset":2034},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/112","children":[{"type":"text","value":"#112","position":{"start":{"line":81,"column":48,"offset":2035},"end":{"line":81,"column":52,"offset":2039},"indent":[]}}],"position":{"start":{"line":81,"column":47,"offset":2034},"end":{"line":81,"column":100,"offset":2087},"indent":[]}}],"position":{"start":{"line":81,"column":3,"offset":1990},"end":{"line":81,"column":100,"offset":2087},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":1988},"end":{"line":81,"column":100,"offset":2087},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":1988},"end":{"line":81,"column":100,"offset":2087},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":83,"column":6,"offset":2094},"end":{"line":83,"column":15,"offset":2103},"indent":[]}}],"position":{"start":{"line":83,"column":1,"offset":2089},"end":{"line":83,"column":15,"offset":2103},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add background color timestamp. ","position":{"start":{"line":85,"column":3,"offset":2107},"end":{"line":85,"column":35,"offset":2139},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/128","children":[{"type":"text","value":"#128","position":{"start":{"line":85,"column":36,"offset":2140},"end":{"line":85,"column":40,"offset":2144},"indent":[]}}],"position":{"start":{"line":85,"column":35,"offset":2139},"end":{"line":85,"column":94,"offset":2198},"indent":[]}}],"position":{"start":{"line":85,"column":3,"offset":2107},"end":{"line":85,"column":94,"offset":2198},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":2105},"end":{"line":85,"column":94,"offset":2198},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Send instanceId in AWS header when uploading to cloud (necessary for new cloud app).","position":{"start":{"line":86,"column":3,"offset":2201},"end":{"line":86,"column":87,"offset":2285},"indent":[]}}],"position":{"start":{"line":86,"column":3,"offset":2201},"end":{"line":86,"column":87,"offset":2285},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2199},"end":{"line":86,"column":87,"offset":2285},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Better support for Chinese IP cameras.","position":{"start":{"line":87,"column":3,"offset":2288},"end":{"line":87,"column":41,"offset":2326},"indent":[]}}],"position":{"start":{"line":87,"column":3,"offset":2288},"end":{"line":87,"column":41,"offset":2326},"indent":[]}}],"position":{"start":{"line":87,"column":1,"offset":2286},"end":{"line":87,"column":41,"offset":2326},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":2105},"end":{"line":87,"column":41,"offset":2326},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":89,"column":6,"offset":2333},"end":{"line":89,"column":12,"offset":2339},"indent":[]}}],"position":{"start":{"line":89,"column":1,"offset":2328},"end":{"line":89,"column":12,"offset":2339},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: Autoremove old images/video within Docker Containers. ","position":{"start":{"line":91,"column":3,"offset":2343},"end":{"line":91,"column":62,"offset":2402},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/104","children":[{"type":"text","value":"#104","position":{"start":{"line":91,"column":63,"offset":2403},"end":{"line":91,"column":67,"offset":2407},"indent":[]}}],"position":{"start":{"line":91,"column":62,"offset":2402},"end":{"line":91,"column":115,"offset":2455},"indent":[]}}],"position":{"start":{"line":91,"column":3,"offset":2343},"end":{"line":91,"column":115,"offset":2455},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2341},"end":{"line":91,"column":115,"offset":2455},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2341},"end":{"line":91,"column":115,"offset":2455},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.5.0","position":{"start":{"line":93,"column":5,"offset":2461},"end":{"line":93,"column":10,"offset":2466},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2457},"end":{"line":93,"column":10,"offset":2466},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":95,"column":6,"offset":2473},"end":{"line":95,"column":9,"offset":2476},"indent":[]}}],"position":{"start":{"line":95,"column":1,"offset":2468},"end":{"line":95,"column":9,"offset":2476},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added Chinese and Italian language.","position":{"start":{"line":97,"column":3,"offset":2480},"end":{"line":97,"column":38,"offset":2515},"indent":[]}}],"position":{"start":{"line":97,"column":3,"offset":2480},"end":{"line":97,"column":38,"offset":2515},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":2478},"end":{"line":97,"column":38,"offset":2515},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved issue with INSTALLED=true.","position":{"start":{"line":98,"column":3,"offset":2518},"end":{"line":98,"column":38,"offset":2553},"indent":[]}}],"position":{"start":{"line":98,"column":3,"offset":2518},"end":{"line":98,"column":38,"offset":2553},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2516},"end":{"line":98,"column":38,"offset":2553},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Make latest_sequence available with basic auth. ","position":{"start":{"line":99,"column":3,"offset":2556},"end":{"line":99,"column":52,"offset":2605},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/99","children":[{"type":"text","value":"#99","position":{"start":{"line":99,"column":53,"offset":2606},"end":{"line":99,"column":56,"offset":2609},"indent":[]}}],"position":{"start":{"line":99,"column":52,"offset":2605},"end":{"line":99,"column":103,"offset":2656},"indent":[]}}],"position":{"start":{"line":99,"column":3,"offset":2556},"end":{"line":99,"column":103,"offset":2656},"indent":[]}}],"position":{"start":{"line":99,"column":1,"offset":2554},"end":{"line":99,"column":103,"offset":2656},"indent":[]}}],"position":{"start":{"line":97,"column":1,"offset":2478},"end":{"line":99,"column":103,"offset":2656},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":101,"column":6,"offset":2663},"end":{"line":101,"column":15,"offset":2672},"indent":[]}}],"position":{"start":{"line":101,"column":1,"offset":2658},"end":{"line":101,"column":15,"offset":2672},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Provide an IO service for publishing events to MQTT. ","position":{"start":{"line":103,"column":3,"offset":2676},"end":{"line":103,"column":56,"offset":2729},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/89","children":[{"type":"text","value":"#89","position":{"start":{"line":103,"column":57,"offset":2730},"end":{"line":103,"column":60,"offset":2733},"indent":[]}}],"position":{"start":{"line":103,"column":56,"offset":2729},"end":{"line":103,"column":113,"offset":2786},"indent":[]}}],"position":{"start":{"line":103,"column":3,"offset":2676},"end":{"line":103,"column":113,"offset":2786},"indent":[]}}],"position":{"start":{"line":103,"column":1,"offset":2674},"end":{"line":103,"column":113,"offset":2786},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimize recording with H264_OMX. ","position":{"start":{"line":104,"column":3,"offset":2789},"end":{"line":104,"column":37,"offset":2823},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/83","children":[{"type":"text","value":"#83","position":{"start":{"line":104,"column":38,"offset":2824},"end":{"line":104,"column":41,"offset":2827},"indent":[]}}],"position":{"start":{"line":104,"column":37,"offset":2823},"end":{"line":104,"column":94,"offset":2880},"indent":[]}}],"position":{"start":{"line":104,"column":3,"offset":2789},"end":{"line":104,"column":94,"offset":2880},"indent":[]}}],"position":{"start":{"line":104,"column":1,"offset":2787},"end":{"line":104,"column":94,"offset":2880},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Implement throttler for Io detections. ","position":{"start":{"line":105,"column":3,"offset":2883},"end":{"line":105,"column":42,"offset":2922},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/96","children":[{"type":"text","value":"#96","position":{"start":{"line":105,"column":43,"offset":2923},"end":{"line":105,"column":46,"offset":2926},"indent":[]}}],"position":{"start":{"line":105,"column":42,"offset":2922},"end":{"line":105,"column":99,"offset":2979},"indent":[]}}],"position":{"start":{"line":105,"column":3,"offset":2883},"end":{"line":105,"column":99,"offset":2979},"indent":[]}}],"position":{"start":{"line":105,"column":1,"offset":2881},"end":{"line":105,"column":99,"offset":2979},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"SSL version 1.0.0 is no longer accessible in Raspbian. ","position":{"start":{"line":106,"column":3,"offset":2982},"end":{"line":106,"column":58,"offset":3037},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/109","children":[{"type":"text","value":"#109","position":{"start":{"line":106,"column":59,"offset":3038},"end":{"line":106,"column":63,"offset":3042},"indent":[]}}],"position":{"start":{"line":106,"column":58,"offset":3037},"end":{"line":106,"column":117,"offset":3096},"indent":[]}}],"position":{"start":{"line":106,"column":3,"offset":2982},"end":{"line":106,"column":117,"offset":3096},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":2980},"end":{"line":106,"column":117,"offset":3096},"indent":[]}}],"position":{"start":{"line":103,"column":1,"offset":2674},"end":{"line":106,"column":117,"offset":3096},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.4.2","position":{"start":{"line":108,"column":5,"offset":3102},"end":{"line":108,"column":10,"offset":3107},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":3098},"end":{"line":108,"column":10,"offset":3107},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":110,"column":6,"offset":3114},"end":{"line":110,"column":9,"offset":3117},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":3109},"end":{"line":110,"column":9,"offset":3117},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Typo in french translation, causes the web interface crash.","position":{"start":{"line":112,"column":3,"offset":3121},"end":{"line":112,"column":62,"offset":3180},"indent":[]}}],"position":{"start":{"line":112,"column":3,"offset":3121},"end":{"line":112,"column":62,"offset":3180},"indent":[]}}],"position":{"start":{"line":112,"column":1,"offset":3119},"end":{"line":112,"column":62,"offset":3180},"indent":[]}}],"position":{"start":{"line":112,"column":1,"offset":3119},"end":{"line":112,"column":62,"offset":3180},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":114,"column":6,"offset":3187},"end":{"line":114,"column":15,"offset":3196},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3182},"end":{"line":114,"column":15,"offset":3196},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved major bug in livestream: memory leak in stream class. ","position":{"start":{"line":116,"column":3,"offset":3200},"end":{"line":116,"column":66,"offset":3263},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/94","children":[{"type":"text","value":"#94","position":{"start":{"line":116,"column":67,"offset":3264},"end":{"line":116,"column":70,"offset":3267},"indent":[]}}],"position":{"start":{"line":116,"column":66,"offset":3263},"end":{"line":116,"column":123,"offset":3320},"indent":[]}}],"position":{"start":{"line":116,"column":3,"offset":3200},"end":{"line":116,"column":123,"offset":3320},"indent":[]}}],"position":{"start":{"line":116,"column":1,"offset":3198},"end":{"line":116,"column":123,"offset":3320},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Capture health verification: check if the chosen capture device is still grabbing (and didn't stalled).","position":{"start":{"line":117,"column":3,"offset":3323},"end":{"line":117,"column":106,"offset":3426},"indent":[]}}],"position":{"start":{"line":117,"column":3,"offset":3323},"end":{"line":117,"column":106,"offset":3426},"indent":[]}}],"position":{"start":{"line":117,"column":1,"offset":3321},"end":{"line":117,"column":106,"offset":3426},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Extra logging when recording with raspberry pi camera.","position":{"start":{"line":118,"column":3,"offset":3429},"end":{"line":118,"column":57,"offset":3483},"indent":[]}}],"position":{"start":{"line":118,"column":3,"offset":3429},"end":{"line":118,"column":57,"offset":3483},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3427},"end":{"line":118,"column":57,"offset":3483},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Make sure the cloud upload is functioning properly, after an upload it's verified if the files really exist in the cloud.","position":{"start":{"line":119,"column":3,"offset":3486},"end":{"line":119,"column":124,"offset":3607},"indent":[]}}],"position":{"start":{"line":119,"column":3,"offset":3486},"end":{"line":119,"column":124,"offset":3607},"indent":[]}}],"position":{"start":{"line":119,"column":1,"offset":3484},"end":{"line":119,"column":124,"offset":3607},"indent":[]}}],"position":{"start":{"line":116,"column":1,"offset":3198},"end":{"line":119,"column":124,"offset":3607},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.4.1","position":{"start":{"line":121,"column":5,"offset":3613},"end":{"line":121,"column":10,"offset":3618},"indent":[]}}],"position":{"start":{"line":121,"column":1,"offset":3609},"end":{"line":121,"column":10,"offset":3618},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":123,"column":6,"offset":3625},"end":{"line":123,"column":9,"offset":3628},"indent":[]}}],"position":{"start":{"line":123,"column":1,"offset":3620},"end":{"line":123,"column":9,"offset":3628},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Show warning when system is disabled. ","position":{"start":{"line":125,"column":3,"offset":3632},"end":{"line":125,"column":41,"offset":3670},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/88","children":[{"type":"text","value":"#88","position":{"start":{"line":125,"column":42,"offset":3671},"end":{"line":125,"column":45,"offset":3674},"indent":[]}}],"position":{"start":{"line":125,"column":41,"offset":3670},"end":{"line":125,"column":92,"offset":3721},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":125,"column":92,"offset":3721},"end":{"line":125,"column":93,"offset":3722},"indent":[]}}],"position":{"start":{"line":125,"column":3,"offset":3632},"end":{"line":125,"column":93,"offset":3722},"indent":[]}}],"position":{"start":{"line":125,"column":1,"offset":3630},"end":{"line":125,"column":93,"offset":3722},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Hull selector in basic view not always working.","position":{"start":{"line":126,"column":3,"offset":3725},"end":{"line":126,"column":50,"offset":3772},"indent":[]}}],"position":{"start":{"line":126,"column":3,"offset":3725},"end":{"line":126,"column":50,"offset":3772},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":3723},"end":{"line":126,"column":50,"offset":3772},"indent":[]}}],"position":{"start":{"line":125,"column":1,"offset":3630},"end":{"line":126,"column":50,"offset":3772},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.4.0","position":{"start":{"line":128,"column":5,"offset":3778},"end":{"line":128,"column":10,"offset":3783},"indent":[]}}],"position":{"start":{"line":128,"column":1,"offset":3774},"end":{"line":128,"column":10,"offset":3783},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":130,"column":6,"offset":3790},"end":{"line":130,"column":15,"offset":3799},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":3785},"end":{"line":130,"column":15,"offset":3799},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Enable/Disable force network mode.","position":{"start":{"line":132,"column":3,"offset":3803},"end":{"line":132,"column":37,"offset":3837},"indent":[]}}],"position":{"start":{"line":132,"column":3,"offset":3803},"end":{"line":132,"column":37,"offset":3837},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":3801},"end":{"line":132,"column":37,"offset":3837},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Enable/Disable auto removal media.","position":{"start":{"line":133,"column":3,"offset":3840},"end":{"line":133,"column":37,"offset":3874},"indent":[]}}],"position":{"start":{"line":133,"column":3,"offset":3840},"end":{"line":133,"column":37,"offset":3874},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":3838},"end":{"line":133,"column":37,"offset":3874},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":3801},"end":{"line":133,"column":37,"offset":3874},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":135,"column":6,"offset":3881},"end":{"line":135,"column":9,"offset":3884},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":3876},"end":{"line":135,"column":9,"offset":3884},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgrade from Laravel 4.2 to Laravel 5.4 ","position":{"start":{"line":137,"column":3,"offset":3888},"end":{"line":137,"column":43,"offset":3928},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/70","children":[{"type":"text","value":"#70","position":{"start":{"line":137,"column":44,"offset":3929},"end":{"line":137,"column":47,"offset":3932},"indent":[]}}],"position":{"start":{"line":137,"column":43,"offset":3928},"end":{"line":137,"column":94,"offset":3979},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":137,"column":94,"offset":3979},"end":{"line":137,"column":95,"offset":3980},"indent":[]}}],"position":{"start":{"line":137,"column":3,"offset":3888},"end":{"line":137,"column":95,"offset":3980},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":3886},"end":{"line":137,"column":95,"offset":3980},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fix bug with heatmap radius slider ","position":{"start":{"line":138,"column":3,"offset":3983},"end":{"line":138,"column":38,"offset":4018},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/84","children":[{"type":"text","value":"#84","position":{"start":{"line":138,"column":39,"offset":4019},"end":{"line":138,"column":42,"offset":4022},"indent":[]}}],"position":{"start":{"line":138,"column":38,"offset":4018},"end":{"line":138,"column":89,"offset":4069},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":138,"column":89,"offset":4069},"end":{"line":138,"column":90,"offset":4070},"indent":[]}}],"position":{"start":{"line":138,"column":3,"offset":3983},"end":{"line":138,"column":90,"offset":4070},"indent":[]}}],"position":{"start":{"line":138,"column":1,"offset":3981},"end":{"line":138,"column":90,"offset":4070},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Design tweaks toggle button (remove outline).","position":{"start":{"line":139,"column":3,"offset":4073},"end":{"line":139,"column":48,"offset":4118},"indent":[]}}],"position":{"start":{"line":139,"column":3,"offset":4073},"end":{"line":139,"column":48,"offset":4118},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4071},"end":{"line":139,"column":48,"offset":4118},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disabled possibility to timestamp video when using hardware acceleration.","position":{"start":{"line":140,"column":3,"offset":4121},"end":{"line":140,"column":76,"offset":4194},"indent":[]}}],"position":{"start":{"line":140,"column":3,"offset":4121},"end":{"line":140,"column":76,"offset":4194},"indent":[]}}],"position":{"start":{"line":140,"column":1,"offset":4119},"end":{"line":140,"column":76,"offset":4194},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":3886},"end":{"line":140,"column":76,"offset":4194},"indent":[1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":142,"column":6,"offset":4201},"end":{"line":142,"column":12,"offset":4207},"indent":[]}}],"position":{"start":{"line":142,"column":1,"offset":4196},"end":{"line":142,"column":12,"offset":4207},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fix SSL support ","position":{"start":{"line":144,"column":3,"offset":4211},"end":{"line":144,"column":19,"offset":4227},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/docker/issues/4","children":[{"type":"text","value":"#4","position":{"start":{"line":144,"column":20,"offset":4228},"end":{"line":144,"column":22,"offset":4230},"indent":[]}}],"position":{"start":{"line":144,"column":19,"offset":4227},"end":{"line":144,"column":71,"offset":4279},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":144,"column":71,"offset":4279},"end":{"line":144,"column":72,"offset":4280},"indent":[]}}],"position":{"start":{"line":144,"column":3,"offset":4211},"end":{"line":144,"column":72,"offset":4280},"indent":[]}}],"position":{"start":{"line":144,"column":1,"offset":4209},"end":{"line":144,"column":72,"offset":4280},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Auto removal if disk is full.","position":{"start":{"line":145,"column":3,"offset":4283},"end":{"line":145,"column":32,"offset":4312},"indent":[]}}],"position":{"start":{"line":145,"column":3,"offset":4283},"end":{"line":145,"column":32,"offset":4312},"indent":[]}}],"position":{"start":{"line":145,"column":1,"offset":4281},"end":{"line":145,"column":32,"offset":4312},"indent":[]}}],"position":{"start":{"line":144,"column":1,"offset":4209},"end":{"line":145,"column":32,"offset":4312},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":147,"column":6,"offset":4319},"end":{"line":147,"column":15,"offset":4328},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4314},"end":{"line":147,"column":15,"offset":4328},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"OpenMAX IL hardware encoding for Raspberry Pi camera. ","position":{"start":{"line":149,"column":3,"offset":4332},"end":{"line":149,"column":57,"offset":4386},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/83","children":[{"type":"text","value":"#83","position":{"start":{"line":149,"column":58,"offset":4387},"end":{"line":149,"column":61,"offset":4390},"indent":[]}}],"position":{"start":{"line":149,"column":57,"offset":4386},"end":{"line":149,"column":114,"offset":4443},"indent":[]}}],"position":{"start":{"line":149,"column":3,"offset":4332},"end":{"line":149,"column":114,"offset":4443},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimized live streaming.","position":{"start":{"line":150,"column":5,"offset":4448},"end":{"line":150,"column":30,"offset":4473},"indent":[]}}],"position":{"start":{"line":150,"column":5,"offset":4448},"end":{"line":150,"column":30,"offset":4473},"indent":[]}}],"position":{"start":{"line":150,"column":3,"offset":4446},"end":{"line":150,"column":30,"offset":4473},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimized h264 recording.","position":{"start":{"line":151,"column":5,"offset":4478},"end":{"line":151,"column":30,"offset":4503},"indent":[]}}],"position":{"start":{"line":151,"column":5,"offset":4478},"end":{"line":151,"column":30,"offset":4503},"indent":[]}}],"position":{"start":{"line":151,"column":3,"offset":4476},"end":{"line":151,"column":30,"offset":4503},"indent":[]}}],"position":{"start":{"line":150,"column":3,"offset":4446},"end":{"line":151,"column":30,"offset":4503},"indent":[3]}}],"position":{"start":{"line":149,"column":1,"offset":4330},"end":{"line":151,"column":30,"offset":4503},"indent":[1,1]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Basic authentication for live streaming (username and password). ","position":{"start":{"line":152,"column":3,"offset":4506},"end":{"line":152,"column":68,"offset":4571},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/80","children":[{"type":"text","value":"#80","position":{"start":{"line":152,"column":69,"offset":4572},"end":{"line":152,"column":72,"offset":4575},"indent":[]}}],"position":{"start":{"line":152,"column":68,"offset":4571},"end":{"line":152,"column":125,"offset":4628},"indent":[]}}],"position":{"start":{"line":152,"column":3,"offset":4506},"end":{"line":152,"column":125,"offset":4628},"indent":[]}}],"position":{"start":{"line":152,"column":1,"offset":4504},"end":{"line":152,"column":125,"offset":4628},"indent":[]}}],"position":{"start":{"line":149,"column":1,"offset":4330},"end":{"line":152,"column":125,"offset":4628},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.3.1","position":{"start":{"line":154,"column":5,"offset":4634},"end":{"line":154,"column":10,"offset":4639},"indent":[]}}],"position":{"start":{"line":154,"column":1,"offset":4630},"end":{"line":154,"column":10,"offset":4639},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":156,"column":6,"offset":4646},"end":{"line":156,"column":15,"offset":4655},"indent":[]}}],"position":{"start":{"line":156,"column":1,"offset":4641},"end":{"line":156,"column":15,"offset":4655},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Update for kerberos.cloud: pushing content-type.","position":{"start":{"line":158,"column":3,"offset":4659},"end":{"line":158,"column":51,"offset":4707},"indent":[]}}],"position":{"start":{"line":158,"column":3,"offset":4659},"end":{"line":158,"column":51,"offset":4707},"indent":[]}}],"position":{"start":{"line":158,"column":1,"offset":4657},"end":{"line":158,"column":51,"offset":4707},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Change default configurations.","position":{"start":{"line":159,"column":3,"offset":4710},"end":{"line":159,"column":33,"offset":4740},"indent":[]}}],"position":{"start":{"line":159,"column":3,"offset":4710},"end":{"line":159,"column":33,"offset":4740},"indent":[]}}],"position":{"start":{"line":159,"column":1,"offset":4708},"end":{"line":159,"column":33,"offset":4740},"indent":[]}}],"position":{"start":{"line":158,"column":1,"offset":4657},"end":{"line":159,"column":33,"offset":4740},"indent":[1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.3.0","position":{"start":{"line":161,"column":5,"offset":4746},"end":{"line":161,"column":10,"offset":4751},"indent":[]}}],"position":{"start":{"line":161,"column":1,"offset":4742},"end":{"line":161,"column":10,"offset":4751},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":163,"column":6,"offset":4758},"end":{"line":163,"column":15,"offset":4767},"indent":[]}}],"position":{"start":{"line":163,"column":1,"offset":4753},"end":{"line":163,"column":15,"offset":4767},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for Raspberry Pi Zero W. ","position":{"start":{"line":165,"column":3,"offset":4771},"end":{"line":165,"column":36,"offset":4804},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/8","children":[{"type":"text","value":"#8","position":{"start":{"line":165,"column":37,"offset":4805},"end":{"line":165,"column":39,"offset":4807},"indent":[]}}],"position":{"start":{"line":165,"column":36,"offset":4804},"end":{"line":165,"column":86,"offset":4854},"indent":[]}}],"position":{"start":{"line":165,"column":3,"offset":4771},"end":{"line":165,"column":86,"offset":4854},"indent":[]}}],"position":{"start":{"line":165,"column":1,"offset":4769},"end":{"line":165,"column":86,"offset":4854},"indent":[]}}],"position":{"start":{"line":165,"column":1,"offset":4769},"end":{"line":165,"column":86,"offset":4854},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.2.1","position":{"start":{"line":167,"column":5,"offset":4860},"end":{"line":167,"column":10,"offset":4865},"indent":[]}}],"position":{"start":{"line":167,"column":1,"offset":4856},"end":{"line":167,"column":10,"offset":4865},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":169,"column":6,"offset":4872},"end":{"line":169,"column":15,"offset":4881},"indent":[]}}],"position":{"start":{"line":169,"column":1,"offset":4867},"end":{"line":169,"column":15,"offset":4881},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgraded FFmpeg and libx264 on KiOS.","position":{"start":{"line":171,"column":3,"offset":4885},"end":{"line":171,"column":39,"offset":4921},"indent":[]}}],"position":{"start":{"line":171,"column":3,"offset":4885},"end":{"line":171,"column":39,"offset":4921},"indent":[]}}],"position":{"start":{"line":171,"column":1,"offset":4883},"end":{"line":171,"column":39,"offset":4921},"indent":[]}}],"position":{"start":{"line":171,"column":1,"offset":4883},"end":{"line":171,"column":39,"offset":4921},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":173,"column":6,"offset":4928},"end":{"line":173,"column":9,"offset":4931},"indent":[]}}],"position":{"start":{"line":173,"column":1,"offset":4923},"end":{"line":173,"column":9,"offset":4931},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add Bulgarian translation. ","position":{"start":{"line":175,"column":3,"offset":4935},"end":{"line":175,"column":30,"offset":4962},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/pull/81","children":[{"type":"text","value":"#81","position":{"start":{"line":175,"column":31,"offset":4963},"end":{"line":175,"column":34,"offset":4966},"indent":[]}}],"position":{"start":{"line":175,"column":30,"offset":4962},"end":{"line":175,"column":79,"offset":5011},"indent":[]}}],"position":{"start":{"line":175,"column":3,"offset":4935},"end":{"line":175,"column":79,"offset":5011},"indent":[]}}],"position":{"start":{"line":175,"column":1,"offset":4933},"end":{"line":175,"column":79,"offset":5011},"indent":[]}}],"position":{"start":{"line":175,"column":1,"offset":4933},"end":{"line":175,"column":79,"offset":5011},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":177,"column":6,"offset":5018},"end":{"line":177,"column":15,"offset":5027},"indent":[]}}],"position":{"start":{"line":177,"column":1,"offset":5013},"end":{"line":177,"column":15,"offset":5027},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: IoVideo crashes due to a memory leak. ","position":{"start":{"line":179,"column":3,"offset":5031},"end":{"line":179,"column":46,"offset":5074},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/70","children":[{"type":"text","value":"#70","position":{"start":{"line":179,"column":47,"offset":5075},"end":{"line":179,"column":50,"offset":5078},"indent":[]}}],"position":{"start":{"line":179,"column":46,"offset":5074},"end":{"line":179,"column":103,"offset":5131},"indent":[]}}],"position":{"start":{"line":179,"column":3,"offset":5031},"end":{"line":179,"column":103,"offset":5131},"indent":[]}}],"position":{"start":{"line":179,"column":1,"offset":5029},"end":{"line":179,"column":103,"offset":5131},"indent":[]}}],"position":{"start":{"line":179,"column":1,"offset":5029},"end":{"line":179,"column":103,"offset":5131},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.2.0","position":{"start":{"line":181,"column":5,"offset":5137},"end":{"line":181,"column":10,"offset":5142},"indent":[]}}],"position":{"start":{"line":181,"column":1,"offset":5133},"end":{"line":181,"column":10,"offset":5142},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":183,"column":6,"offset":5149},"end":{"line":183,"column":15,"offset":5158},"indent":[]}}],"position":{"start":{"line":183,"column":1,"offset":5144},"end":{"line":183,"column":15,"offset":5158},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added support for Armbian.","position":{"start":{"line":185,"column":3,"offset":5162},"end":{"line":185,"column":29,"offset":5188},"indent":[]}}],"position":{"start":{"line":185,"column":3,"offset":5162},"end":{"line":185,"column":29,"offset":5188},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":5160},"end":{"line":185,"column":29,"offset":5188},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Raspbian: Async requests causes session corruption. ","position":{"start":{"line":186,"column":3,"offset":5191},"end":{"line":186,"column":55,"offset":5243},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/78","children":[{"type":"text","value":"#78","position":{"start":{"line":186,"column":56,"offset":5244},"end":{"line":186,"column":59,"offset":5247},"indent":[]}}],"position":{"start":{"line":186,"column":55,"offset":5243},"end":{"line":186,"column":106,"offset":5294},"indent":[]}}],"position":{"start":{"line":186,"column":3,"offset":5191},"end":{"line":186,"column":106,"offset":5294},"indent":[]}}],"position":{"start":{"line":186,"column":1,"offset":5189},"end":{"line":186,"column":106,"offset":5294},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":5160},"end":{"line":186,"column":106,"offset":5294},"indent":[1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":188,"column":6,"offset":5301},"end":{"line":188,"column":9,"offset":5304},"indent":[]}}],"position":{"start":{"line":188,"column":1,"offset":5296},"end":{"line":188,"column":9,"offset":5304},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: Issue format instance name. ","position":{"start":{"line":190,"column":3,"offset":5308},"end":{"line":190,"column":36,"offset":5341},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/57","children":[{"type":"text","value":"#57","position":{"start":{"line":190,"column":37,"offset":5342},"end":{"line":190,"column":40,"offset":5345},"indent":[]}}],"position":{"start":{"line":190,"column":36,"offset":5341},"end":{"line":190,"column":87,"offset":5392},"indent":[]}}],"position":{"start":{"line":190,"column":3,"offset":5308},"end":{"line":190,"column":87,"offset":5392},"indent":[]}}],"position":{"start":{"line":190,"column":1,"offset":5306},"end":{"line":190,"column":87,"offset":5392},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Redesign settings page (better UX). ","position":{"start":{"line":191,"column":3,"offset":5395},"end":{"line":191,"column":39,"offset":5431},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/39","children":[{"type":"text","value":"#39","position":{"start":{"line":191,"column":40,"offset":5432},"end":{"line":191,"column":43,"offset":5435},"indent":[]}}],"position":{"start":{"line":191,"column":39,"offset":5431},"end":{"line":191,"column":90,"offset":5482},"indent":[]}}],"position":{"start":{"line":191,"column":3,"offset":5395},"end":{"line":191,"column":90,"offset":5482},"indent":[]}}],"position":{"start":{"line":191,"column":1,"offset":5393},"end":{"line":191,"column":90,"offset":5482},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Possibility to edit password through web interface. ","position":{"start":{"line":192,"column":3,"offset":5485},"end":{"line":192,"column":55,"offset":5537},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/63","children":[{"type":"text","value":"#63","position":{"start":{"line":192,"column":56,"offset":5538},"end":{"line":192,"column":59,"offset":5541},"indent":[]}}],"position":{"start":{"line":192,"column":55,"offset":5537},"end":{"line":192,"column":106,"offset":5588},"indent":[]}}],"position":{"start":{"line":192,"column":3,"offset":5485},"end":{"line":192,"column":106,"offset":5588},"indent":[]}}],"position":{"start":{"line":192,"column":1,"offset":5483},"end":{"line":192,"column":106,"offset":5588},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for viewing videos.","position":{"start":{"line":193,"column":3,"offset":5591},"end":{"line":193,"column":30,"offset":5618},"indent":[]}}],"position":{"start":{"line":193,"column":3,"offset":5591},"end":{"line":193,"column":30,"offset":5618},"indent":[]}}],"position":{"start":{"line":193,"column":1,"offset":5589},"end":{"line":193,"column":30,"offset":5618},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Update radius of heatmap.","position":{"start":{"line":194,"column":3,"offset":5621},"end":{"line":194,"column":28,"offset":5646},"indent":[]}}],"position":{"start":{"line":194,"column":3,"offset":5621},"end":{"line":194,"column":28,"offset":5646},"indent":[]}}],"position":{"start":{"line":194,"column":1,"offset":5619},"end":{"line":194,"column":28,"offset":5646},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"PHP7 support. ","position":{"start":{"line":195,"column":3,"offset":5649},"end":{"line":195,"column":17,"offset":5663},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/60","children":[{"type":"text","value":"#60","position":{"start":{"line":195,"column":18,"offset":5664},"end":{"line":195,"column":21,"offset":5667},"indent":[]}}],"position":{"start":{"line":195,"column":17,"offset":5663},"end":{"line":195,"column":68,"offset":5714},"indent":[]}}],"position":{"start":{"line":195,"column":3,"offset":5649},"end":{"line":195,"column":68,"offset":5714},"indent":[]}}],"position":{"start":{"line":195,"column":1,"offset":5647},"end":{"line":195,"column":68,"offset":5714},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Welcome/installation page. ","position":{"start":{"line":196,"column":3,"offset":5717},"end":{"line":196,"column":30,"offset":5744},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/60","children":[{"type":"text","value":"#60","position":{"start":{"line":196,"column":31,"offset":5745},"end":{"line":196,"column":34,"offset":5748},"indent":[]}}],"position":{"start":{"line":196,"column":30,"offset":5744},"end":{"line":196,"column":81,"offset":5795},"indent":[]}}],"position":{"start":{"line":196,"column":3,"offset":5717},"end":{"line":196,"column":81,"offset":5795},"indent":[]}}],"position":{"start":{"line":196,"column":1,"offset":5715},"end":{"line":196,"column":81,"offset":5795},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Translation updated. ","position":{"start":{"line":197,"column":3,"offset":5798},"end":{"line":197,"column":24,"offset":5819},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/74","children":[{"type":"text","value":"#74","position":{"start":{"line":197,"column":25,"offset":5820},"end":{"line":197,"column":28,"offset":5823},"indent":[]}}],"position":{"start":{"line":197,"column":24,"offset":5819},"end":{"line":197,"column":75,"offset":5870},"indent":[]}}],"position":{"start":{"line":197,"column":3,"offset":5798},"end":{"line":197,"column":75,"offset":5870},"indent":[]}}],"position":{"start":{"line":197,"column":1,"offset":5796},"end":{"line":197,"column":75,"offset":5870},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Privacy mode. ","position":{"start":{"line":198,"column":3,"offset":5873},"end":{"line":198,"column":17,"offset":5887},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/54","children":[{"type":"text","value":"#54","position":{"start":{"line":198,"column":18,"offset":5888},"end":{"line":198,"column":21,"offset":5891},"indent":[]}}],"position":{"start":{"line":198,"column":17,"offset":5887},"end":{"line":198,"column":68,"offset":5938},"indent":[]}}],"position":{"start":{"line":198,"column":3,"offset":5873},"end":{"line":198,"column":68,"offset":5938},"indent":[]}}],"position":{"start":{"line":198,"column":1,"offset":5871},"end":{"line":198,"column":68,"offset":5938},"indent":[]}}],"position":{"start":{"line":190,"column":1,"offset":5306},"end":{"line":198,"column":68,"offset":5938},"indent":[1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":200,"column":6,"offset":5945},"end":{"line":200,"column":15,"offset":5954},"indent":[]}}],"position":{"start":{"line":200,"column":1,"offset":5940},"end":{"line":200,"column":15,"offset":5954},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Output as video file. ","position":{"start":{"line":202,"column":3,"offset":5958},"end":{"line":202,"column":25,"offset":5980},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/60","children":[{"type":"text","value":"#60","position":{"start":{"line":202,"column":26,"offset":5981},"end":{"line":202,"column":29,"offset":5984},"indent":[]}}],"position":{"start":{"line":202,"column":25,"offset":5980},"end":{"line":202,"column":82,"offset":6037},"indent":[]}}],"position":{"start":{"line":202,"column":3,"offset":5958},"end":{"line":202,"column":82,"offset":6037},"indent":[]}}],"position":{"start":{"line":202,"column":1,"offset":5956},"end":{"line":202,"column":82,"offset":6037},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: System hangs when a wrong IP camera url was defined. ","position":{"start":{"line":203,"column":3,"offset":6040},"end":{"line":203,"column":61,"offset":6098},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/48","children":[{"type":"text","value":"#48","position":{"start":{"line":203,"column":62,"offset":6099},"end":{"line":203,"column":65,"offset":6102},"indent":[]}}],"position":{"start":{"line":203,"column":61,"offset":6098},"end":{"line":203,"column":118,"offset":6155},"indent":[]}}],"position":{"start":{"line":203,"column":3,"offset":6040},"end":{"line":203,"column":118,"offset":6155},"indent":[]}}],"position":{"start":{"line":203,"column":1,"offset":6038},"end":{"line":203,"column":118,"offset":6155},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Run arbitrary script/program. ","position":{"start":{"line":204,"column":3,"offset":6158},"end":{"line":204,"column":33,"offset":6188},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/31","children":[{"type":"text","value":"#31","position":{"start":{"line":204,"column":34,"offset":6189},"end":{"line":204,"column":37,"offset":6192},"indent":[]}}],"position":{"start":{"line":204,"column":33,"offset":6188},"end":{"line":204,"column":90,"offset":6245},"indent":[]}}],"position":{"start":{"line":204,"column":3,"offset":6158},"end":{"line":204,"column":90,"offset":6245},"indent":[]}}],"position":{"start":{"line":204,"column":1,"offset":6156},"end":{"line":204,"column":90,"offset":6245},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Bug: Weird colors from RPi Camera. ","position":{"start":{"line":205,"column":3,"offset":6248},"end":{"line":205,"column":38,"offset":6283},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/64","children":[{"type":"text","value":"#64","position":{"start":{"line":205,"column":39,"offset":6284},"end":{"line":205,"column":42,"offset":6287},"indent":[]}}],"position":{"start":{"line":205,"column":38,"offset":6283},"end":{"line":205,"column":95,"offset":6340},"indent":[]}}],"position":{"start":{"line":205,"column":3,"offset":6248},"end":{"line":205,"column":95,"offset":6340},"indent":[]}}],"position":{"start":{"line":205,"column":1,"offset":6246},"end":{"line":205,"column":95,"offset":6340},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Upgrade to OpenCV 3.2.0.","position":{"start":{"line":206,"column":3,"offset":6343},"end":{"line":206,"column":27,"offset":6367},"indent":[]}}],"position":{"start":{"line":206,"column":3,"offset":6343},"end":{"line":206,"column":27,"offset":6367},"indent":[]}}],"position":{"start":{"line":206,"column":1,"offset":6341},"end":{"line":206,"column":27,"offset":6367},"indent":[]}}],"position":{"start":{"line":202,"column":1,"offset":5956},"end":{"line":206,"column":27,"offset":6367},"indent":[1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.1.0","position":{"start":{"line":208,"column":5,"offset":6373},"end":{"line":208,"column":10,"offset":6378},"indent":[]}}],"position":{"start":{"line":208,"column":1,"offset":6369},"end":{"line":208,"column":10,"offset":6378},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":210,"column":6,"offset":6385},"end":{"line":210,"column":9,"offset":6388},"indent":[]}}],"position":{"start":{"line":210,"column":1,"offset":6380},"end":{"line":210,"column":9,"offset":6388},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added PhotoSwipe for image overview (easier to browse through images). ","position":{"start":{"line":212,"column":3,"offset":6392},"end":{"line":212,"column":74,"offset":6463},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/45","children":[{"type":"text","value":"#45","position":{"start":{"line":212,"column":75,"offset":6464},"end":{"line":212,"column":78,"offset":6467},"indent":[]}}],"position":{"start":{"line":212,"column":74,"offset":6463},"end":{"line":212,"column":125,"offset":6514},"indent":[]}}],"position":{"start":{"line":212,"column":3,"offset":6392},"end":{"line":212,"column":125,"offset":6514},"indent":[]}}],"position":{"start":{"line":212,"column":1,"offset":6390},"end":{"line":212,"column":125,"offset":6514},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added reboot and shutdown commands. ","position":{"start":{"line":213,"column":3,"offset":6517},"end":{"line":213,"column":39,"offset":6553},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/46","children":[{"type":"text","value":"#46","position":{"start":{"line":213,"column":40,"offset":6554},"end":{"line":213,"column":43,"offset":6557},"indent":[]}}],"position":{"start":{"line":213,"column":39,"offset":6553},"end":{"line":213,"column":90,"offset":6604},"indent":[]}}],"position":{"start":{"line":213,"column":3,"offset":6517},"end":{"line":213,"column":90,"offset":6604},"indent":[]}}],"position":{"start":{"line":213,"column":1,"offset":6515},"end":{"line":213,"column":90,"offset":6604},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added logging view to system page. ","position":{"start":{"line":214,"column":3,"offset":6607},"end":{"line":214,"column":38,"offset":6642},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/33","children":[{"type":"text","value":"#33","position":{"start":{"line":214,"column":39,"offset":6643},"end":{"line":214,"column":42,"offset":6646},"indent":[]}}],"position":{"start":{"line":214,"column":38,"offset":6642},"end":{"line":214,"column":89,"offset":6693},"indent":[]}}],"position":{"start":{"line":214,"column":3,"offset":6607},"end":{"line":214,"column":89,"offset":6693},"indent":[]}}],"position":{"start":{"line":214,"column":1,"offset":6605},"end":{"line":214,"column":89,"offset":6693},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added labels to check if machinery is running.","position":{"start":{"line":215,"column":3,"offset":6696},"end":{"line":215,"column":49,"offset":6742},"indent":[]}}],"position":{"start":{"line":215,"column":3,"offset":6696},"end":{"line":215,"column":49,"offset":6742},"indent":[]}}],"position":{"start":{"line":215,"column":1,"offset":6694},"end":{"line":215,"column":49,"offset":6742},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added error handling if web interface isn’t working properly.","position":{"start":{"line":216,"column":3,"offset":6745},"end":{"line":216,"column":64,"offset":6806},"indent":[]}}],"position":{"start":{"line":216,"column":3,"offset":6745},"end":{"line":216,"column":64,"offset":6806},"indent":[]}}],"position":{"start":{"line":216,"column":1,"offset":6743},"end":{"line":216,"column":64,"offset":6806},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed Heatmap.js fail to load by ad-blocker. ","position":{"start":{"line":217,"column":3,"offset":6809},"end":{"line":217,"column":48,"offset":6854},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/42","children":[{"type":"text","value":"#42","position":{"start":{"line":217,"column":49,"offset":6855},"end":{"line":217,"column":52,"offset":6858},"indent":[]}}],"position":{"start":{"line":217,"column":48,"offset":6854},"end":{"line":217,"column":99,"offset":6905},"indent":[]}}],"position":{"start":{"line":217,"column":3,"offset":6809},"end":{"line":217,"column":99,"offset":6905},"indent":[]}}],"position":{"start":{"line":217,"column":1,"offset":6807},"end":{"line":217,"column":99,"offset":6905},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Show additional information on the dashboard (streaming is opening or not) there is no data available.","position":{"start":{"line":218,"column":3,"offset":6908},"end":{"line":218,"column":105,"offset":7010},"indent":[]}}],"position":{"start":{"line":218,"column":3,"offset":6908},"end":{"line":218,"column":105,"offset":7010},"indent":[]}}],"position":{"start":{"line":218,"column":1,"offset":6906},"end":{"line":218,"column":105,"offset":7010},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Settings page is now visible on mobile (+ changed icon).","position":{"start":{"line":219,"column":3,"offset":7013},"end":{"line":219,"column":59,"offset":7069},"indent":[]}}],"position":{"start":{"line":219,"column":3,"offset":7013},"end":{"line":219,"column":59,"offset":7069},"indent":[]}}],"position":{"start":{"line":219,"column":1,"offset":7011},"end":{"line":219,"column":59,"offset":7069},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed sorting of news articles.","position":{"start":{"line":220,"column":3,"offset":7072},"end":{"line":220,"column":34,"offset":7103},"indent":[]}}],"position":{"start":{"line":220,"column":3,"offset":7072},"end":{"line":220,"column":34,"offset":7103},"indent":[]}}],"position":{"start":{"line":220,"column":1,"offset":7070},"end":{"line":220,"column":34,"offset":7103},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Removed links to assets in the cloud (.css files).","position":{"start":{"line":221,"column":3,"offset":7106},"end":{"line":221,"column":53,"offset":7156},"indent":[]}}],"position":{"start":{"line":221,"column":3,"offset":7106},"end":{"line":221,"column":53,"offset":7156},"indent":[]}}],"position":{"start":{"line":221,"column":1,"offset":7104},"end":{"line":221,"column":53,"offset":7156},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Design: improved layout of login page, async loading of image view.","position":{"start":{"line":222,"column":3,"offset":7159},"end":{"line":222,"column":70,"offset":7226},"indent":[]}}],"position":{"start":{"line":222,"column":3,"offset":7159},"end":{"line":222,"column":70,"offset":7226},"indent":[]}}],"position":{"start":{"line":222,"column":1,"offset":7157},"end":{"line":222,"column":70,"offset":7226},"indent":[]}}],"position":{"start":{"line":212,"column":1,"offset":6390},"end":{"line":222,"column":70,"offset":7226},"indent":[1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":224,"column":6,"offset":7233},"end":{"line":224,"column":15,"offset":7242},"indent":[]}}],"position":{"start":{"line":224,"column":1,"offset":7228},"end":{"line":224,"column":15,"offset":7242},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added configurable streaming port and quality. ","position":{"start":{"line":226,"column":3,"offset":7246},"end":{"line":226,"column":50,"offset":7293},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/41","children":[{"type":"text","value":"#41","position":{"start":{"line":226,"column":51,"offset":7294},"end":{"line":226,"column":54,"offset":7297},"indent":[]}}],"position":{"start":{"line":226,"column":50,"offset":7293},"end":{"line":226,"column":107,"offset":7350},"indent":[]}}],"position":{"start":{"line":226,"column":3,"offset":7246},"end":{"line":226,"column":107,"offset":7350},"indent":[]}}],"position":{"start":{"line":226,"column":1,"offset":7244},"end":{"line":226,"column":107,"offset":7350},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added new algorithm: Background subtraction.","position":{"start":{"line":227,"column":3,"offset":7353},"end":{"line":227,"column":47,"offset":7397},"indent":[]}}],"position":{"start":{"line":227,"column":3,"offset":7353},"end":{"line":227,"column":47,"offset":7397},"indent":[]}}],"position":{"start":{"line":227,"column":1,"offset":7351},"end":{"line":227,"column":47,"offset":7397},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added new heuristic: Counter (for object/people counting). ","position":{"start":{"line":228,"column":3,"offset":7400},"end":{"line":228,"column":62,"offset":7459},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/42","children":[{"type":"text","value":"#42","position":{"start":{"line":228,"column":63,"offset":7460},"end":{"line":228,"column":66,"offset":7463},"indent":[]}}],"position":{"start":{"line":228,"column":62,"offset":7459},"end":{"line":228,"column":119,"offset":7516},"indent":[]}}],"position":{"start":{"line":228,"column":3,"offset":7400},"end":{"line":228,"column":119,"offset":7516},"indent":[]}}],"position":{"start":{"line":228,"column":1,"offset":7398},"end":{"line":228,"column":119,"offset":7516},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added video capture, which can be used for debugging purposes (replay a video fragment).","position":{"start":{"line":229,"column":3,"offset":7519},"end":{"line":229,"column":91,"offset":7607},"indent":[]}}],"position":{"start":{"line":229,"column":3,"offset":7519},"end":{"line":229,"column":91,"offset":7607},"indent":[]}}],"position":{"start":{"line":229,"column":1,"offset":7517},"end":{"line":229,"column":91,"offset":7607},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"It’s now possible to mark the images with a timestamp. ","position":{"start":{"line":230,"column":3,"offset":7610},"end":{"line":230,"column":58,"offset":7665},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/36","children":[{"type":"text","value":"#36","position":{"start":{"line":230,"column":59,"offset":7666},"end":{"line":230,"column":62,"offset":7669},"indent":[]}}],"position":{"start":{"line":230,"column":58,"offset":7665},"end":{"line":230,"column":115,"offset":7722},"indent":[]}}],"position":{"start":{"line":230,"column":3,"offset":7610},"end":{"line":230,"column":115,"offset":7722},"indent":[]}}],"position":{"start":{"line":230,"column":1,"offset":7608},"end":{"line":230,"column":115,"offset":7722},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed blocking streaming socket. ","position":{"start":{"line":231,"column":3,"offset":7725},"end":{"line":231,"column":36,"offset":7758},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/39","children":[{"type":"text","value":"#39","position":{"start":{"line":231,"column":37,"offset":7759},"end":{"line":231,"column":40,"offset":7762},"indent":[]}}],"position":{"start":{"line":231,"column":36,"offset":7758},"end":{"line":231,"column":93,"offset":7815},"indent":[]}}],"position":{"start":{"line":231,"column":3,"offset":7725},"end":{"line":231,"column":93,"offset":7815},"indent":[]}}],"position":{"start":{"line":231,"column":1,"offset":7723},"end":{"line":231,"column":93,"offset":7815},"indent":[]}}],"position":{"start":{"line":226,"column":1,"offset":7244},"end":{"line":231,"column":93,"offset":7815},"indent":[1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":233,"column":6,"offset":7822},"end":{"line":233,"column":15,"offset":7831},"indent":[]}}],"position":{"start":{"line":233,"column":1,"offset":7817},"end":{"line":233,"column":15,"offset":7831},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fix removal images if disk is almost full (wrong path was defined).","position":{"start":{"line":235,"column":3,"offset":7835},"end":{"line":235,"column":70,"offset":7902},"indent":[]}}],"position":{"start":{"line":235,"column":3,"offset":7835},"end":{"line":235,"column":70,"offset":7902},"indent":[]}}],"position":{"start":{"line":235,"column":1,"offset":7833},"end":{"line":235,"column":70,"offset":7902},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi Camera module v2.1. ","position":{"start":{"line":236,"column":3,"offset":7905},"end":{"line":236,"column":52,"offset":7954},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/3","children":[{"type":"text","value":"#3","position":{"start":{"line":236,"column":53,"offset":7955},"end":{"line":236,"column":55,"offset":7957},"indent":[]}}],"position":{"start":{"line":236,"column":52,"offset":7954},"end":{"line":236,"column":102,"offset":8004},"indent":[]}}],"position":{"start":{"line":236,"column":3,"offset":7905},"end":{"line":236,"column":102,"offset":8004},"indent":[]}}],"position":{"start":{"line":236,"column":1,"offset":7903},"end":{"line":236,"column":102,"offset":8004},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support for the Raspberry Pi Zero; updated kernel to latest Raspbian. ","position":{"start":{"line":237,"column":3,"offset":8007},"end":{"line":237,"column":73,"offset":8077},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/3","children":[{"type":"text","value":"#3","position":{"start":{"line":237,"column":74,"offset":8078},"end":{"line":237,"column":76,"offset":8080},"indent":[]}}],"position":{"start":{"line":237,"column":73,"offset":8077},"end":{"line":237,"column":123,"offset":8127},"indent":[]}}],"position":{"start":{"line":237,"column":3,"offset":8007},"end":{"line":237,"column":123,"offset":8127},"indent":[]}}],"position":{"start":{"line":237,"column":1,"offset":8005},"end":{"line":237,"column":123,"offset":8127},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"KiOS GUI installer.","position":{"start":{"line":238,"column":3,"offset":8130},"end":{"line":238,"column":22,"offset":8149},"indent":[]}}],"position":{"start":{"line":238,"column":3,"offset":8130},"end":{"line":238,"column":22,"offset":8149},"indent":[]}}],"position":{"start":{"line":238,"column":1,"offset":8128},"end":{"line":238,"column":22,"offset":8149},"indent":[]}}],"position":{"start":{"line":235,"column":1,"offset":7833},"end":{"line":238,"column":22,"offset":8149},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"2.0.0","position":{"start":{"line":240,"column":5,"offset":8155},"end":{"line":240,"column":10,"offset":8160},"indent":[]}}],"position":{"start":{"line":240,"column":1,"offset":8151},"end":{"line":240,"column":10,"offset":8160},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":242,"column":6,"offset":8167},"end":{"line":242,"column":9,"offset":8170},"indent":[]}}],"position":{"start":{"line":242,"column":1,"offset":8162},"end":{"line":242,"column":9,"offset":8170},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add simple ON/OFF toggle. ","position":{"start":{"line":244,"column":3,"offset":8174},"end":{"line":244,"column":29,"offset":8200},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/24","children":[{"type":"text","value":"#24","position":{"start":{"line":244,"column":30,"offset":8201},"end":{"line":244,"column":33,"offset":8204},"indent":[]}}],"position":{"start":{"line":244,"column":29,"offset":8200},"end":{"line":244,"column":80,"offset":8251},"indent":[]}}],"position":{"start":{"line":244,"column":3,"offset":8174},"end":{"line":244,"column":80,"offset":8251},"indent":[]}}],"position":{"start":{"line":244,"column":1,"offset":8172},"end":{"line":244,"column":80,"offset":8251},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added update strategy when using KiOS. ","position":{"start":{"line":245,"column":3,"offset":8254},"end":{"line":245,"column":42,"offset":8293},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/23","children":[{"type":"text","value":"#23","position":{"start":{"line":245,"column":43,"offset":8294},"end":{"line":245,"column":46,"offset":8297},"indent":[]}}],"position":{"start":{"line":245,"column":42,"offset":8293},"end":{"line":245,"column":93,"offset":8344},"indent":[]}}],"position":{"start":{"line":245,"column":3,"offset":8254},"end":{"line":245,"column":93,"offset":8344},"indent":[]}}],"position":{"start":{"line":245,"column":1,"offset":8252},"end":{"line":245,"column":93,"offset":8344},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"A system page which shows system information. ","position":{"start":{"line":246,"column":3,"offset":8347},"end":{"line":246,"column":49,"offset":8393},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/20","children":[{"type":"text","value":"#20","position":{"start":{"line":246,"column":50,"offset":8394},"end":{"line":246,"column":53,"offset":8397},"indent":[]}}],"position":{"start":{"line":246,"column":49,"offset":8393},"end":{"line":246,"column":100,"offset":8444},"indent":[]}}],"position":{"start":{"line":246,"column":3,"offset":8347},"end":{"line":246,"column":100,"offset":8444},"indent":[]}}],"position":{"start":{"line":246,"column":1,"offset":8345},"end":{"line":246,"column":100,"offset":8444},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Heatmap on dashboard page ","position":{"start":{"line":247,"column":3,"offset":8447},"end":{"line":247,"column":29,"offset":8473},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/19","children":[{"type":"text","value":"#19","position":{"start":{"line":247,"column":30,"offset":8474},"end":{"line":247,"column":33,"offset":8477},"indent":[]}}],"position":{"start":{"line":247,"column":29,"offset":8473},"end":{"line":247,"column":80,"offset":8524},"indent":[]}}],"position":{"start":{"line":247,"column":3,"offset":8447},"end":{"line":247,"column":80,"offset":8524},"indent":[]}}],"position":{"start":{"line":247,"column":1,"offset":8445},"end":{"line":247,"column":80,"offset":8524},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added live stream view on the dashboard page ","position":{"start":{"line":248,"column":3,"offset":8527},"end":{"line":248,"column":48,"offset":8572},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/2","children":[{"type":"text","value":"#2","position":{"start":{"line":248,"column":49,"offset":8573},"end":{"line":248,"column":51,"offset":8575},"indent":[]}}],"position":{"start":{"line":248,"column":48,"offset":8572},"end":{"line":248,"column":97,"offset":8621},"indent":[]}}],"position":{"start":{"line":248,"column":3,"offset":8527},"end":{"line":248,"column":97,"offset":8621},"indent":[]}}],"position":{"start":{"line":248,"column":1,"offset":8525},"end":{"line":248,"column":97,"offset":8621},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed bug cloud syncing ","position":{"start":{"line":249,"column":3,"offset":8624},"end":{"line":249,"column":27,"offset":8648},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/16","children":[{"type":"text","value":"#16","position":{"start":{"line":249,"column":28,"offset":8649},"end":{"line":249,"column":31,"offset":8652},"indent":[]}}],"position":{"start":{"line":249,"column":27,"offset":8648},"end":{"line":249,"column":78,"offset":8699},"indent":[]}}],"position":{"start":{"line":249,"column":3,"offset":8624},"end":{"line":249,"column":78,"offset":8699},"indent":[]}}],"position":{"start":{"line":249,"column":1,"offset":8622},"end":{"line":249,"column":78,"offset":8699},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed broken settings page when space in instane name ","position":{"start":{"line":250,"column":3,"offset":8702},"end":{"line":250,"column":57,"offset":8756},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/16","children":[{"type":"text","value":"#16","position":{"start":{"line":250,"column":58,"offset":8757},"end":{"line":250,"column":61,"offset":8760},"indent":[]}}],"position":{"start":{"line":250,"column":57,"offset":8756},"end":{"line":250,"column":108,"offset":8807},"indent":[]}}],"position":{"start":{"line":250,"column":3,"offset":8702},"end":{"line":250,"column":108,"offset":8807},"indent":[]}}],"position":{"start":{"line":250,"column":1,"offset":8700},"end":{"line":250,"column":108,"offset":8807},"indent":[]}}],"position":{"start":{"line":244,"column":1,"offset":8172},"end":{"line":250,"column":108,"offset":8807},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":252,"column":6,"offset":8814},"end":{"line":252,"column":15,"offset":8823},"indent":[]}}],"position":{"start":{"line":252,"column":1,"offset":8809},"end":{"line":252,"column":15,"offset":8823},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"RTSP support for IP-camera's. ","position":{"start":{"line":254,"column":3,"offset":8827},"end":{"line":254,"column":33,"offset":8857},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/21","children":[{"type":"text","value":"#21","position":{"start":{"line":254,"column":34,"offset":8858},"end":{"line":254,"column":37,"offset":8861},"indent":[]}}],"position":{"start":{"line":254,"column":33,"offset":8857},"end":{"line":254,"column":90,"offset":8914},"indent":[]}}],"position":{"start":{"line":254,"column":3,"offset":8827},"end":{"line":254,"column":90,"offset":8914},"indent":[]}}],"position":{"start":{"line":254,"column":1,"offset":8825},"end":{"line":254,"column":90,"offset":8914},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Verbose logging. ","position":{"start":{"line":255,"column":3,"offset":8917},"end":{"line":255,"column":20,"offset":8934},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/35","children":[{"type":"text","value":"#35","position":{"start":{"line":255,"column":21,"offset":8935},"end":{"line":255,"column":24,"offset":8938},"indent":[]}}],"position":{"start":{"line":255,"column":20,"offset":8934},"end":{"line":255,"column":77,"offset":8991},"indent":[]}}],"position":{"start":{"line":255,"column":3,"offset":8917},"end":{"line":255,"column":77,"offset":8991},"indent":[]}}],"position":{"start":{"line":255,"column":1,"offset":8915},"end":{"line":255,"column":77,"offset":8991},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"IO-devices are executed in a seperate thread. ","position":{"start":{"line":256,"column":3,"offset":8994},"end":{"line":256,"column":49,"offset":9040},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/28","children":[{"type":"text","value":"#28","position":{"start":{"line":256,"column":50,"offset":9041},"end":{"line":256,"column":53,"offset":9044},"indent":[]}}],"position":{"start":{"line":256,"column":49,"offset":9040},"end":{"line":256,"column":106,"offset":9097},"indent":[]}}],"position":{"start":{"line":256,"column":3,"offset":8994},"end":{"line":256,"column":106,"offset":9097},"indent":[]}}],"position":{"start":{"line":256,"column":1,"offset":8992},"end":{"line":256,"column":106,"offset":9097},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Live streaming (MJPEG). ","position":{"start":{"line":257,"column":3,"offset":9100},"end":{"line":257,"column":27,"offset":9124},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/26","children":[{"type":"text","value":"#26","position":{"start":{"line":257,"column":28,"offset":9125},"end":{"line":257,"column":31,"offset":9128},"indent":[]}}],"position":{"start":{"line":257,"column":27,"offset":9124},"end":{"line":257,"column":84,"offset":9181},"indent":[]}}],"position":{"start":{"line":257,"column":3,"offset":9100},"end":{"line":257,"column":84,"offset":9181},"indent":[]}}],"position":{"start":{"line":257,"column":1,"offset":9098},"end":{"line":257,"column":84,"offset":9181},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Execute multiple instances on a machine. ","position":{"start":{"line":258,"column":3,"offset":9184},"end":{"line":258,"column":44,"offset":9225},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/24","children":[{"type":"text","value":"#24","position":{"start":{"line":258,"column":45,"offset":9226},"end":{"line":258,"column":48,"offset":9229},"indent":[]}}],"position":{"start":{"line":258,"column":44,"offset":9225},"end":{"line":258,"column":101,"offset":9282},"indent":[]}}],"position":{"start":{"line":258,"column":3,"offset":9184},"end":{"line":258,"column":101,"offset":9282},"indent":[]}}],"position":{"start":{"line":258,"column":1,"offset":9182},"end":{"line":258,"column":101,"offset":9282},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Override config by arguments. ","position":{"start":{"line":259,"column":3,"offset":9285},"end":{"line":259,"column":33,"offset":9315},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/22","children":[{"type":"text","value":"#22","position":{"start":{"line":259,"column":34,"offset":9316},"end":{"line":259,"column":37,"offset":9319},"indent":[]}}],"position":{"start":{"line":259,"column":33,"offset":9315},"end":{"line":259,"column":90,"offset":9372},"indent":[]}}],"position":{"start":{"line":259,"column":3,"offset":9285},"end":{"line":259,"column":90,"offset":9372},"indent":[]}}],"position":{"start":{"line":259,"column":1,"offset":9283},"end":{"line":259,"column":90,"offset":9372},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Move S3 upload to machinery and remove sync-s3 repository. ","position":{"start":{"line":260,"column":3,"offset":9375},"end":{"line":260,"column":62,"offset":9434},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/16","children":[{"type":"text","value":"#16","position":{"start":{"line":260,"column":63,"offset":9435},"end":{"line":260,"column":66,"offset":9438},"indent":[]}}],"position":{"start":{"line":260,"column":62,"offset":9434},"end":{"line":260,"column":119,"offset":9491},"indent":[]}}],"position":{"start":{"line":260,"column":3,"offset":9375},"end":{"line":260,"column":119,"offset":9491},"indent":[]}}],"position":{"start":{"line":260,"column":1,"offset":9373},"end":{"line":260,"column":119,"offset":9491},"indent":[]}}],"position":{"start":{"line":254,"column":1,"offset":8825},"end":{"line":260,"column":119,"offset":9491},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Docker","position":{"start":{"line":262,"column":6,"offset":9498},"end":{"line":262,"column":12,"offset":9504},"indent":[]}}],"position":{"start":{"line":262,"column":1,"offset":9493},"end":{"line":262,"column":12,"offset":9504},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added Docker image (x86_x64) to Docker Hub.","position":{"start":{"line":264,"column":3,"offset":9508},"end":{"line":264,"column":46,"offset":9551},"indent":[]}}],"position":{"start":{"line":264,"column":3,"offset":9508},"end":{"line":264,"column":46,"offset":9551},"indent":[]}}],"position":{"start":{"line":264,"column":1,"offset":9506},"end":{"line":264,"column":46,"offset":9551},"indent":[]}}],"position":{"start":{"line":264,"column":1,"offset":9506},"end":{"line":264,"column":46,"offset":9551},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Ecosystem","position":{"start":{"line":266,"column":6,"offset":9558},"end":{"line":266,"column":15,"offset":9567},"indent":[]}}],"position":{"start":{"line":266,"column":1,"offset":9553},"end":{"line":266,"column":15,"offset":9567},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Add support for Raspberry Pi 1, 2 and 3. ","position":{"start":{"line":268,"column":3,"offset":9571},"end":{"line":268,"column":44,"offset":9612},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/kios/issues/1","children":[{"type":"text","value":"#1","position":{"start":{"line":268,"column":45,"offset":9613},"end":{"line":268,"column":47,"offset":9615},"indent":[]}}],"position":{"start":{"line":268,"column":44,"offset":9612},"end":{"line":268,"column":94,"offset":9662},"indent":[]}}],"position":{"start":{"line":268,"column":3,"offset":9571},"end":{"line":268,"column":94,"offset":9662},"indent":[]}}],"position":{"start":{"line":268,"column":1,"offset":9569},"end":{"line":268,"column":94,"offset":9662},"indent":[]}}],"position":{"start":{"line":268,"column":1,"offset":9569},"end":{"line":268,"column":94,"offset":9662},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.1.0","position":{"start":{"line":270,"column":5,"offset":9668},"end":{"line":270,"column":10,"offset":9673},"indent":[]}}],"position":{"start":{"line":270,"column":1,"offset":9664},"end":{"line":270,"column":10,"offset":9673},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":272,"column":6,"offset":9680},"end":{"line":272,"column":9,"offset":9683},"indent":[]}}],"position":{"start":{"line":272,"column":1,"offset":9675},"end":{"line":272,"column":9,"offset":9683},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support IP camera's with MJPEG stream. ","position":{"start":{"line":274,"column":3,"offset":9687},"end":{"line":274,"column":42,"offset":9726},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/3","children":[{"type":"text","value":"#3","position":{"start":{"line":274,"column":43,"offset":9727},"end":{"line":274,"column":45,"offset":9729},"indent":[]}}],"position":{"start":{"line":274,"column":42,"offset":9726},"end":{"line":274,"column":91,"offset":9775},"indent":[]}}],"position":{"start":{"line":274,"column":3,"offset":9687},"end":{"line":274,"column":91,"offset":9775},"indent":[]}}],"position":{"start":{"line":274,"column":1,"offset":9685},"end":{"line":274,"column":91,"offset":9775},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Introduce new API methods to configure the machinery, using basic auth. ","position":{"start":{"line":275,"column":3,"offset":9778},"end":{"line":275,"column":75,"offset":9850},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/4","children":[{"type":"text","value":"#4","position":{"start":{"line":275,"column":76,"offset":9851},"end":{"line":275,"column":78,"offset":9853},"indent":[]}}],"position":{"start":{"line":275,"column":75,"offset":9850},"end":{"line":275,"column":124,"offset":9899},"indent":[]}}],"position":{"start":{"line":275,"column":3,"offset":9778},"end":{"line":275,"column":124,"offset":9899},"indent":[]}}],"position":{"start":{"line":275,"column":1,"offset":9776},"end":{"line":275,"column":124,"offset":9899},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimization of loading image and dashboard page, completely redesigned the retrieval of images. ","position":{"start":{"line":276,"column":3,"offset":9902},"end":{"line":276,"column":100,"offset":9999},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/5","children":[{"type":"text","value":"#5","position":{"start":{"line":276,"column":101,"offset":10000},"end":{"line":276,"column":103,"offset":10002},"indent":[]}}],"position":{"start":{"line":276,"column":100,"offset":9999},"end":{"line":276,"column":149,"offset":10048},"indent":[]}}],"position":{"start":{"line":276,"column":3,"offset":9902},"end":{"line":276,"column":149,"offset":10048},"indent":[]}}],"position":{"start":{"line":276,"column":1,"offset":9900},"end":{"line":276,"column":149,"offset":10048},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimization of settings page. ","position":{"start":{"line":277,"column":3,"offset":10051},"end":{"line":277,"column":34,"offset":10082},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/5","children":[{"type":"text","value":"#5","position":{"start":{"line":277,"column":35,"offset":10083},"end":{"line":277,"column":37,"offset":10085},"indent":[]}}],"position":{"start":{"line":277,"column":34,"offset":10082},"end":{"line":277,"column":83,"offset":10131},"indent":[]}}],"position":{"start":{"line":277,"column":3,"offset":10051},"end":{"line":277,"column":83,"offset":10131},"indent":[]}}],"position":{"start":{"line":277,"column":1,"offset":10049},"end":{"line":277,"column":83,"offset":10131},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Timebar gradient only works in Chrome. ","position":{"start":{"line":278,"column":3,"offset":10134},"end":{"line":278,"column":42,"offset":10173},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web/issues/6","children":[{"type":"text","value":"#6","position":{"start":{"line":278,"column":43,"offset":10174},"end":{"line":278,"column":45,"offset":10176},"indent":[]}}],"position":{"start":{"line":278,"column":42,"offset":10173},"end":{"line":278,"column":91,"offset":10222},"indent":[]}}],"position":{"start":{"line":278,"column":3,"offset":10134},"end":{"line":278,"column":91,"offset":10222},"indent":[]}}],"position":{"start":{"line":278,"column":1,"offset":10132},"end":{"line":278,"column":91,"offset":10222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Minor CSS fixes for responsive layout.","position":{"start":{"line":279,"column":3,"offset":10225},"end":{"line":279,"column":41,"offset":10263},"indent":[]}}],"position":{"start":{"line":279,"column":3,"offset":10225},"end":{"line":279,"column":41,"offset":10263},"indent":[]}}],"position":{"start":{"line":279,"column":1,"offset":10223},"end":{"line":279,"column":41,"offset":10263},"indent":[]}}],"position":{"start":{"line":274,"column":1,"offset":9685},"end":{"line":279,"column":41,"offset":10263},"indent":[1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":281,"column":6,"offset":10270},"end":{"line":281,"column":15,"offset":10279},"indent":[]}}],"position":{"start":{"line":281,"column":1,"offset":10265},"end":{"line":281,"column":15,"offset":10279},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Flip/rotate option for capture devices. ","position":{"start":{"line":283,"column":3,"offset":10283},"end":{"line":283,"column":43,"offset":10323},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/1","children":[{"type":"text","value":"#5","position":{"start":{"line":283,"column":44,"offset":10324},"end":{"line":283,"column":46,"offset":10326},"indent":[]}}],"position":{"start":{"line":283,"column":43,"offset":10323},"end":{"line":283,"column":98,"offset":10378},"indent":[]}}],"position":{"start":{"line":283,"column":3,"offset":10283},"end":{"line":283,"column":98,"offset":10378},"indent":[]}}],"position":{"start":{"line":283,"column":1,"offset":10281},"end":{"line":283,"column":98,"offset":10378},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Support IP camera's with MJPEG stream. ","position":{"start":{"line":284,"column":3,"offset":10381},"end":{"line":284,"column":42,"offset":10420},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/4","children":[{"type":"text","value":"#4","position":{"start":{"line":284,"column":43,"offset":10421},"end":{"line":284,"column":45,"offset":10423},"indent":[]}}],"position":{"start":{"line":284,"column":42,"offset":10420},"end":{"line":284,"column":97,"offset":10475},"indent":[]}}],"position":{"start":{"line":284,"column":3,"offset":10381},"end":{"line":284,"column":97,"offset":10475},"indent":[]}}],"position":{"start":{"line":284,"column":1,"offset":10379},"end":{"line":284,"column":97,"offset":10475},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Introduced webhook io device. ","position":{"start":{"line":285,"column":3,"offset":10478},"end":{"line":285,"column":33,"offset":10508},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery/issues/5","children":[{"type":"text","value":"#5","position":{"start":{"line":285,"column":34,"offset":10509},"end":{"line":285,"column":36,"offset":10511},"indent":[]}}],"position":{"start":{"line":285,"column":33,"offset":10508},"end":{"line":285,"column":88,"offset":10563},"indent":[]}}],"position":{"start":{"line":285,"column":3,"offset":10478},"end":{"line":285,"column":88,"offset":10563},"indent":[]}}],"position":{"start":{"line":285,"column":1,"offset":10476},"end":{"line":285,"column":88,"offset":10563},"indent":[]}}],"position":{"start":{"line":283,"column":1,"offset":10281},"end":{"line":285,"column":88,"offset":10563},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Cloud","position":{"start":{"line":287,"column":6,"offset":10570},"end":{"line":287,"column":11,"offset":10575},"indent":[]}}],"position":{"start":{"line":287,"column":1,"offset":10565},"end":{"line":287,"column":11,"offset":10575},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Fixed problem when syncing a huge amount of images. ","position":{"start":{"line":289,"column":3,"offset":10579},"end":{"line":289,"column":55,"offset":10631},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/sync-s3/issues/1","children":[{"type":"text","value":"#1","position":{"start":{"line":289,"column":56,"offset":10632},"end":{"line":289,"column":58,"offset":10634},"indent":[]}}],"position":{"start":{"line":289,"column":55,"offset":10631},"end":{"line":289,"column":108,"offset":10684},"indent":[]}}],"position":{"start":{"line":289,"column":3,"offset":10579},"end":{"line":289,"column":108,"offset":10684},"indent":[]}}],"position":{"start":{"line":289,"column":1,"offset":10577},"end":{"line":289,"column":108,"offset":10684},"indent":[]}}],"position":{"start":{"line":289,"column":1,"offset":10577},"end":{"line":289,"column":108,"offset":10684},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.3","position":{"start":{"line":291,"column":5,"offset":10690},"end":{"line":291,"column":10,"offset":10695},"indent":[]}}],"position":{"start":{"line":291,"column":1,"offset":10686},"end":{"line":291,"column":10,"offset":10695},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":293,"column":6,"offset":10702},"end":{"line":293,"column":9,"offset":10705},"indent":[]}}],"position":{"start":{"line":293,"column":1,"offset":10697},"end":{"line":293,"column":9,"offset":10705},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Optimize performance, new datastructure has been implemented.","position":{"start":{"line":295,"column":3,"offset":10709},"end":{"line":295,"column":64,"offset":10770},"indent":[]}}],"position":{"start":{"line":295,"column":3,"offset":10709},"end":{"line":295,"column":64,"offset":10770},"indent":[]}}],"position":{"start":{"line":295,"column":1,"offset":10707},"end":{"line":295,"column":64,"offset":10770},"indent":[]}}],"position":{"start":{"line":295,"column":1,"offset":10707},"end":{"line":295,"column":64,"offset":10770},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":297,"column":6,"offset":10777},"end":{"line":297,"column":15,"offset":10786},"indent":[]}}],"position":{"start":{"line":297,"column":1,"offset":10772},"end":{"line":297,"column":15,"offset":10786},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Memory optimization.","position":{"start":{"line":299,"column":3,"offset":10790},"end":{"line":299,"column":23,"offset":10810},"indent":[]}}],"position":{"start":{"line":299,"column":3,"offset":10790},"end":{"line":299,"column":23,"offset":10810},"indent":[]}}],"position":{"start":{"line":299,"column":1,"offset":10788},"end":{"line":299,"column":23,"offset":10810},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Removal of images older than 3 days have been removed.","position":{"start":{"line":300,"column":3,"offset":10813},"end":{"line":300,"column":57,"offset":10867},"indent":[]}}],"position":{"start":{"line":300,"column":3,"offset":10813},"end":{"line":300,"column":57,"offset":10867},"indent":[]}}],"position":{"start":{"line":300,"column":1,"offset":10811},"end":{"line":300,"column":57,"offset":10867},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Start machinery automatically (delay has been removed).","position":{"start":{"line":301,"column":3,"offset":10870},"end":{"line":301,"column":58,"offset":10925},"indent":[]}}],"position":{"start":{"line":301,"column":3,"offset":10870},"end":{"line":301,"column":58,"offset":10925},"indent":[]}}],"position":{"start":{"line":301,"column":1,"offset":10868},"end":{"line":301,"column":58,"offset":10925},"indent":[]}}],"position":{"start":{"line":299,"column":1,"offset":10788},"end":{"line":301,"column":58,"offset":10925},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Cloud","position":{"start":{"line":303,"column":6,"offset":10932},"end":{"line":303,"column":11,"offset":10937},"indent":[]}}],"position":{"start":{"line":303,"column":1,"offset":10927},"end":{"line":303,"column":11,"offset":10937},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Resolved file exist problem.","position":{"start":{"line":305,"column":3,"offset":10941},"end":{"line":305,"column":31,"offset":10969},"indent":[]}}],"position":{"start":{"line":305,"column":3,"offset":10941},"end":{"line":305,"column":31,"offset":10969},"indent":[]}}],"position":{"start":{"line":305,"column":1,"offset":10939},"end":{"line":305,"column":31,"offset":10969},"indent":[]}}],"position":{"start":{"line":305,"column":1,"offset":10939},"end":{"line":305,"column":31,"offset":10969},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.2","position":{"start":{"line":307,"column":5,"offset":10975},"end":{"line":307,"column":10,"offset":10980},"indent":[]}}],"position":{"start":{"line":307,"column":1,"offset":10971},"end":{"line":307,"column":10,"offset":10980},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":309,"column":6,"offset":10987},"end":{"line":309,"column":9,"offset":10990},"indent":[]}}],"position":{"start":{"line":309,"column":1,"offset":10982},"end":{"line":309,"column":9,"offset":10990},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Timezone on settings page is also used for the webinterface.","position":{"start":{"line":311,"column":3,"offset":10994},"end":{"line":311,"column":63,"offset":11054},"indent":[]}}],"position":{"start":{"line":311,"column":3,"offset":10994},"end":{"line":311,"column":63,"offset":11054},"indent":[]}}],"position":{"start":{"line":311,"column":1,"offset":10992},"end":{"line":311,"column":63,"offset":11054},"indent":[]}}],"position":{"start":{"line":311,"column":1,"offset":10992},"end":{"line":311,"column":63,"offset":11054},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":313,"column":6,"offset":11061},"end":{"line":313,"column":15,"offset":11070},"indent":[]}}],"position":{"start":{"line":313,"column":1,"offset":11056},"end":{"line":313,"column":15,"offset":11070},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Added extra timezones to timezone.xml.","position":{"start":{"line":315,"column":3,"offset":11074},"end":{"line":315,"column":41,"offset":11112},"indent":[]}}],"position":{"start":{"line":315,"column":3,"offset":11074},"end":{"line":315,"column":41,"offset":11112},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":11072},"end":{"line":315,"column":41,"offset":11112},"indent":[]}}],"position":{"start":{"line":315,"column":1,"offset":11072},"end":{"line":315,"column":41,"offset":11112},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.1","position":{"start":{"line":317,"column":5,"offset":11118},"end":{"line":317,"column":10,"offset":11123},"indent":[]}}],"position":{"start":{"line":317,"column":1,"offset":11114},"end":{"line":317,"column":10,"offset":11123},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Web","position":{"start":{"line":319,"column":6,"offset":11130},"end":{"line":319,"column":9,"offset":11133},"indent":[]}}],"position":{"start":{"line":319,"column":1,"offset":11125},"end":{"line":319,"column":9,"offset":11133},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Improved error handling (date search).","position":{"start":{"line":321,"column":3,"offset":11137},"end":{"line":321,"column":41,"offset":11175},"indent":[]}}],"position":{"start":{"line":321,"column":3,"offset":11137},"end":{"line":321,"column":41,"offset":11175},"indent":[]}}],"position":{"start":{"line":321,"column":1,"offset":11135},"end":{"line":321,"column":41,"offset":11175},"indent":[]}}],"position":{"start":{"line":321,"column":1,"offset":11135},"end":{"line":321,"column":41,"offset":11175},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":323,"column":6,"offset":11182},"end":{"line":323,"column":15,"offset":11191},"indent":[]}}],"position":{"start":{"line":323,"column":1,"offset":11177},"end":{"line":323,"column":15,"offset":11191},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Improved memory cleanup.","position":{"start":{"line":325,"column":3,"offset":11195},"end":{"line":325,"column":27,"offset":11219},"indent":[]}}],"position":{"start":{"line":325,"column":3,"offset":11195},"end":{"line":325,"column":27,"offset":11219},"indent":[]}}],"position":{"start":{"line":325,"column":1,"offset":11193},"end":{"line":325,"column":27,"offset":11219},"indent":[]}}],"position":{"start":{"line":325,"column":1,"offset":11193},"end":{"line":325,"column":27,"offset":11219},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"1.0.0","position":{"start":{"line":327,"column":5,"offset":11225},"end":{"line":327,"column":10,"offset":11230},"indent":[]}}],"position":{"start":{"line":327,"column":1,"offset":11221},"end":{"line":327,"column":10,"offset":11230},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"First commit of Kerberos.io","position":{"start":{"line":329,"column":6,"offset":11237},"end":{"line":329,"column":33,"offset":11264},"indent":[]}}],"position":{"start":{"line":329,"column":1,"offset":11232},"end":{"line":329,"column":33,"offset":11264},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Camera support: ","position":{"start":{"line":331,"column":3,"offset":11268},"end":{"line":331,"column":19,"offset":11284},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"USBCamera","position":{"start":{"line":331,"column":21,"offset":11286},"end":{"line":331,"column":30,"offset":11295},"indent":[]}}],"position":{"start":{"line":331,"column":19,"offset":11284},"end":{"line":331,"column":32,"offset":11297},"indent":[]}},{"type":"text","value":" (V4L), ","position":{"start":{"line":331,"column":32,"offset":11297},"end":{"line":331,"column":40,"offset":11305},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Raspberry Pi camera module","position":{"start":{"line":331,"column":42,"offset":11307},"end":{"line":331,"column":68,"offset":11333},"indent":[]}}],"position":{"start":{"line":331,"column":40,"offset":11305},"end":{"line":331,"column":70,"offset":11335},"indent":[]}},{"type":"text","value":" (MMAL).","position":{"start":{"line":331,"column":70,"offset":11335},"end":{"line":331,"column":78,"offset":11343},"indent":[]}}],"position":{"start":{"line":331,"column":3,"offset":11268},"end":{"line":331,"column":78,"offset":11343},"indent":[]}}],"position":{"start":{"line":331,"column":1,"offset":11266},"end":{"line":331,"column":78,"offset":11343},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Conditions: ","position":{"start":{"line":332,"column":3,"offset":11346},"end":{"line":332,"column":15,"offset":11358},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Enabled","position":{"start":{"line":332,"column":17,"offset":11360},"end":{"line":332,"column":24,"offset":11367},"indent":[]}}],"position":{"start":{"line":332,"column":15,"offset":11358},"end":{"line":332,"column":26,"offset":11369},"indent":[]}},{"type":"text","value":" (turn on/off Kerberos) and active ","position":{"start":{"line":332,"column":26,"offset":11369},"end":{"line":332,"column":61,"offset":11404},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Time","position":{"start":{"line":332,"column":63,"offset":11406},"end":{"line":332,"column":67,"offset":11410},"indent":[]}}],"position":{"start":{"line":332,"column":61,"offset":11404},"end":{"line":332,"column":69,"offset":11412},"indent":[]}},{"type":"text","value":" per day.","position":{"start":{"line":332,"column":69,"offset":11412},"end":{"line":332,"column":78,"offset":11421},"indent":[]}}],"position":{"start":{"line":332,"column":3,"offset":11346},"end":{"line":332,"column":78,"offset":11421},"indent":[]}}],"position":{"start":{"line":332,"column":1,"offset":11344},"end":{"line":332,"column":78,"offset":11421},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Algorithms: ","position":{"start":{"line":333,"column":3,"offset":11424},"end":{"line":333,"column":15,"offset":11436},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Differential Images","position":{"start":{"line":333,"column":17,"offset":11438},"end":{"line":333,"column":36,"offset":11457},"indent":[]}}],"position":{"start":{"line":333,"column":15,"offset":11436},"end":{"line":333,"column":38,"offset":11459},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":333,"column":38,"offset":11459},"end":{"line":333,"column":39,"offset":11460},"indent":[]}}],"position":{"start":{"line":333,"column":3,"offset":11424},"end":{"line":333,"column":39,"offset":11460},"indent":[]}}],"position":{"start":{"line":333,"column":1,"offset":11422},"end":{"line":333,"column":39,"offset":11460},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Heuristics: ","position":{"start":{"line":334,"column":3,"offset":11463},"end":{"line":334,"column":15,"offset":11475},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Sequence","position":{"start":{"line":334,"column":17,"offset":11477},"end":{"line":334,"column":25,"offset":11485},"indent":[]}}],"position":{"start":{"line":334,"column":15,"offset":11475},"end":{"line":334,"column":27,"offset":11487},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":334,"column":27,"offset":11487},"end":{"line":334,"column":28,"offset":11488},"indent":[]}}],"position":{"start":{"line":334,"column":3,"offset":11463},"end":{"line":334,"column":28,"offset":11488},"indent":[]}}],"position":{"start":{"line":334,"column":1,"offset":11461},"end":{"line":334,"column":28,"offset":11488},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Expositors: Select a ","position":{"start":{"line":335,"column":3,"offset":11491},"end":{"line":335,"column":24,"offset":11512},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Hull","position":{"start":{"line":335,"column":26,"offset":11514},"end":{"line":335,"column":30,"offset":11518},"indent":[]}}],"position":{"start":{"line":335,"column":24,"offset":11512},"end":{"line":335,"column":32,"offset":11520},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":335,"column":32,"offset":11520},"end":{"line":335,"column":36,"offset":11524},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Rectangle","position":{"start":{"line":335,"column":38,"offset":11526},"end":{"line":335,"column":47,"offset":11535},"indent":[]}}],"position":{"start":{"line":335,"column":36,"offset":11524},"end":{"line":335,"column":49,"offset":11537},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":335,"column":49,"offset":11537},"end":{"line":335,"column":50,"offset":11538},"indent":[]}}],"position":{"start":{"line":335,"column":3,"offset":11491},"end":{"line":335,"column":50,"offset":11538},"indent":[]}}],"position":{"start":{"line":335,"column":1,"offset":11489},"end":{"line":335,"column":50,"offset":11538},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Outputs: Write image to ","position":{"start":{"line":336,"column":3,"offset":11541},"end":{"line":336,"column":27,"offset":11565},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Disk","position":{"start":{"line":336,"column":29,"offset":11567},"end":{"line":336,"column":33,"offset":11571},"indent":[]}}],"position":{"start":{"line":336,"column":27,"offset":11565},"end":{"line":336,"column":35,"offset":11573},"indent":[]}},{"type":"text","value":", trigger an ","position":{"start":{"line":336,"column":35,"offset":11573},"end":{"line":336,"column":48,"offset":11586},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GPIO","position":{"start":{"line":336,"column":50,"offset":11588},"end":{"line":336,"column":54,"offset":11592},"indent":[]}}],"position":{"start":{"line":336,"column":48,"offset":11586},"end":{"line":336,"column":56,"offset":11594},"indent":[]}},{"type":"text","value":" output pin and send a ","position":{"start":{"line":336,"column":56,"offset":11594},"end":{"line":336,"column":79,"offset":11617},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"TCP/IP packet","position":{"start":{"line":336,"column":81,"offset":11619},"end":{"line":336,"column":94,"offset":11632},"indent":[]}}],"position":{"start":{"line":336,"column":79,"offset":11617},"end":{"line":336,"column":96,"offset":11634},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":336,"column":96,"offset":11634},"end":{"line":336,"column":97,"offset":11635},"indent":[]}}],"position":{"start":{"line":336,"column":3,"offset":11541},"end":{"line":336,"column":97,"offset":11635},"indent":[]}}],"position":{"start":{"line":336,"column":1,"offset":11539},"end":{"line":336,"column":97,"offset":11635},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Cloud: send your images to the ","position":{"start":{"line":337,"column":3,"offset":11638},"end":{"line":337,"column":34,"offset":11669},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Kerberos.io cloud aplication","position":{"start":{"line":337,"column":36,"offset":11671},"end":{"line":337,"column":64,"offset":11699},"indent":[]}}],"position":{"start":{"line":337,"column":34,"offset":11669},"end":{"line":337,"column":66,"offset":11701},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":337,"column":66,"offset":11701},"end":{"line":337,"column":67,"offset":11702},"indent":[]}}],"position":{"start":{"line":337,"column":3,"offset":11638},"end":{"line":337,"column":67,"offset":11702},"indent":[]}}],"position":{"start":{"line":337,"column":1,"offset":11636},"end":{"line":337,"column":67,"offset":11702},"indent":[]}}],"position":{"start":{"line":331,"column":1,"offset":11266},"end":{"line":337,"column":67,"offset":11702},"indent":[1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":340,"column":1,"offset":11705},"end":{"line":340,"column":31,"offset":11735},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":340,"column":31,"offset":11735}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Release notes`}

\n

{`2.8.0`}

\n

{`Aligned machinery, web and KiOS versions. Too many people were confused by the versioning.`}

\n

{`Web`}

\n
    \n
  • {`Videos displayed on canvas were blocked in latest browsers.`}
  • \n
  • {`Disabled reboot and shutdown.`}
  • \n
  • {`Disabled upgrade process, use fwupdate shell command instead.`}
  • \n
\n

{`KiOS`}

\n
    \n
  • {`Major upgrade, solved many different problems (list to long); not possible to upgrade from 2.7.0 to 2.8.0.`}
  • \n
  • {`Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).`}
  • \n
  • {`Support for the Raspberry Pi 4.`}
  • \n
\n

{`2.7.2`}

\n

{`Machinery`}

\n
    \n
  • {`To optimise the cloud experience we've added a proxy.kerberos.io machine in between.`}
  • \n
  • {`We've changed the S3 storage scheme (class:ONEZONE_IA).`}
  • \n
\n

{`2.7.1`}

\n

{`Machinery`}

\n
    \n
  • {`Resolved deadlock with livestreaming while restarting machinery.`}
  • \n
  • {`Revert logging library; enabled log rotating.`}
  • \n
\n

{`KiOS`}

\n
    \n
  • {`Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1).`}
  • \n
  • {`Resolved issue with WIFI on Raspberry Pi 3B+`}
  • \n
\n

{`2.7.0`}

\n

{`Web`}

\n
    \n
  • {`Unique session cookie, which allows to open multiple web interfaces (e.g. when using docker).`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added live streaming feature for app.kerberos.io`}
  • \n
  • {`Upgraded logging library: log file can be max 5MB, and will rotate.`}
  • \n
  • {`Better logging for cloud uploads (failed information).`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`No longer need docker-compose, we merged the web and machinery containers to `}{`a single container`}{`.`}
  • \n
\n

{`KiOS`}

\n
    \n
  • {`Updated firmware to latest Raspbian.`}
  • \n
  • {`Support for the Raspberry Pi 3B+.`}
  • \n
\n

{`2.6.1`}

\n

{`Web`}

\n
    \n
  • {`Solved issue with persisting login configuration. `}{`#111`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added Pushbullet. `}{`#139`}
  • \n
  • {`Cloud upload was not longer working (hotfix also in 2.6.0).`}
  • \n
\n

{`2.6.0`}

\n

{`Web`}

\n
    \n
  • {`Add a cloud connection verification method. `}{`#112`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Add background color timestamp. `}{`#128`}
  • \n
  • {`Send instanceId in AWS header when uploading to cloud (necessary for new cloud app).`}
  • \n
  • {`Better support for Chinese IP cameras.`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`Bug: Autoremove old images/video within Docker Containers. `}{`#104`}
  • \n
\n

{`2.5.0`}

\n

{`Web`}

\n
    \n
  • {`Added Chinese and Italian language.`}
  • \n
  • {`Resolved issue with INSTALLED=true.`}
  • \n
  • {`Make latest_sequence available with basic auth. `}{`#99`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Provide an IO service for publishing events to MQTT. `}{`#89`}
  • \n
  • {`Optimize recording with H264_OMX. `}{`#83`}
  • \n
  • {`Implement throttler for Io detections. `}{`#96`}
  • \n
  • {`SSL version 1.0.0 is no longer accessible in Raspbian. `}{`#109`}
  • \n
\n

{`2.4.2`}

\n

{`Web`}

\n
    \n
  • {`Typo in french translation, causes the web interface crash.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Resolved major bug in livestream: memory leak in stream class. `}{`#94`}
  • \n
  • {`Capture health verification: check if the chosen capture device is still grabbing (and didn't stalled).`}
  • \n
  • {`Extra logging when recording with raspberry pi camera.`}
  • \n
  • {`Make sure the cloud upload is functioning properly, after an upload it's verified if the files really exist in the cloud.`}
  • \n
\n

{`2.4.1`}

\n

{`Web`}

\n
    \n
  • {`Show warning when system is disabled. `}{`#88`}{`.`}
  • \n
  • {`Hull selector in basic view not always working.`}
  • \n
\n

{`2.4.0`}

\n

{`Ecosystem`}

\n
    \n
  • {`Enable/Disable force network mode.`}
  • \n
  • {`Enable/Disable auto removal media.`}
  • \n
\n

{`Web`}

\n
    \n
  • {`Upgrade from Laravel 4.2 to Laravel 5.4 `}{`#70`}{`.`}
  • \n
  • {`Fix bug with heatmap radius slider `}{`#84`}{`.`}
  • \n
  • {`Design tweaks toggle button (remove outline).`}
  • \n
  • {`Disabled possibility to timestamp video when using hardware acceleration.`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`Fix SSL support `}{`#4`}{`.`}
  • \n
  • {`Auto removal if disk is full.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`OpenMAX IL hardware encoding for Raspberry Pi camera. `}{`#83`}
      \n
    • {`Optimized live streaming.`}
    • \n
    • {`Optimized h264 recording.`}
    • \n
  • \n
  • {`Basic authentication for live streaming (username and password). `}{`#80`}
  • \n
\n

{`2.3.1`}

\n

{`Machinery`}

\n
    \n
  • {`Update for kerberos.cloud: pushing content-type.`}
  • \n
  • {`Change default configurations.`}
  • \n
\n

{`2.3.0`}

\n

{`Ecosystem`}

\n
    \n
  • {`Support for Raspberry Pi Zero W. `}{`#8`}
  • \n
\n

{`2.2.1`}

\n

{`Ecosystem`}

\n
    \n
  • {`Upgraded FFmpeg and libx264 on KiOS.`}
  • \n
\n

{`Web`}

\n
    \n
  • {`Add Bulgarian translation. `}{`#81`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Bug: IoVideo crashes due to a memory leak. `}{`#70`}
  • \n
\n

{`2.2.0`}

\n

{`Ecosystem`}

\n
    \n
  • {`Added support for Armbian.`}
  • \n
  • {`Raspbian: Async requests causes session corruption. `}{`#78`}
  • \n
\n

{`Web`}

\n
    \n
  • {`Bug: Issue format instance name. `}{`#57`}
  • \n
  • {`Redesign settings page (better UX). `}{`#39`}
  • \n
  • {`Possibility to edit password through web interface. `}{`#63`}
  • \n
  • {`Support for viewing videos.`}
  • \n
  • {`Update radius of heatmap.`}
  • \n
  • {`PHP7 support. `}{`#60`}
  • \n
  • {`Welcome/installation page. `}{`#60`}
  • \n
  • {`Translation updated. `}{`#74`}
  • \n
  • {`Privacy mode. `}{`#54`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Output as video file. `}{`#60`}
  • \n
  • {`Bug: System hangs when a wrong IP camera url was defined. `}{`#48`}
  • \n
  • {`Run arbitrary script/program. `}{`#31`}
  • \n
  • {`Bug: Weird colors from RPi Camera. `}{`#64`}
  • \n
  • {`Upgrade to OpenCV 3.2.0.`}
  • \n
\n

{`2.1.0`}

\n

{`Web`}

\n
    \n
  • {`Added PhotoSwipe for image overview (easier to browse through images). `}{`#45`}
  • \n
  • {`Added reboot and shutdown commands. `}{`#46`}
  • \n
  • {`Added logging view to system page. `}{`#33`}
  • \n
  • {`Added labels to check if machinery is running.`}
  • \n
  • {`Added error handling if web interface isn’t working properly.`}
  • \n
  • {`Fixed Heatmap.js fail to load by ad-blocker. `}{`#42`}
  • \n
  • {`Show additional information on the dashboard (streaming is opening or not) there is no data available.`}
  • \n
  • {`Settings page is now visible on mobile (+ changed icon).`}
  • \n
  • {`Fixed sorting of news articles.`}
  • \n
  • {`Removed links to assets in the cloud (.css files).`}
  • \n
  • {`Design: improved layout of login page, async loading of image view.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added configurable streaming port and quality. `}{`#41`}
  • \n
  • {`Added new algorithm: Background subtraction.`}
  • \n
  • {`Added new heuristic: Counter (for object/people counting). `}{`#42`}
  • \n
  • {`Added video capture, which can be used for debugging purposes (replay a video fragment).`}
  • \n
  • {`It’s now possible to mark the images with a timestamp. `}{`#36`}
  • \n
  • {`Fixed blocking streaming socket. `}{`#39`}
  • \n
\n

{`Ecosystem`}

\n
    \n
  • {`Fix removal images if disk is almost full (wrong path was defined).`}
  • \n
  • {`Support for the Raspberry Pi Camera module v2.1. `}{`#3`}
  • \n
  • {`Support for the Raspberry Pi Zero; updated kernel to latest Raspbian. `}{`#3`}
  • \n
  • {`KiOS GUI installer.`}
  • \n
\n

{`2.0.0`}

\n

{`Web`}

\n
    \n
  • {`Add simple ON/OFF toggle. `}{`#24`}
  • \n
  • {`Added update strategy when using KiOS. `}{`#23`}
  • \n
  • {`A system page which shows system information. `}{`#20`}
  • \n
  • {`Heatmap on dashboard page `}{`#19`}
  • \n
  • {`Added live stream view on the dashboard page `}{`#2`}
  • \n
  • {`Fixed bug cloud syncing `}{`#16`}
  • \n
  • {`Fixed broken settings page when space in instane name `}{`#16`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`RTSP support for IP-camera's. `}{`#21`}
  • \n
  • {`Verbose logging. `}{`#35`}
  • \n
  • {`IO-devices are executed in a seperate thread. `}{`#28`}
  • \n
  • {`Live streaming (MJPEG). `}{`#26`}
  • \n
  • {`Execute multiple instances on a machine. `}{`#24`}
  • \n
  • {`Override config by arguments. `}{`#22`}
  • \n
  • {`Move S3 upload to machinery and remove sync-s3 repository. `}{`#16`}
  • \n
\n

{`Docker`}

\n
    \n
  • {`Added Docker image (x86_x64) to Docker Hub.`}
  • \n
\n

{`Ecosystem`}

\n
    \n
  • {`Add support for Raspberry Pi 1, 2 and 3. `}{`#1`}
  • \n
\n

{`1.1.0`}

\n

{`Web`}

\n
    \n
  • {`Support IP camera's with MJPEG stream. `}{`#3`}
  • \n
  • {`Introduce new API methods to configure the machinery, using basic auth. `}{`#4`}
  • \n
  • {`Optimization of loading image and dashboard page, completely redesigned the retrieval of images. `}{`#5`}
  • \n
  • {`Optimization of settings page. `}{`#5`}
  • \n
  • {`Timebar gradient only works in Chrome. `}{`#6`}
  • \n
  • {`Minor CSS fixes for responsive layout.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Flip/rotate option for capture devices. `}{`#5`}
  • \n
  • {`Support IP camera's with MJPEG stream. `}{`#4`}
  • \n
  • {`Introduced webhook io device. `}{`#5`}
  • \n
\n

{`Cloud`}

\n
    \n
  • {`Fixed problem when syncing a huge amount of images. `}{`#1`}
  • \n
\n

{`1.0.3`}

\n

{`Web`}

\n
    \n
  • {`Optimize performance, new datastructure has been implemented.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Memory optimization.`}
  • \n
  • {`Removal of images older than 3 days have been removed.`}
  • \n
  • {`Start machinery automatically (delay has been removed).`}
  • \n
\n

{`Cloud`}

\n
    \n
  • {`Resolved file exist problem.`}
  • \n
\n

{`1.0.2`}

\n

{`Web`}

\n
    \n
  • {`Timezone on settings page is also used for the webinterface.`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Added extra timezones to timezone.xml.`}
  • \n
\n

{`1.0.1`}

\n

{`Web`}

\n
    \n
  • {`Improved error handling (date search).`}
  • \n
\n

{`Machinery`}

\n
    \n
  • {`Improved memory cleanup.`}
  • \n
\n

{`1.0.0`}

\n

{`First commit of Kerberos.io`}

\n
    \n
  • {`Camera support: `}{`USBCamera`}{` (V4L), `}{`Raspberry Pi camera module`}{` (MMAL).`}
  • \n
  • {`Conditions: `}{`Enabled`}{` (turn on/off Kerberos) and active `}{`Time`}{` per day.`}
  • \n
  • {`Algorithms: `}{`Differential Images`}{`.`}
  • \n
  • {`Heuristics: `}{`Sequence`}{`.`}
  • \n
  • {`Expositors: Select a `}{`Hull`}{` or `}{`Rectangle`}{`.`}
  • \n
  • {`Outputs: Write image to `}{`Disk`}{`, trigger an `}{`GPIO`}{` output pin and send a `}{`TCP/IP packet`}{`.`}
  • \n
  • {`Cloud: send your images to the `}{`Kerberos.io cloud aplication`}{`.`}
  • \n
\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a7892904997d5282b5770a03b5c5edbf.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a7892904997d5282b5770a03b5c5edbf.json deleted file mode 100644 index 61bc30e..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a7892904997d5282b5770a03b5c5edbf.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838681910000,"key":"gatsby-plugin-mdx-entire-payload-bc85a1a2cef373563efa2ca02f152db6-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":839},"end":{"line":16,"column":186,"offset":1024},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1029},"end":{"line":18,"column":14,"offset":1039},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1026},"end":{"line":18,"column":14,"offset":1039},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":21,"column":1,"offset":1042},"end":{"line":21,"column":31,"offset":1072},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":21,"column":31,"offset":1072}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.`}

\n
\n

{`Kubernetes`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a84526a2aa900d12ee78c35bf0ba75c7.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a84526a2aa900d12ee78c35bf0ba75c7.json index 4957fe6..0388e52 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a84526a2aa900d12ee78c35bf0ba75c7.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a84526a2aa900d12ee78c35bf0ba75c7.json @@ -1 +1 @@ -{"expireTime":9007200838510880000,"key":"gatsby-plugin-mdx-entire-payload-4b511d78389e3dfc4845d066b2b3456e-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Contribute","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"In this document we describe the different things you need to know if you would like to add a new feature to Kerberos Open Source, or change some of its behaviour for your own use case.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":10,"column":186,"offset":358},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":10,"column":186,"offset":358},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before starting, as you might have read already, you need to know that Kerberos Open Source consists of two solutions. A front-end, also called ","position":{"start":{"line":12,"column":1,"offset":360},"end":{"line":12,"column":145,"offset":504},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"web","position":{"start":{"line":12,"column":147,"offset":506},"end":{"line":12,"column":150,"offset":509},"indent":[]}}],"position":{"start":{"line":12,"column":145,"offset":504},"end":{"line":12,"column":152,"offset":511},"indent":[]}},{"type":"text","value":", which allows you to review the recordings and to configure the back-end settings. A back-end, also called ","position":{"start":{"line":12,"column":152,"offset":511},"end":{"line":12,"column":260,"offset":619},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"machinery","position":{"start":{"line":12,"column":262,"offset":621},"end":{"line":12,"column":271,"offset":630},"indent":[]}}],"position":{"start":{"line":12,"column":260,"offset":619},"end":{"line":12,"column":273,"offset":632},"indent":[]}},{"type":"text","value":", which is computer vision solution that processes the video stream of surveillance camera.","position":{"start":{"line":12,"column":273,"offset":632},"end":{"line":12,"column":364,"offset":723},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":360},"end":{"line":12,"column":364,"offset":723},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you start changing or adding features to Kerberos Open Source, there is a big chance you will need to modify the previously mentioned solutions. That's why we will discuss how you can contribute to one or both solutions.","position":{"start":{"line":14,"column":1,"offset":725},"end":{"line":14,"column":226,"offset":950},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":725},"end":{"line":14,"column":226,"offset":950},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":16,"column":4,"offset":955},"end":{"line":16,"column":13,"offset":964},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":952},"end":{"line":16,"column":13,"offset":964},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Contributing to the ","position":{"start":{"line":18,"column":1,"offset":966},"end":{"line":18,"column":21,"offset":986},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery","children":[{"type":"text","value":"machinery repository","position":{"start":{"line":18,"column":22,"offset":987},"end":{"line":18,"column":42,"offset":1007},"indent":[]}}],"position":{"start":{"line":18,"column":21,"offset":986},"end":{"line":18,"column":85,"offset":1050},"indent":[]}},{"type":"text","value":" requires C++ skills. This section describes all the technical stuff you will need to know. If you want to contribute, the first thing you will need to do is installing the source code on your working station.","position":{"start":{"line":18,"column":85,"offset":1050},"end":{"line":18,"column":294,"offset":1259},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":966},"end":{"line":18,"column":294,"offset":1259},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Prerequisites","position":{"start":{"line":20,"column":5,"offset":1265},"end":{"line":20,"column":18,"offset":1278},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1261},"end":{"line":20,"column":18,"offset":1278},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"A Linux OS, or Mac OSX (Window is not supported).","position":{"start":{"line":22,"column":3,"offset":1282},"end":{"line":22,"column":52,"offset":1331},"indent":[]}}],"position":{"start":{"line":22,"column":3,"offset":1282},"end":{"line":22,"column":52,"offset":1331},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1280},"end":{"line":22,"column":52,"offset":1331},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Installation","position":{"start":{"line":24,"column":5,"offset":1337},"end":{"line":24,"column":17,"offset":1349},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1333},"end":{"line":24,"column":17,"offset":1349},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The complete installation can be found on the advanced installation page, describing the complete set of instructions. However for simplicity we will give a summarized version, as probably you will already have a development environment set up.","position":{"start":{"line":26,"column":1,"offset":1351},"end":{"line":26,"column":245,"offset":1595},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1351},"end":{"line":26,"column":245,"offset":1595},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Install development tools (C++, CMake) and V4L utils, and clone the repository. Compile the project using cmake and make.","position":{"start":{"line":28,"column":1,"offset":1597},"end":{"line":28,"column":122,"offset":1718},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":1597},"end":{"line":28,"column":122,"offset":1718},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo apt-get -y update\nsudo apt-get install -y git cmake subversion dh-autoreconf libcurl4-openssl-dev yasm libx264-dev pkg-config libssl-dev\ncd && sudo git clone https://github.com/kerberos-io/machinery\ncd machinery && mkdir build && cd build\ncmake .. && make -j8 && make check && sudo make install","position":{"start":{"line":30,"column":1,"offset":1720},"end":{"line":36,"column":4,"offset":2029},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Testing","position":{"start":{"line":38,"column":5,"offset":2035},"end":{"line":38,"column":12,"offset":2042},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":2031},"end":{"line":38,"column":12,"offset":2042},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"We strongly recommend testing as a best practice in complex projects. Therefore the machinery uses the popular C++ test library: Google Test and Google Mock. The tests can be found in the test directory. You can run the test by executing following command:","position":{"start":{"line":40,"column":1,"offset":2044},"end":{"line":40,"column":257,"offset":2300},"indent":[]}}],"position":{"start":{"line":40,"column":1,"offset":2044},"end":{"line":40,"column":257,"offset":2300},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"make check","position":{"start":{"line":42,"column":1,"offset":2302},"end":{"line":44,"column":4,"offset":2322},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Adding a new class","position":{"start":{"line":46,"column":5,"offset":2328},"end":{"line":46,"column":23,"offset":2346},"indent":[]}}],"position":{"start":{"line":46,"column":1,"offset":2324},"end":{"line":46,"column":23,"offset":2346},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This paragraph will tell you how to create a new condition, algorithm, expositor, io or capture device. For simplicity we will show how to create a new algorithm; the steps are identical if you want to create for example a new capture device; only the directory will differ.","position":{"start":{"line":48,"column":1,"offset":2348},"end":{"line":48,"column":275,"offset":2622},"indent":[]}}],"position":{"start":{"line":48,"column":1,"offset":2348},"end":{"line":48,"column":275,"offset":2622},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Create the header file","position":{"start":{"line":50,"column":6,"offset":2629},"end":{"line":50,"column":28,"offset":2651},"indent":[]}}],"position":{"start":{"line":50,"column":1,"offset":2624},"end":{"line":50,"column":28,"offset":2651},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"First we will need to create a new header file in the include/kerberos/machinery/algorithm directory. You can copy an existing algorithm header file, and start from there. You will end up with the following header file:","position":{"start":{"line":52,"column":1,"offset":2653},"end":{"line":52,"column":220,"offset":2872},"indent":[]}}],"position":{"start":{"line":52,"column":1,"offset":2653},"end":{"line":52,"column":220,"offset":2872},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"//\n// Class: AnotherAlgorithm\n// Description: Another algorithm\n// Created: ...\n// Author: ...\n// Mail: ...\n// Website: ...\n//\n// The copyright to the computer program(s) herein\n// is the property of kerberos.io, Belgium.\n// The program(s) may be used and/or copied .\n//\n/////////////////////////////////////////////////////\n#ifndef __AnotherAlgorithm_H_INCLUDED__ // if AnotherAlgorithm.h hasn't been included yet...\n#define __AnotherAlgorithm_H_INCLUDED__ // #define this so the compiler knows it has been included\n#include \"machinery/algorithm/Algorithm.h\"\nnamespace kerberos\n{\n\tchar AnotherAlgorithmName[] = \"AnotherAlgorithm\";\n\tclass AnotherAlgorithm : public AlgorithmCreator\n\t{\n \tprivate:\n \t\tImage m_result;\n \tint m_parameter;\n \tpublic:\n \tAnotherAlgorithm(){}\n \tvoid setup(const StringMap & settings);\n \tvoid initialize(ImageVector & images);\n \tImage evaluate(ImageVector & images, JSON & data);\n \tvoid setParameter(int parameter);\n\t};\n}\n#endif","position":{"start":{"line":54,"column":1,"offset":2874},"end":{"line":88,"column":4,"offset":3959},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"When creating a new class you will need to inherit from it corresponding creator, for the algorithm example: AlgorithmCreator. The creator class requires two template parameters. The first one is a unique name for the class, this name will be used to make some kind of dependency injection possible; and is used in the configurations files. The second parameter is the class itself.","position":{"start":{"line":90,"column":1,"offset":3961},"end":{"line":90,"column":383,"offset":4343},"indent":[]}}],"position":{"start":{"line":90,"column":1,"offset":3961},"end":{"line":90,"column":383,"offset":4343},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The inheritance of the creator class can be a little bit strange, but it is required and needed to register the class automatically with the factory. When the code gets compiled, the classes will be automatically registered with the factory, and you can create instances of those classes by using the name we've defined in the first template parameter. For example we could create a new instance of our previously created class with the following command.","position":{"start":{"line":92,"column":1,"offset":4345},"end":{"line":92,"column":456,"offset":4800},"indent":[]}}],"position":{"start":{"line":92,"column":1,"offset":4345},"end":{"line":92,"column":456,"offset":4800},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"Algorithm * anotherAlgorithm = Factory::getInstance()->create(\"AnotherAlgorithm\");","position":{"start":{"line":94,"column":1,"offset":4802},"end":{"line":96,"column":4,"offset":4905},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Create the source file","position":{"start":{"line":98,"column":6,"offset":4912},"end":{"line":98,"column":28,"offset":4934},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":4907},"end":{"line":98,"column":28,"offset":4934},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Ofcourse we also need to have an implementation file, therefore we need to create a new source file in the src/kerberos/machinery/algorithm directory. Just like the previous example, you can copy an existing class and implement the member functions you've declared in the header file. An example would be:","position":{"start":{"line":100,"column":1,"offset":4936},"end":{"line":100,"column":306,"offset":5241},"indent":[]}}],"position":{"start":{"line":100,"column":1,"offset":4936},"end":{"line":100,"column":306,"offset":5241},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"#include \"machinery/algorithm/AnotherAlgorithm.h\"\nnamespace kerberos\n{\n void AnotherAlgorithm::setup(const StringMap & settings)\n {\n Algorithm::setup(settings);\n int parameter = std::atoi(settings.at(\"algorithms.AnotherAlgorithm.parameter\").c_str());\n setParameter(parameter);\n }\n void AnotherAlgorithm::initialize(ImageVector & images)\n {\n ....\n }\n Image AnotherAlgorithm::evaluate(ImageVector & images, JSON & data)\n {\n Image evaluation;\n ... do something ..\n return evaluation;\n }\n void AnotherAlgorithm::setParameter(int parameter)\n {\n m_parameter = parameter;\n }\n}","position":{"start":{"line":102,"column":1,"offset":5243},"end":{"line":127,"column":4,"offset":5914},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Modify the CMakeLists.txt file","position":{"start":{"line":129,"column":6,"offset":5921},"end":{"line":129,"column":36,"offset":5951},"indent":[]}}],"position":{"start":{"line":129,"column":1,"offset":5916},"end":{"line":129,"column":36,"offset":5951},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Open the CMakeLists.txt in the src/kerberos directory file and append the name of the algorithm class to the KERBEROS_FACTORY_ENTITIES variable; for example machinery/algorithm/AnotherAlgorithm.cpp.","position":{"start":{"line":131,"column":1,"offset":5953},"end":{"line":131,"column":199,"offset":6151},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":5953},"end":{"line":131,"column":199,"offset":6151},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"# -------------------------------------------------------\n# Entities that have to be registered with the factory\n# - classes are registered on compile time, so they\n# don't belong to a library. New algorithms, expositors\n# or Io classes belong here.\nset(KERBEROS_FACTORY_ENTITIES\n capture/USBCamera.cpp\n machinery/condition/Time.cpp\n machinery/condition/Enabled.cpp\n machinery/algorithm/DifferentialCollins.cpp\n machinery/algorithm/DifferentialCollinsWithColor.cpp\n machinery/algorithm/AnotherAlgorithm.cpp\n machinery/expositor/RectangleExpositor.cpp\n machinery/expositor/HullExpositor.cpp\n machinery/heuristic/Sequence.cpp\n machinery/io/IoDisk.cpp\n machinery/io/IoTCP.cpp\n machinery/io/IoMongoDB.cpp\n)","position":{"start":{"line":133,"column":1,"offset":6153},"end":{"line":153,"column":4,"offset":6907},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Create a new entry in the config file","position":{"start":{"line":155,"column":6,"offset":6914},"end":{"line":155,"column":43,"offset":6951},"indent":[]}}],"position":{"start":{"line":155,"column":1,"offset":6909},"end":{"line":155,"column":43,"offset":6951},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Open the algorithm.xml file in the config directory, and add a new tag with exactly the same name you've used in the header file; so in our example \"AnotherAlgorithm\". Within the new tag we can add properties that we will be use to configure our algorithm, in our example we defined a field parameter so we can add this field in the config file.","position":{"start":{"line":157,"column":1,"offset":6953},"end":{"line":157,"column":346,"offset":7298},"indent":[]}}],"position":{"start":{"line":157,"column":1,"offset":6953},"end":{"line":157,"column":346,"offset":7298},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"One thing you will need to do is to attach a type to a property. The type will be used by the web to automatically render the properties. For simplicity we can use the type number, this will show an input box on the settings page of the web where we are able to add numbers.","position":{"start":{"line":159,"column":1,"offset":7300},"end":{"line":159,"column":275,"offset":7574},"indent":[]}}],"position":{"start":{"line":159,"column":1,"offset":7300},"end":{"line":159,"column":275,"offset":7574},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"\n\t\n\t\t5\n \n","position":{"start":{"line":161,"column":1,"offset":7576},"end":{"line":167,"column":4,"offset":7697},"indent":[1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"You can retrieve the parameter in the setup function with the settings parameter.","position":{"start":{"line":169,"column":1,"offset":7699},"end":{"line":169,"column":82,"offset":7780},"indent":[]}}],"position":{"start":{"line":169,"column":1,"offset":7699},"end":{"line":169,"column":82,"offset":7780},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"settings.at(\"algorithms.AnotherAlgorithm.parameter\")","position":{"start":{"line":171,"column":1,"offset":7782},"end":{"line":173,"column":4,"offset":7844},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Compile","position":{"start":{"line":175,"column":5,"offset":7850},"end":{"line":175,"column":12,"offset":7857},"indent":[]}}],"position":{"start":{"line":175,"column":1,"offset":7846},"end":{"line":175,"column":12,"offset":7857},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Hurray, we've made it! So now you can compile the code again, and if you're using an IDE don't forget to include the new source file! If you are compiling from the command-line you just have to go to the build folder and write make.","position":{"start":{"line":177,"column":1,"offset":7859},"end":{"line":177,"column":233,"offset":8091},"indent":[]}}],"position":{"start":{"line":177,"column":1,"offset":7859},"end":{"line":177,"column":233,"offset":8091},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Web","position":{"start":{"line":179,"column":4,"offset":8096},"end":{"line":179,"column":7,"offset":8099},"indent":[]}}],"position":{"start":{"line":179,"column":1,"offset":8093},"end":{"line":179,"column":7,"offset":8099},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Contributing to ","position":{"start":{"line":181,"column":1,"offset":8101},"end":{"line":181,"column":17,"offset":8117},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web","children":[{"type":"text","value":"the web repository","position":{"start":{"line":181,"column":18,"offset":8118},"end":{"line":181,"column":36,"offset":8136},"indent":[]}}],"position":{"start":{"line":181,"column":17,"offset":8117},"end":{"line":181,"column":73,"offset":8173},"indent":[]}},{"type":"text","value":" requires both front- and back-end skillls, more precisely BackboneJS (JavaScript) and Laravel 5.4 (PHP).","position":{"start":{"line":181,"column":73,"offset":8173},"end":{"line":181,"column":178,"offset":8278},"indent":[]}}],"position":{"start":{"line":181,"column":1,"offset":8101},"end":{"line":181,"column":178,"offset":8278},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Prerequisites","position":{"start":{"line":183,"column":5,"offset":8284},"end":{"line":183,"column":18,"offset":8297},"indent":[]}}],"position":{"start":{"line":183,"column":1,"offset":8280},"end":{"line":183,"column":18,"offset":8297},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Make sure you have following services installed on your working station.","position":{"start":{"line":185,"column":1,"offset":8299},"end":{"line":185,"column":73,"offset":8371},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":8299},"end":{"line":185,"column":73,"offset":8371},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":">","position":{"start":{"line":187,"column":2,"offset":8374},"end":{"line":187,"column":4,"offset":8376},"indent":[]}},{"type":"text","value":"= PHP 7.1.0, NodeJS and NPM and Nginx or Apache","position":{"start":{"line":187,"column":4,"offset":8376},"end":{"line":187,"column":51,"offset":8423},"indent":[]}}],"position":{"start":{"line":187,"column":2,"offset":8374},"end":{"line":187,"column":51,"offset":8423},"indent":[]}}],"position":{"start":{"line":187,"column":1,"offset":8373},"end":{"line":187,"column":51,"offset":8423},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Installation","position":{"start":{"line":189,"column":5,"offset":8429},"end":{"line":189,"column":17,"offset":8441},"indent":[]}}],"position":{"start":{"line":189,"column":1,"offset":8425},"end":{"line":189,"column":17,"offset":8441},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Clone the repository to your working station.","position":{"start":{"line":191,"column":1,"offset":8443},"end":{"line":191,"column":46,"offset":8488},"indent":[]}}],"position":{"start":{"line":191,"column":1,"offset":8443},"end":{"line":191,"column":46,"offset":8488},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"git clone https://github.com/kerberos-io/web\ncd web","position":{"start":{"line":193,"column":1,"offset":8490},"end":{"line":196,"column":4,"offset":8551},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Install the PHP libraries using the dependency mananger, ","position":{"start":{"line":198,"column":1,"offset":8553},"end":{"line":198,"column":58,"offset":8610},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Composer","position":{"start":{"line":198,"column":60,"offset":8612},"end":{"line":198,"column":68,"offset":8620},"indent":[]}}],"position":{"start":{"line":198,"column":58,"offset":8610},"end":{"line":198,"column":70,"offset":8622},"indent":[]}},{"type":"text","value":". If you haven't installed composer execute following commands.","position":{"start":{"line":198,"column":70,"offset":8622},"end":{"line":198,"column":133,"offset":8685},"indent":[]}}],"position":{"start":{"line":198,"column":1,"offset":8553},"end":{"line":198,"column":133,"offset":8685},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"php -r \"readfile('https://getcomposer.org/installer');\" > composer-setup.php\nphp -r \"if (hash('SHA384', file_get_contents('composer-setup.php')) === '41e71d86b40f28e771d4bb662b997f79625196afcca95a5abf44391188c695c6c1456e16154c75a211d238cc3bc5cb47') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;\"\nphp composer-setup.php\nphp -r \"unlink('composer-setup.php');\"","position":{"start":{"line":200,"column":1,"offset":8687},"end":{"line":205,"column":4,"offset":9118},"indent":[1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"After a succesful installation, you can run composer install or composer update from the root of the project. All dependencies will be installed or updated if a newer version is detected.","position":{"start":{"line":207,"column":1,"offset":9120},"end":{"line":207,"column":188,"offset":9307},"indent":[]}}],"position":{"start":{"line":207,"column":1,"offset":9120},"end":{"line":207,"column":188,"offset":9307},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"composer update","position":{"start":{"line":209,"column":1,"offset":9309},"end":{"line":211,"column":4,"offset":9334},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Besides PHP, the project also relies on BackboneJS (Javascript) for the front-end. Therefore a couple JavaScript dependencies should be installed.","position":{"start":{"line":213,"column":1,"offset":9336},"end":{"line":213,"column":147,"offset":9482},"indent":[]}}],"position":{"start":{"line":213,"column":1,"offset":9336},"end":{"line":213,"column":147,"offset":9482},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"npm -g install bower\ncd public\nbower update","position":{"start":{"line":215,"column":1,"offset":9484},"end":{"line":219,"column":4,"offset":9537},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"When everything is installed properly, you need too link the web project with your applicationn server. Read more on the ","position":{"start":{"line":221,"column":1,"offset":9539},"end":{"line":221,"column":122,"offset":9660},"indent":[]}},{"type":"link","title":null,"url":"https://laravel.com/docs/5.8/deployment","children":[{"type":"text","value":"Laravel documentation website","position":{"start":{"line":221,"column":123,"offset":9661},"end":{"line":221,"column":152,"offset":9690},"indent":[]}}],"position":{"start":{"line":221,"column":122,"offset":9660},"end":{"line":221,"column":194,"offset":9732},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":221,"column":194,"offset":9732},"end":{"line":221,"column":195,"offset":9733},"indent":[]}}],"position":{"start":{"line":221,"column":1,"offset":9539},"end":{"line":221,"column":195,"offset":9733},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":224,"column":1,"offset":9736},"end":{"line":224,"column":31,"offset":9766},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":224,"column":31,"offset":9766}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Contribute`}

\n

{`In this document we describe the different things you need to know if you would like to add a new feature to Kerberos Open Source, or change some of its behaviour for your own use case.`}

\n

{`Before starting, as you might have read already, you need to know that Kerberos Open Source consists of two solutions. A front-end, also called `}{`web`}{`, which allows you to review the recordings and to configure the back-end settings. A back-end, also called `}{`machinery`}{`, which is computer vision solution that processes the video stream of surveillance camera.`}

\n

{`Once you start changing or adding features to Kerberos Open Source, there is a big chance you will need to modify the previously mentioned solutions. That's why we will discuss how you can contribute to one or both solutions.`}

\n

{`Machinery`}

\n

{`Contributing to the `}{`machinery repository`}{` requires C++ skills. This section describes all the technical stuff you will need to know. If you want to contribute, the first thing you will need to do is installing the source code on your working station.`}

\n

{`Prerequisites`}

\n
\n

{`A Linux OS, or Mac OSX (Window is not supported).`}

\n
\n

{`Installation`}

\n

{`The complete installation can be found on the advanced installation page, describing the complete set of instructions. However for simplicity we will give a summarized version, as probably you will already have a development environment set up.`}

\n

{`Install development tools (C++, CMake) and V4L utils, and clone the repository. Compile the project using cmake and make.`}

\n
{`sudo`}{` `}{`apt`}{`-`}{`get`}{` -`}{`y`}{` `}{`update`}{`\n`}{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`install`}{` -`}{`y`}{` `}{`git`}{` `}{`cmake`}{` `}{`subversion`}{` `}{`dh`}{`-`}{`autoreconf`}{` `}{`libcurl4`}{`-`}{`openssl`}{`-`}{`dev`}{` `}{`yasm`}{` `}{`libx264`}{`-`}{`dev`}{` `}{`pkg`}{`-`}{`config`}{` `}{`libssl`}{`-`}{`dev`}{`\n`}{`cd`}{` && `}{`sudo`}{` `}{`git`}{` `}{`clone`}{` https:`}{`//github.com/kerberos-io/machinery`}{`\n`}{`cd`}{` `}{`machinery`}{` && `}{`mkdir`}{` `}{`build`}{` && `}{`cd`}{` `}{`build`}{`\n`}{`cmake`}{` .. && `}{`make`}{` -`}{`j8`}{` && `}{`make`}{` `}{`check`}{` && `}{`sudo`}{` `}{`make`}{` `}{`install`}
\n

{`Testing`}

\n

{`We strongly recommend testing as a best practice in complex projects. Therefore the machinery uses the popular C++ test library: Google Test and Google Mock. The tests can be found in the test directory. You can run the test by executing following command:`}

\n
{`make`}{` `}{`check`}
\n

{`Adding a new class`}

\n

{`This paragraph will tell you how to create a new condition, algorithm, expositor, io or capture device. For simplicity we will show how to create a new algorithm; the steps are identical if you want to create for example a new capture device; only the directory will differ.`}

\n

{`Create the header file`}

\n

{`First we will need to create a new header file in the include/kerberos/machinery/algorithm directory. You can copy an existing algorithm header file, and start from there. You will end up with the following header file:`}

\n
{`//`}{`\n`}{`//  Class: AnotherAlgorithm`}{`\n`}{`//  Description: Another algorithm`}{`\n`}{`//  Created:     ...`}{`\n`}{`//  Author:      ...`}{`\n`}{`//  Mail:        ...`}{`\n`}{`//  Website:     ...`}{`\n`}{`//`}{`\n`}{`//  The copyright to the computer program(s) herein`}{`\n`}{`//  is the property of kerberos.io, Belgium.`}{`\n`}{`//  The program(s) may be used and/or copied .`}{`\n`}{`//`}{`\n`}{`/////////////////////////////////////////////////////`}{`\n`}{`#`}{`ifndef`}{` `}{`__AnotherAlgorithm_H_INCLUDED__`}{`   `}{`// if AnotherAlgorithm.h hasn't been included yet...`}{`\n`}{`#`}{`define`}{` `}{`__AnotherAlgorithm_H_INCLUDED__`}{`   `}{`// #define this so the compiler knows it has been included`}{`\n`}{`#`}{`include`}{` `}{`\"machinery/algorithm/Algorithm.h\"`}{`\n`}{`namespace`}{` `}{`kerberos`}{`\n`}{`{`}{`\n`}{`\t`}{`char`}{` `}{`AnotherAlgorithmName`}{`[] = `}{`\"AnotherAlgorithm\"`}{`;`}{`\n`}{`\t`}{`class`}{` `}{`AnotherAlgorithm`}{` : `}{`public`}{` `}{`AlgorithmCreator`}{`<`}{`AnotherAlgorithmName`}{`, `}{`AnotherAlgorithm`}{`>`}{`\n`}{`\t{`}{`\n`}{`    \t`}{`private`}{`:`}{`\n`}{`    \t\t`}{`Image`}{` `}{`m_result`}{`;`}{`\n`}{`        \t`}{`int`}{` `}{`m_parameter`}{`;`}{`\n`}{`    \t`}{`public`}{`:`}{`\n`}{`        \t`}{`AnotherAlgorithm`}{`(){}`}{`\n`}{`        \t`}{`void`}{` `}{`setup`}{`(`}{`const`}{` `}{`StringMap`}{` & `}{`settings`}{`);`}{`\n`}{`        \t`}{`void`}{` `}{`initialize`}{`(`}{`ImageVector`}{` & `}{`images`}{`);`}{`\n`}{`        \t`}{`Image`}{` `}{`evaluate`}{`(`}{`ImageVector`}{` & `}{`images`}{`, `}{`JSON`}{` & `}{`data`}{`);`}{`\n`}{`        \t`}{`void`}{` `}{`setParameter`}{`(`}{`int`}{` `}{`parameter`}{`);`}{`\n`}{`\t};`}{`\n`}{`}`}{`\n`}{`#`}{`endif`}
\n

{`When creating a new class you will need to inherit from it corresponding creator, for the algorithm example: AlgorithmCreator. The creator class requires two template parameters. The first one is a unique name for the class, this name will be used to make some kind of dependency injection possible; and is used in the configurations files. The second parameter is the class itself.`}

\n

{`The inheritance of the creator class can be a little bit strange, but it is required and needed to register the class automatically with the factory. When the code gets compiled, the classes will be automatically registered with the factory, and you can create instances of those classes by using the name we've defined in the first template parameter. For example we could create a new instance of our previously created class with the following command.`}

\n
{`Algorithm`}{` * `}{`anotherAlgorithm`}{` = `}{`Factory`}{`<`}{`Algorithm`}{`>::`}{`getInstance`}{`()->`}{`create`}{`(`}{`\"AnotherAlgorithm\"`}{`);`}
\n

{`Create the source file`}

\n

{`Ofcourse we also need to have an implementation file, therefore we need to create a new source file in the src/kerberos/machinery/algorithm directory. Just like the previous example, you can copy an existing class and implement the member functions you've declared in the header file. An example would be:`}

\n
{`#`}{`include`}{` `}{`\"machinery/algorithm/AnotherAlgorithm.h\"`}{`\n`}{`namespace`}{` `}{`kerberos`}{`\n`}{`{`}{`\n`}{`    `}{`void`}{` AnotherAlgorithm::`}{`setup`}{`(`}{`const`}{` `}{`StringMap`}{` & `}{`settings`}{`)`}{`\n`}{`    {`}{`\n`}{`        Algorithm::`}{`setup`}{`(`}{`settings`}{`);`}{`\n`}{`        `}{`int`}{` `}{`parameter`}{` = std::`}{`atoi`}{`(`}{`settings`}{`.`}{`at`}{`(`}{`\"algorithms.AnotherAlgorithm.parameter\"`}{`).`}{`c_str`}{`());`}{`\n`}{`        `}{`setParameter`}{`(`}{`parameter`}{`);`}{`\n`}{`    }`}{`\n`}{`    `}{`void`}{` AnotherAlgorithm::`}{`initialize`}{`(`}{`ImageVector`}{` & `}{`images`}{`)`}{`\n`}{`    {`}{`\n`}{`        ....`}{`\n`}{`    }`}{`\n`}{`    `}{`Image`}{` AnotherAlgorithm::`}{`evaluate`}{`(`}{`ImageVector`}{` & `}{`images`}{`, `}{`JSON`}{` & `}{`data`}{`)`}{`\n`}{`    {`}{`\n`}{`        `}{`Image`}{` `}{`evaluation`}{`;`}{`\n`}{`        ... `}{`do`}{` `}{`something`}{` ..`}{`\n`}{`        `}{`return`}{` `}{`evaluation`}{`;`}{`\n`}{`    }`}{`\n`}{`    `}{`void`}{` AnotherAlgorithm::`}{`setParameter`}{`(`}{`int`}{` `}{`parameter`}{`)`}{`\n`}{`    {`}{`\n`}{`        `}{`m_parameter`}{` = `}{`parameter`}{`;`}{`\n`}{`    }`}{`\n`}{`}`}
\n

{`Modify the CMakeLists.txt file`}

\n

{`Open the CMakeLists.txt in the src/kerberos directory file and append the name of the algorithm class to the KERBEROS_FACTORY_ENTITIES variable; for example machinery/algorithm/AnotherAlgorithm.cpp.`}

\n
{`# -------------------------------------------------------`}{`\n`}{`# `}{`Entities`}{` `}{`that`}{` `}{`have`}{` `}{`to`}{` `}{`be`}{` `}{`registered`}{` `}{`with`}{` `}{`the`}{` `}{`factory`}{`\n`}{`#   - `}{`classes`}{` `}{`are`}{` `}{`registered`}{` `}{`on`}{` `}{`compile`}{` `}{`time`}{`, `}{`so`}{` `}{`they`}{`\n`}{`#   `}{`don`}{`'t belong to a library. New algorithms, expositor`}{`s`}{`\n`}{`#   `}{`or`}{` `}{`Io`}{` `}{`classes`}{` `}{`belong`}{` `}{`here`}{`.`}{`\n`}{`set`}{`(`}{`KERBEROS_FACTORY_ENTITIES`}{`\n`}{`    `}{`capture`}{`/`}{`USBCamera`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`condition`}{`/`}{`Time`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`condition`}{`/`}{`Enabled`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`algorithm`}{`/`}{`DifferentialCollins`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`algorithm`}{`/`}{`DifferentialCollinsWithColor`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`algorithm`}{`/`}{`AnotherAlgorithm`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`expositor`}{`/`}{`RectangleExpositor`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`expositor`}{`/`}{`HullExpositor`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`heuristic`}{`/`}{`Sequence`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`io`}{`/`}{`IoDisk`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`io`}{`/`}{`IoTCP`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`io`}{`/`}{`IoMongoDB`}{`.`}{`cpp`}{`\n`}{`)`}
\n

{`Create a new entry in the config file`}

\n

{`Open the algorithm.xml file in the config directory, and add a new tag with exactly the same name you've used in the header file; so in our example \"AnotherAlgorithm\". Within the new tag we can add properties that we will be use to configure our algorithm, in our example we defined a field parameter so we can add this field in the config file.`}

\n

{`One thing you will need to do is to attach a type to a property. The type will be used by the web to automatically render the properties. For simplicity we can use the type number, this will show an input box on the settings page of the web where we are able to add numbers.`}

\n
{`<`}{`algorithms`}{`>`}{`\n`}{`\t<`}{`AnotherAlgorithm`}{`>`}{`\n`}{`\t\t<`}{`parameter`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`5`}{`{`parameter`}{`>`}{`\n`}{`    {`AnotherAlgorithm`}{`>`}{`\n`}{`{`algorithms`}{`>`}
\n

{`You can retrieve the parameter in the setup function with the settings parameter.`}

\n
{`settings`}{`.`}{`at`}{`(`}{`\"algorithms.AnotherAlgorithm.parameter\"`}{`)`}
\n

{`Compile`}

\n

{`Hurray, we've made it! So now you can compile the code again, and if you're using an IDE don't forget to include the new source file! If you are compiling from the command-line you just have to go to the build folder and write make.`}

\n

{`Web`}

\n

{`Contributing to `}{`the web repository`}{` requires both front- and back-end skillls, more precisely BackboneJS (JavaScript) and Laravel 5.4 (PHP).`}

\n

{`Prerequisites`}

\n

{`Make sure you have following services installed on your working station.`}

\n
\n

{`>`}{`= PHP 7.1.0, NodeJS and NPM and Nginx or Apache`}

\n
\n

{`Installation`}

\n

{`Clone the repository to your working station.`}

\n
{`git`}{` `}{`clone`}{` https:`}{`//github.com/kerberos-io/web`}{`\n`}{`cd`}{` `}{`web`}
\n

{`Install the PHP libraries using the dependency mananger, `}{`Composer`}{`. If you haven't installed composer execute following commands.`}

\n
{`php`}{` -`}{`r`}{` `}{`\"readfile('https://getcomposer.org/installer');\"`}{` > `}{`composer`}{`-`}{`setup`}{`.`}{`php`}{`\n`}{`php`}{` -`}{`r`}{` `}{`\"if (hash('SHA384', file_get_contents('composer-setup.php')) === '41e71d86b40f28e771d4bb662b997f79625196afcca95a5abf44391188c695c6c1456e16154c75a211d238cc3bc5cb47') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;\"`}{`\n`}{`php`}{` `}{`composer`}{`-`}{`setup`}{`.`}{`php`}{`\n`}{`php`}{` -`}{`r`}{` `}{`\"unlink('composer-setup.php');\"`}
\n

{`After a succesful installation, you can run composer install or composer update from the root of the project. All dependencies will be installed or updated if a newer version is detected.`}

\n
{`composer`}{` `}{`update`}
\n

{`Besides PHP, the project also relies on BackboneJS (Javascript) for the front-end. Therefore a couple JavaScript dependencies should be installed.`}

\n
{`npm`}{` -`}{`g`}{` `}{`install`}{` `}{`bower`}{`\n`}{`cd`}{` `}{`public`}{`\n`}{`bower`}{` `}{`update`}
\n

{`When everything is installed properly, you need too link the web project with your applicationn server. Read more on the `}{`Laravel documentation website`}{`.`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760430000,"key":"gatsby-plugin-mdx-entire-payload-4b511d78389e3dfc4845d066b2b3456e-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Contribute","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"In this document we describe the different things you need to know if you would like to add a new feature to Kerberos Open Source, or change some of its behaviour for your own use case.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":10,"column":186,"offset":358},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":10,"column":186,"offset":358},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before starting, as you might have read already, you need to know that Kerberos Open Source consists of two solutions. A front-end, also called ","position":{"start":{"line":12,"column":1,"offset":360},"end":{"line":12,"column":145,"offset":504},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"web","position":{"start":{"line":12,"column":147,"offset":506},"end":{"line":12,"column":150,"offset":509},"indent":[]}}],"position":{"start":{"line":12,"column":145,"offset":504},"end":{"line":12,"column":152,"offset":511},"indent":[]}},{"type":"text","value":", which allows you to review the recordings and to configure the back-end settings. A back-end, also called ","position":{"start":{"line":12,"column":152,"offset":511},"end":{"line":12,"column":260,"offset":619},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"machinery","position":{"start":{"line":12,"column":262,"offset":621},"end":{"line":12,"column":271,"offset":630},"indent":[]}}],"position":{"start":{"line":12,"column":260,"offset":619},"end":{"line":12,"column":273,"offset":632},"indent":[]}},{"type":"text","value":", which is computer vision solution that processes the video stream of surveillance camera.","position":{"start":{"line":12,"column":273,"offset":632},"end":{"line":12,"column":364,"offset":723},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":360},"end":{"line":12,"column":364,"offset":723},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you start changing or adding features to Kerberos Open Source, there is a big chance you will need to modify the previously mentioned solutions. That's why we will discuss how you can contribute to one or both solutions.","position":{"start":{"line":14,"column":1,"offset":725},"end":{"line":14,"column":226,"offset":950},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":725},"end":{"line":14,"column":226,"offset":950},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Machinery","position":{"start":{"line":16,"column":4,"offset":955},"end":{"line":16,"column":13,"offset":964},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":952},"end":{"line":16,"column":13,"offset":964},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Contributing to the ","position":{"start":{"line":18,"column":1,"offset":966},"end":{"line":18,"column":21,"offset":986},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/machinery","children":[{"type":"text","value":"machinery repository","position":{"start":{"line":18,"column":22,"offset":987},"end":{"line":18,"column":42,"offset":1007},"indent":[]}}],"position":{"start":{"line":18,"column":21,"offset":986},"end":{"line":18,"column":85,"offset":1050},"indent":[]}},{"type":"text","value":" requires C++ skills. This section describes all the technical stuff you will need to know. If you want to contribute, the first thing you will need to do is installing the source code on your working station.","position":{"start":{"line":18,"column":85,"offset":1050},"end":{"line":18,"column":294,"offset":1259},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":966},"end":{"line":18,"column":294,"offset":1259},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Prerequisites","position":{"start":{"line":20,"column":5,"offset":1265},"end":{"line":20,"column":18,"offset":1278},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1261},"end":{"line":20,"column":18,"offset":1278},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"A Linux OS, or Mac OSX (Window is not supported).","position":{"start":{"line":22,"column":3,"offset":1282},"end":{"line":22,"column":52,"offset":1331},"indent":[]}}],"position":{"start":{"line":22,"column":3,"offset":1282},"end":{"line":22,"column":52,"offset":1331},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1280},"end":{"line":22,"column":52,"offset":1331},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Installation","position":{"start":{"line":24,"column":5,"offset":1337},"end":{"line":24,"column":17,"offset":1349},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1333},"end":{"line":24,"column":17,"offset":1349},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The complete installation can be found on the advanced installation page, describing the complete set of instructions. However for simplicity we will give a summarized version, as probably you will already have a development environment set up.","position":{"start":{"line":26,"column":1,"offset":1351},"end":{"line":26,"column":245,"offset":1595},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1351},"end":{"line":26,"column":245,"offset":1595},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Install development tools (C++, CMake) and V4L utils, and clone the repository. Compile the project using cmake and make.","position":{"start":{"line":28,"column":1,"offset":1597},"end":{"line":28,"column":122,"offset":1718},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":1597},"end":{"line":28,"column":122,"offset":1718},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"sudo apt-get -y update\nsudo apt-get install -y git cmake subversion dh-autoreconf libcurl4-openssl-dev yasm libx264-dev pkg-config libssl-dev\ncd && sudo git clone https://github.com/kerberos-io/machinery\ncd machinery && mkdir build && cd build\ncmake .. && make -j8 && make check && sudo make install","position":{"start":{"line":30,"column":1,"offset":1720},"end":{"line":36,"column":4,"offset":2029},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Testing","position":{"start":{"line":38,"column":5,"offset":2035},"end":{"line":38,"column":12,"offset":2042},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":2031},"end":{"line":38,"column":12,"offset":2042},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"We strongly recommend testing as a best practice in complex projects. Therefore the machinery uses the popular C++ test library: Google Test and Google Mock. The tests can be found in the test directory. You can run the test by executing following command:","position":{"start":{"line":40,"column":1,"offset":2044},"end":{"line":40,"column":257,"offset":2300},"indent":[]}}],"position":{"start":{"line":40,"column":1,"offset":2044},"end":{"line":40,"column":257,"offset":2300},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"make check","position":{"start":{"line":42,"column":1,"offset":2302},"end":{"line":44,"column":4,"offset":2322},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Adding a new class","position":{"start":{"line":46,"column":5,"offset":2328},"end":{"line":46,"column":23,"offset":2346},"indent":[]}}],"position":{"start":{"line":46,"column":1,"offset":2324},"end":{"line":46,"column":23,"offset":2346},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"This paragraph will tell you how to create a new condition, algorithm, expositor, io or capture device. For simplicity we will show how to create a new algorithm; the steps are identical if you want to create for example a new capture device; only the directory will differ.","position":{"start":{"line":48,"column":1,"offset":2348},"end":{"line":48,"column":275,"offset":2622},"indent":[]}}],"position":{"start":{"line":48,"column":1,"offset":2348},"end":{"line":48,"column":275,"offset":2622},"indent":[]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Create the header file","position":{"start":{"line":50,"column":6,"offset":2629},"end":{"line":50,"column":28,"offset":2651},"indent":[]}}],"position":{"start":{"line":50,"column":1,"offset":2624},"end":{"line":50,"column":28,"offset":2651},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"First we will need to create a new header file in the include/kerberos/machinery/algorithm directory. You can copy an existing algorithm header file, and start from there. You will end up with the following header file:","position":{"start":{"line":52,"column":1,"offset":2653},"end":{"line":52,"column":220,"offset":2872},"indent":[]}}],"position":{"start":{"line":52,"column":1,"offset":2653},"end":{"line":52,"column":220,"offset":2872},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"//\n// Class: AnotherAlgorithm\n// Description: Another algorithm\n// Created: ...\n// Author: ...\n// Mail: ...\n// Website: ...\n//\n// The copyright to the computer program(s) herein\n// is the property of kerberos.io, Belgium.\n// The program(s) may be used and/or copied .\n//\n/////////////////////////////////////////////////////\n#ifndef __AnotherAlgorithm_H_INCLUDED__ // if AnotherAlgorithm.h hasn't been included yet...\n#define __AnotherAlgorithm_H_INCLUDED__ // #define this so the compiler knows it has been included\n#include \"machinery/algorithm/Algorithm.h\"\nnamespace kerberos\n{\n\tchar AnotherAlgorithmName[] = \"AnotherAlgorithm\";\n\tclass AnotherAlgorithm : public AlgorithmCreator\n\t{\n \tprivate:\n \t\tImage m_result;\n \tint m_parameter;\n \tpublic:\n \tAnotherAlgorithm(){}\n \tvoid setup(const StringMap & settings);\n \tvoid initialize(ImageVector & images);\n \tImage evaluate(ImageVector & images, JSON & data);\n \tvoid setParameter(int parameter);\n\t};\n}\n#endif","position":{"start":{"line":54,"column":1,"offset":2874},"end":{"line":88,"column":4,"offset":3959},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"When creating a new class you will need to inherit from it corresponding creator, for the algorithm example: AlgorithmCreator. The creator class requires two template parameters. The first one is a unique name for the class, this name will be used to make some kind of dependency injection possible; and is used in the configurations files. The second parameter is the class itself.","position":{"start":{"line":90,"column":1,"offset":3961},"end":{"line":90,"column":383,"offset":4343},"indent":[]}}],"position":{"start":{"line":90,"column":1,"offset":3961},"end":{"line":90,"column":383,"offset":4343},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The inheritance of the creator class can be a little bit strange, but it is required and needed to register the class automatically with the factory. When the code gets compiled, the classes will be automatically registered with the factory, and you can create instances of those classes by using the name we've defined in the first template parameter. For example we could create a new instance of our previously created class with the following command.","position":{"start":{"line":92,"column":1,"offset":4345},"end":{"line":92,"column":456,"offset":4800},"indent":[]}}],"position":{"start":{"line":92,"column":1,"offset":4345},"end":{"line":92,"column":456,"offset":4800},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"Algorithm * anotherAlgorithm = Factory::getInstance()->create(\"AnotherAlgorithm\");","position":{"start":{"line":94,"column":1,"offset":4802},"end":{"line":96,"column":4,"offset":4905},"indent":[1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Create the source file","position":{"start":{"line":98,"column":6,"offset":4912},"end":{"line":98,"column":28,"offset":4934},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":4907},"end":{"line":98,"column":28,"offset":4934},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Ofcourse we also need to have an implementation file, therefore we need to create a new source file in the src/kerberos/machinery/algorithm directory. Just like the previous example, you can copy an existing class and implement the member functions you've declared in the header file. An example would be:","position":{"start":{"line":100,"column":1,"offset":4936},"end":{"line":100,"column":306,"offset":5241},"indent":[]}}],"position":{"start":{"line":100,"column":1,"offset":4936},"end":{"line":100,"column":306,"offset":5241},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"#include \"machinery/algorithm/AnotherAlgorithm.h\"\nnamespace kerberos\n{\n void AnotherAlgorithm::setup(const StringMap & settings)\n {\n Algorithm::setup(settings);\n int parameter = std::atoi(settings.at(\"algorithms.AnotherAlgorithm.parameter\").c_str());\n setParameter(parameter);\n }\n void AnotherAlgorithm::initialize(ImageVector & images)\n {\n ....\n }\n Image AnotherAlgorithm::evaluate(ImageVector & images, JSON & data)\n {\n Image evaluation;\n ... do something ..\n return evaluation;\n }\n void AnotherAlgorithm::setParameter(int parameter)\n {\n m_parameter = parameter;\n }\n}","position":{"start":{"line":102,"column":1,"offset":5243},"end":{"line":127,"column":4,"offset":5914},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Modify the CMakeLists.txt file","position":{"start":{"line":129,"column":6,"offset":5921},"end":{"line":129,"column":36,"offset":5951},"indent":[]}}],"position":{"start":{"line":129,"column":1,"offset":5916},"end":{"line":129,"column":36,"offset":5951},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Open the CMakeLists.txt in the src/kerberos directory file and append the name of the algorithm class to the KERBEROS_FACTORY_ENTITIES variable; for example machinery/algorithm/AnotherAlgorithm.cpp.","position":{"start":{"line":131,"column":1,"offset":5953},"end":{"line":131,"column":199,"offset":6151},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":5953},"end":{"line":131,"column":199,"offset":6151},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"# -------------------------------------------------------\n# Entities that have to be registered with the factory\n# - classes are registered on compile time, so they\n# don't belong to a library. New algorithms, expositors\n# or Io classes belong here.\nset(KERBEROS_FACTORY_ENTITIES\n capture/USBCamera.cpp\n machinery/condition/Time.cpp\n machinery/condition/Enabled.cpp\n machinery/algorithm/DifferentialCollins.cpp\n machinery/algorithm/DifferentialCollinsWithColor.cpp\n machinery/algorithm/AnotherAlgorithm.cpp\n machinery/expositor/RectangleExpositor.cpp\n machinery/expositor/HullExpositor.cpp\n machinery/heuristic/Sequence.cpp\n machinery/io/IoDisk.cpp\n machinery/io/IoTCP.cpp\n machinery/io/IoMongoDB.cpp\n)","position":{"start":{"line":133,"column":1,"offset":6153},"end":{"line":153,"column":4,"offset":6907},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":4,"children":[{"type":"text","value":"Create a new entry in the config file","position":{"start":{"line":155,"column":6,"offset":6914},"end":{"line":155,"column":43,"offset":6951},"indent":[]}}],"position":{"start":{"line":155,"column":1,"offset":6909},"end":{"line":155,"column":43,"offset":6951},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Open the algorithm.xml file in the config directory, and add a new tag with exactly the same name you've used in the header file; so in our example \"AnotherAlgorithm\". Within the new tag we can add properties that we will be use to configure our algorithm, in our example we defined a field parameter so we can add this field in the config file.","position":{"start":{"line":157,"column":1,"offset":6953},"end":{"line":157,"column":346,"offset":7298},"indent":[]}}],"position":{"start":{"line":157,"column":1,"offset":6953},"end":{"line":157,"column":346,"offset":7298},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"One thing you will need to do is to attach a type to a property. The type will be used by the web to automatically render the properties. For simplicity we can use the type number, this will show an input box on the settings page of the web where we are able to add numbers.","position":{"start":{"line":159,"column":1,"offset":7300},"end":{"line":159,"column":275,"offset":7574},"indent":[]}}],"position":{"start":{"line":159,"column":1,"offset":7300},"end":{"line":159,"column":275,"offset":7574},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"\n\t\n\t\t5\n \n","position":{"start":{"line":161,"column":1,"offset":7576},"end":{"line":167,"column":4,"offset":7697},"indent":[1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"You can retrieve the parameter in the setup function with the settings parameter.","position":{"start":{"line":169,"column":1,"offset":7699},"end":{"line":169,"column":82,"offset":7780},"indent":[]}}],"position":{"start":{"line":169,"column":1,"offset":7699},"end":{"line":169,"column":82,"offset":7780},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"settings.at(\"algorithms.AnotherAlgorithm.parameter\")","position":{"start":{"line":171,"column":1,"offset":7782},"end":{"line":173,"column":4,"offset":7844},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Compile","position":{"start":{"line":175,"column":5,"offset":7850},"end":{"line":175,"column":12,"offset":7857},"indent":[]}}],"position":{"start":{"line":175,"column":1,"offset":7846},"end":{"line":175,"column":12,"offset":7857},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Hurray, we've made it! So now you can compile the code again, and if you're using an IDE don't forget to include the new source file! If you are compiling from the command-line you just have to go to the build folder and write make.","position":{"start":{"line":177,"column":1,"offset":7859},"end":{"line":177,"column":233,"offset":8091},"indent":[]}}],"position":{"start":{"line":177,"column":1,"offset":7859},"end":{"line":177,"column":233,"offset":8091},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Web","position":{"start":{"line":179,"column":4,"offset":8096},"end":{"line":179,"column":7,"offset":8099},"indent":[]}}],"position":{"start":{"line":179,"column":1,"offset":8093},"end":{"line":179,"column":7,"offset":8099},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Contributing to ","position":{"start":{"line":181,"column":1,"offset":8101},"end":{"line":181,"column":17,"offset":8117},"indent":[]}},{"type":"link","title":null,"url":"https://github.com/kerberos-io/web","children":[{"type":"text","value":"the web repository","position":{"start":{"line":181,"column":18,"offset":8118},"end":{"line":181,"column":36,"offset":8136},"indent":[]}}],"position":{"start":{"line":181,"column":17,"offset":8117},"end":{"line":181,"column":73,"offset":8173},"indent":[]}},{"type":"text","value":" requires both front- and back-end skillls, more precisely BackboneJS (JavaScript) and Laravel 5.4 (PHP).","position":{"start":{"line":181,"column":73,"offset":8173},"end":{"line":181,"column":178,"offset":8278},"indent":[]}}],"position":{"start":{"line":181,"column":1,"offset":8101},"end":{"line":181,"column":178,"offset":8278},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Prerequisites","position":{"start":{"line":183,"column":5,"offset":8284},"end":{"line":183,"column":18,"offset":8297},"indent":[]}}],"position":{"start":{"line":183,"column":1,"offset":8280},"end":{"line":183,"column":18,"offset":8297},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Make sure you have following services installed on your working station.","position":{"start":{"line":185,"column":1,"offset":8299},"end":{"line":185,"column":73,"offset":8371},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":8299},"end":{"line":185,"column":73,"offset":8371},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":">","position":{"start":{"line":187,"column":2,"offset":8374},"end":{"line":187,"column":4,"offset":8376},"indent":[]}},{"type":"text","value":"= PHP 7.1.0, NodeJS and NPM and Nginx or Apache","position":{"start":{"line":187,"column":4,"offset":8376},"end":{"line":187,"column":51,"offset":8423},"indent":[]}}],"position":{"start":{"line":187,"column":2,"offset":8374},"end":{"line":187,"column":51,"offset":8423},"indent":[]}}],"position":{"start":{"line":187,"column":1,"offset":8373},"end":{"line":187,"column":51,"offset":8423},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Installation","position":{"start":{"line":189,"column":5,"offset":8429},"end":{"line":189,"column":17,"offset":8441},"indent":[]}}],"position":{"start":{"line":189,"column":1,"offset":8425},"end":{"line":189,"column":17,"offset":8441},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Clone the repository to your working station.","position":{"start":{"line":191,"column":1,"offset":8443},"end":{"line":191,"column":46,"offset":8488},"indent":[]}}],"position":{"start":{"line":191,"column":1,"offset":8443},"end":{"line":191,"column":46,"offset":8488},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"git clone https://github.com/kerberos-io/web\ncd web","position":{"start":{"line":193,"column":1,"offset":8490},"end":{"line":196,"column":4,"offset":8551},"indent":[1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Install the PHP libraries using the dependency mananger, ","position":{"start":{"line":198,"column":1,"offset":8553},"end":{"line":198,"column":58,"offset":8610},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Composer","position":{"start":{"line":198,"column":60,"offset":8612},"end":{"line":198,"column":68,"offset":8620},"indent":[]}}],"position":{"start":{"line":198,"column":58,"offset":8610},"end":{"line":198,"column":70,"offset":8622},"indent":[]}},{"type":"text","value":". If you haven't installed composer execute following commands.","position":{"start":{"line":198,"column":70,"offset":8622},"end":{"line":198,"column":133,"offset":8685},"indent":[]}}],"position":{"start":{"line":198,"column":1,"offset":8553},"end":{"line":198,"column":133,"offset":8685},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"php -r \"readfile('https://getcomposer.org/installer');\" > composer-setup.php\nphp -r \"if (hash('SHA384', file_get_contents('composer-setup.php')) === '41e71d86b40f28e771d4bb662b997f79625196afcca95a5abf44391188c695c6c1456e16154c75a211d238cc3bc5cb47') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;\"\nphp composer-setup.php\nphp -r \"unlink('composer-setup.php');\"","position":{"start":{"line":200,"column":1,"offset":8687},"end":{"line":205,"column":4,"offset":9118},"indent":[1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"After a succesful installation, you can run composer install or composer update from the root of the project. All dependencies will be installed or updated if a newer version is detected.","position":{"start":{"line":207,"column":1,"offset":9120},"end":{"line":207,"column":188,"offset":9307},"indent":[]}}],"position":{"start":{"line":207,"column":1,"offset":9120},"end":{"line":207,"column":188,"offset":9307},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"composer update","position":{"start":{"line":209,"column":1,"offset":9309},"end":{"line":211,"column":4,"offset":9334},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Besides PHP, the project also relies on BackboneJS (Javascript) for the front-end. Therefore a couple JavaScript dependencies should be installed.","position":{"start":{"line":213,"column":1,"offset":9336},"end":{"line":213,"column":147,"offset":9482},"indent":[]}}],"position":{"start":{"line":213,"column":1,"offset":9336},"end":{"line":213,"column":147,"offset":9482},"indent":[]}},{"type":"code","lang":"ts","meta":null,"value":"npm -g install bower\ncd public\nbower update","position":{"start":{"line":215,"column":1,"offset":9484},"end":{"line":219,"column":4,"offset":9537},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"When everything is installed properly, you need too link the web project with your applicationn server. Read more on the ","position":{"start":{"line":221,"column":1,"offset":9539},"end":{"line":221,"column":122,"offset":9660},"indent":[]}},{"type":"link","title":null,"url":"https://laravel.com/docs/5.8/deployment","children":[{"type":"text","value":"Laravel documentation website","position":{"start":{"line":221,"column":123,"offset":9661},"end":{"line":221,"column":152,"offset":9690},"indent":[]}}],"position":{"start":{"line":221,"column":122,"offset":9660},"end":{"line":221,"column":194,"offset":9732},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":221,"column":194,"offset":9732},"end":{"line":221,"column":195,"offset":9733},"indent":[]}}],"position":{"start":{"line":221,"column":1,"offset":9539},"end":{"line":221,"column":195,"offset":9733},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":224,"column":1,"offset":9736},"end":{"line":224,"column":31,"offset":9766},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":224,"column":31,"offset":9766}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Contribute`}

\n

{`In this document we describe the different things you need to know if you would like to add a new feature to Kerberos Open Source, or change some of its behaviour for your own use case.`}

\n

{`Before starting, as you might have read already, you need to know that Kerberos Open Source consists of two solutions. A front-end, also called `}{`web`}{`, which allows you to review the recordings and to configure the back-end settings. A back-end, also called `}{`machinery`}{`, which is computer vision solution that processes the video stream of surveillance camera.`}

\n

{`Once you start changing or adding features to Kerberos Open Source, there is a big chance you will need to modify the previously mentioned solutions. That's why we will discuss how you can contribute to one or both solutions.`}

\n

{`Machinery`}

\n

{`Contributing to the `}{`machinery repository`}{` requires C++ skills. This section describes all the technical stuff you will need to know. If you want to contribute, the first thing you will need to do is installing the source code on your working station.`}

\n

{`Prerequisites`}

\n
\n

{`A Linux OS, or Mac OSX (Window is not supported).`}

\n
\n

{`Installation`}

\n

{`The complete installation can be found on the advanced installation page, describing the complete set of instructions. However for simplicity we will give a summarized version, as probably you will already have a development environment set up.`}

\n

{`Install development tools (C++, CMake) and V4L utils, and clone the repository. Compile the project using cmake and make.`}

\n
{`sudo`}{` `}{`apt`}{`-`}{`get`}{` -`}{`y`}{` `}{`update`}{`\n`}{`sudo`}{` `}{`apt`}{`-`}{`get`}{` `}{`install`}{` -`}{`y`}{` `}{`git`}{` `}{`cmake`}{` `}{`subversion`}{` `}{`dh`}{`-`}{`autoreconf`}{` `}{`libcurl4`}{`-`}{`openssl`}{`-`}{`dev`}{` `}{`yasm`}{` `}{`libx264`}{`-`}{`dev`}{` `}{`pkg`}{`-`}{`config`}{` `}{`libssl`}{`-`}{`dev`}{`\n`}{`cd`}{` && `}{`sudo`}{` `}{`git`}{` `}{`clone`}{` https:`}{`//github.com/kerberos-io/machinery`}{`\n`}{`cd`}{` `}{`machinery`}{` && `}{`mkdir`}{` `}{`build`}{` && `}{`cd`}{` `}{`build`}{`\n`}{`cmake`}{` .. && `}{`make`}{` -`}{`j8`}{` && `}{`make`}{` `}{`check`}{` && `}{`sudo`}{` `}{`make`}{` `}{`install`}
\n

{`Testing`}

\n

{`We strongly recommend testing as a best practice in complex projects. Therefore the machinery uses the popular C++ test library: Google Test and Google Mock. The tests can be found in the test directory. You can run the test by executing following command:`}

\n
{`make`}{` `}{`check`}
\n

{`Adding a new class`}

\n

{`This paragraph will tell you how to create a new condition, algorithm, expositor, io or capture device. For simplicity we will show how to create a new algorithm; the steps are identical if you want to create for example a new capture device; only the directory will differ.`}

\n

{`Create the header file`}

\n

{`First we will need to create a new header file in the include/kerberos/machinery/algorithm directory. You can copy an existing algorithm header file, and start from there. You will end up with the following header file:`}

\n
{`//`}{`\n`}{`//  Class: AnotherAlgorithm`}{`\n`}{`//  Description: Another algorithm`}{`\n`}{`//  Created:     ...`}{`\n`}{`//  Author:      ...`}{`\n`}{`//  Mail:        ...`}{`\n`}{`//  Website:     ...`}{`\n`}{`//`}{`\n`}{`//  The copyright to the computer program(s) herein`}{`\n`}{`//  is the property of kerberos.io, Belgium.`}{`\n`}{`//  The program(s) may be used and/or copied .`}{`\n`}{`//`}{`\n`}{`/////////////////////////////////////////////////////`}{`\n`}{`#`}{`ifndef`}{` `}{`__AnotherAlgorithm_H_INCLUDED__`}{`   `}{`// if AnotherAlgorithm.h hasn't been included yet...`}{`\n`}{`#`}{`define`}{` `}{`__AnotherAlgorithm_H_INCLUDED__`}{`   `}{`// #define this so the compiler knows it has been included`}{`\n`}{`#`}{`include`}{` `}{`\"machinery/algorithm/Algorithm.h\"`}{`\n`}{`namespace`}{` `}{`kerberos`}{`\n`}{`{`}{`\n`}{`\t`}{`char`}{` `}{`AnotherAlgorithmName`}{`[] = `}{`\"AnotherAlgorithm\"`}{`;`}{`\n`}{`\t`}{`class`}{` `}{`AnotherAlgorithm`}{` : `}{`public`}{` `}{`AlgorithmCreator`}{`<`}{`AnotherAlgorithmName`}{`, `}{`AnotherAlgorithm`}{`>`}{`\n`}{`\t{`}{`\n`}{`    \t`}{`private`}{`:`}{`\n`}{`    \t\t`}{`Image`}{` `}{`m_result`}{`;`}{`\n`}{`        \t`}{`int`}{` `}{`m_parameter`}{`;`}{`\n`}{`    \t`}{`public`}{`:`}{`\n`}{`        \t`}{`AnotherAlgorithm`}{`(){}`}{`\n`}{`        \t`}{`void`}{` `}{`setup`}{`(`}{`const`}{` `}{`StringMap`}{` & `}{`settings`}{`);`}{`\n`}{`        \t`}{`void`}{` `}{`initialize`}{`(`}{`ImageVector`}{` & `}{`images`}{`);`}{`\n`}{`        \t`}{`Image`}{` `}{`evaluate`}{`(`}{`ImageVector`}{` & `}{`images`}{`, `}{`JSON`}{` & `}{`data`}{`);`}{`\n`}{`        \t`}{`void`}{` `}{`setParameter`}{`(`}{`int`}{` `}{`parameter`}{`);`}{`\n`}{`\t};`}{`\n`}{`}`}{`\n`}{`#`}{`endif`}
\n

{`When creating a new class you will need to inherit from it corresponding creator, for the algorithm example: AlgorithmCreator. The creator class requires two template parameters. The first one is a unique name for the class, this name will be used to make some kind of dependency injection possible; and is used in the configurations files. The second parameter is the class itself.`}

\n

{`The inheritance of the creator class can be a little bit strange, but it is required and needed to register the class automatically with the factory. When the code gets compiled, the classes will be automatically registered with the factory, and you can create instances of those classes by using the name we've defined in the first template parameter. For example we could create a new instance of our previously created class with the following command.`}

\n
{`Algorithm`}{` * `}{`anotherAlgorithm`}{` = `}{`Factory`}{`<`}{`Algorithm`}{`>::`}{`getInstance`}{`()->`}{`create`}{`(`}{`\"AnotherAlgorithm\"`}{`);`}
\n

{`Create the source file`}

\n

{`Ofcourse we also need to have an implementation file, therefore we need to create a new source file in the src/kerberos/machinery/algorithm directory. Just like the previous example, you can copy an existing class and implement the member functions you've declared in the header file. An example would be:`}

\n
{`#`}{`include`}{` `}{`\"machinery/algorithm/AnotherAlgorithm.h\"`}{`\n`}{`namespace`}{` `}{`kerberos`}{`\n`}{`{`}{`\n`}{`    `}{`void`}{` AnotherAlgorithm::`}{`setup`}{`(`}{`const`}{` `}{`StringMap`}{` & `}{`settings`}{`)`}{`\n`}{`    {`}{`\n`}{`        Algorithm::`}{`setup`}{`(`}{`settings`}{`);`}{`\n`}{`        `}{`int`}{` `}{`parameter`}{` = std::`}{`atoi`}{`(`}{`settings`}{`.`}{`at`}{`(`}{`\"algorithms.AnotherAlgorithm.parameter\"`}{`).`}{`c_str`}{`());`}{`\n`}{`        `}{`setParameter`}{`(`}{`parameter`}{`);`}{`\n`}{`    }`}{`\n`}{`    `}{`void`}{` AnotherAlgorithm::`}{`initialize`}{`(`}{`ImageVector`}{` & `}{`images`}{`)`}{`\n`}{`    {`}{`\n`}{`        ....`}{`\n`}{`    }`}{`\n`}{`    `}{`Image`}{` AnotherAlgorithm::`}{`evaluate`}{`(`}{`ImageVector`}{` & `}{`images`}{`, `}{`JSON`}{` & `}{`data`}{`)`}{`\n`}{`    {`}{`\n`}{`        `}{`Image`}{` `}{`evaluation`}{`;`}{`\n`}{`        ... `}{`do`}{` `}{`something`}{` ..`}{`\n`}{`        `}{`return`}{` `}{`evaluation`}{`;`}{`\n`}{`    }`}{`\n`}{`    `}{`void`}{` AnotherAlgorithm::`}{`setParameter`}{`(`}{`int`}{` `}{`parameter`}{`)`}{`\n`}{`    {`}{`\n`}{`        `}{`m_parameter`}{` = `}{`parameter`}{`;`}{`\n`}{`    }`}{`\n`}{`}`}
\n

{`Modify the CMakeLists.txt file`}

\n

{`Open the CMakeLists.txt in the src/kerberos directory file and append the name of the algorithm class to the KERBEROS_FACTORY_ENTITIES variable; for example machinery/algorithm/AnotherAlgorithm.cpp.`}

\n
{`# -------------------------------------------------------`}{`\n`}{`# `}{`Entities`}{` `}{`that`}{` `}{`have`}{` `}{`to`}{` `}{`be`}{` `}{`registered`}{` `}{`with`}{` `}{`the`}{` `}{`factory`}{`\n`}{`#   - `}{`classes`}{` `}{`are`}{` `}{`registered`}{` `}{`on`}{` `}{`compile`}{` `}{`time`}{`, `}{`so`}{` `}{`they`}{`\n`}{`#   `}{`don`}{`'t belong to a library. New algorithms, expositor`}{`s`}{`\n`}{`#   `}{`or`}{` `}{`Io`}{` `}{`classes`}{` `}{`belong`}{` `}{`here`}{`.`}{`\n`}{`set`}{`(`}{`KERBEROS_FACTORY_ENTITIES`}{`\n`}{`    `}{`capture`}{`/`}{`USBCamera`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`condition`}{`/`}{`Time`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`condition`}{`/`}{`Enabled`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`algorithm`}{`/`}{`DifferentialCollins`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`algorithm`}{`/`}{`DifferentialCollinsWithColor`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`algorithm`}{`/`}{`AnotherAlgorithm`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`expositor`}{`/`}{`RectangleExpositor`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`expositor`}{`/`}{`HullExpositor`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`heuristic`}{`/`}{`Sequence`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`io`}{`/`}{`IoDisk`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`io`}{`/`}{`IoTCP`}{`.`}{`cpp`}{`\n`}{`    `}{`machinery`}{`/`}{`io`}{`/`}{`IoMongoDB`}{`.`}{`cpp`}{`\n`}{`)`}
\n

{`Create a new entry in the config file`}

\n

{`Open the algorithm.xml file in the config directory, and add a new tag with exactly the same name you've used in the header file; so in our example \"AnotherAlgorithm\". Within the new tag we can add properties that we will be use to configure our algorithm, in our example we defined a field parameter so we can add this field in the config file.`}

\n

{`One thing you will need to do is to attach a type to a property. The type will be used by the web to automatically render the properties. For simplicity we can use the type number, this will show an input box on the settings page of the web where we are able to add numbers.`}

\n
{`<`}{`algorithms`}{`>`}{`\n`}{`\t<`}{`AnotherAlgorithm`}{`>`}{`\n`}{`\t\t<`}{`parameter`}{` `}{`type`}{`=`}{`\"number\"`}{`>`}{`5`}{`{`parameter`}{`>`}{`\n`}{`    {`AnotherAlgorithm`}{`>`}{`\n`}{`{`algorithms`}{`>`}
\n

{`You can retrieve the parameter in the setup function with the settings parameter.`}

\n
{`settings`}{`.`}{`at`}{`(`}{`\"algorithms.AnotherAlgorithm.parameter\"`}{`)`}
\n

{`Compile`}

\n

{`Hurray, we've made it! So now you can compile the code again, and if you're using an IDE don't forget to include the new source file! If you are compiling from the command-line you just have to go to the build folder and write make.`}

\n

{`Web`}

\n

{`Contributing to `}{`the web repository`}{` requires both front- and back-end skillls, more precisely BackboneJS (JavaScript) and Laravel 5.4 (PHP).`}

\n

{`Prerequisites`}

\n

{`Make sure you have following services installed on your working station.`}

\n
\n

{`>`}{`= PHP 7.1.0, NodeJS and NPM and Nginx or Apache`}

\n
\n

{`Installation`}

\n

{`Clone the repository to your working station.`}

\n
{`git`}{` `}{`clone`}{` https:`}{`//github.com/kerberos-io/web`}{`\n`}{`cd`}{` `}{`web`}
\n

{`Install the PHP libraries using the dependency mananger, `}{`Composer`}{`. If you haven't installed composer execute following commands.`}

\n
{`php`}{` -`}{`r`}{` `}{`\"readfile('https://getcomposer.org/installer');\"`}{` > `}{`composer`}{`-`}{`setup`}{`.`}{`php`}{`\n`}{`php`}{` -`}{`r`}{` `}{`\"if (hash('SHA384', file_get_contents('composer-setup.php')) === '41e71d86b40f28e771d4bb662b997f79625196afcca95a5abf44391188c695c6c1456e16154c75a211d238cc3bc5cb47') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;\"`}{`\n`}{`php`}{` `}{`composer`}{`-`}{`setup`}{`.`}{`php`}{`\n`}{`php`}{` -`}{`r`}{` `}{`\"unlink('composer-setup.php');\"`}
\n

{`After a succesful installation, you can run composer install or composer update from the root of the project. All dependencies will be installed or updated if a newer version is detected.`}

\n
{`composer`}{` `}{`update`}
\n

{`Besides PHP, the project also relies on BackboneJS (Javascript) for the front-end. Therefore a couple JavaScript dependencies should be installed.`}

\n
{`npm`}{` -`}{`g`}{` `}{`install`}{` `}{`bower`}{`\n`}{`cd`}{` `}{`public`}{`\n`}{`bower`}{` `}{`update`}
\n

{`When everything is installed properly, you need too link the web project with your applicationn server. Read more on the `}{`Laravel documentation website`}{`.`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a90f8bc40531b0e632d6f3920b39575c.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a90f8bc40531b0e632d6f3920b39575c.json deleted file mode 100644 index 01b30b4..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-a90f8bc40531b0e632d6f3920b39575c.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838682549000,"key":"gatsby-plugin-mdx-entire-payload-a11022737612b03261a467b5ab5fd279-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":23,"column":1,"offset":1397},"end":{"line":23,"column":31,"offset":1427},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":23,"column":31,"offset":1427}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ab2d20eac6480bdfc4975c0d23df3b80.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ab2d20eac6480bdfc4975c0d23df3b80.json new file mode 100644 index 0000000..44cd8eb --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ab2d20eac6480bdfc4975c0d23df3b80.json @@ -0,0 +1 @@ +{"expireTime":9007200838781153000,"key":"gatsby-plugin-mdx-entire-payload-1ab76916566786005bd41f03aac98c52-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":73,"column":1,"offset":2191},"end":{"line":84,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":86,"column":4,"offset":2497},"end":{"line":86,"column":11,"offset":2504},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2494},"end":{"line":86,"column":11,"offset":2504},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Traefik is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.","position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":168,"offset":2673},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":168,"offset":2673},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":90,"column":1,"offset":2675},"end":{"line":90,"column":72,"offset":2746},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":92,"column":1,"offset":2748},"end":{"line":92,"column":22,"offset":2769},"indent":[]}}],"position":{"start":{"line":92,"column":1,"offset":2748},"end":{"line":92,"column":22,"offset":2769},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":94,"column":1,"offset":2771},"end":{"line":99,"column":22,"offset":2895},"indent":[1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":102,"column":1,"offset":2898},"end":{"line":102,"column":31,"offset":2928},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":102,"column":31,"offset":2928}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-abdbdd22858253fb0a31a491bb2c35bd.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-abdbdd22858253fb0a31a491bb2c35bd.json new file mode 100644 index 0000000..3a5b4bf --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-abdbdd22858253fb0a31a491bb2c35bd.json @@ -0,0 +1 @@ +{"expireTime":9007200838830716000,"key":"gatsby-plugin-mdx-entire-payload-5c2edddb4270b38bb330616d7e278995-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"## Global Docker image parameters\n## Please, note that this will override the image parameters, including dependencies, configured to use the global value\n## Current available global Docker image parameters: imageRegistry and imagePullSecrets\n##\n# global:\n# imageRegistry: myRegistryName\n# imagePullSecrets:\n# - myRegistryKeySecretName\n# storageClass: myStorageClass\n\nimage:\n ## Bitnami MongoDB registry\n ##\n registry: docker.io\n ## Bitnami MongoDB image name\n ##\n repository: bitnami/mongodb\n ## Bitnami MongoDB image tag\n ## ref: https://hub.docker.com/r/bitnami/mongodb/tags/\n ##\n tag: 4.2.3-debian-10-r31\n ## Specify a imagePullPolicy\n ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n ##\n pullPolicy: IfNotPresent\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n\n ## Set to true if you would like to see extra information on logs\n ## It turns on Bitnami debugging in minideb-extras-base\n ## ref: https://github.com/bitnami/minideb-extras-base\n debug: false\n\n## String to partially override mongodb.fullname template (will maintain the release name)\n##\n# nameOverride:\n\n## String to fully override mongodb.fullname template\n##\n# fullnameOverride:\n\n# Add custom extra environment variables to all the MongoDB containers\n# extraEnvVars:\n\n## Init containers parameters:\n## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.\n##\nvolumePermissions:\n enabled: false\n image:\n registry: docker.io\n repository: bitnami/minideb\n tag: buster\n pullPolicy: Always\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n resources: {}\n\n## Enable authentication\n## ref: https://docs.mongodb.com/manual/tutorial/enable-authentication/\n#\nusePassword: true\n# existingSecret: name-of-existing-secret\n\n## MongoDB admin password\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#setting-the-root-password-on-first-run\n##\nmongodbRootPassword: 9832sfascvn31\n\n## MongoDB custom user and database\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#creating-a-user-and-database-on-first-run\n##\n# mongodbUsername: username\n# mongodbPassword: password\n# mongodbDatabase: database\n\n## Whether enable/disable IPv6 on MongoDB\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-ipv6\n##\nmongodbEnableIPv6: false\n\n## Whether enable/disable DirectoryPerDB on MongoDB\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-directoryperdb\n##\nmongodbDirectoryPerDB: false\n\n## MongoDB System Log configuration\n## ref: https://github.com/bitnami/bitnami-docker-mongodb#configuring-system-log-verbosity-level\n##\nmongodbSystemLogVerbosity: 0\nmongodbDisableSystemLog: false\n\n## MongoDB additional command line flags\n##\n## Can be used to specify command line flags, for example:\n##\n## mongodbExtraFlags:\n## - \"--wiredTigerCacheSizeGB=2\"\nmongodbExtraFlags: []\n\n## Pod Security Context\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n##\nsecurityContext:\n enabled: true\n fsGroup: 1001\n runAsUser: 1001\n\n## Kubernetes Cluster Domain\nclusterDomain: cluster.local\n\n## Kubernetes service type\nservice:\n ## Specify an explicit service name.\n # name: svc-mongo\n ## Provide any additional annotations which may be required.\n ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart\n annotations: {}\n type: ClusterIP\n # clusterIP: None\n port: 27017\n\n ## Specify the nodePort value for the LoadBalancer and NodePort service types.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n ##\n # nodePort:\n\n ## Specify the externalIP value ClusterIP service type.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips\n # externalIPs: []\n\n ## Specify the loadBalancerIP value for LoadBalancer service types.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer\n ##\n # loadBalancerIP:\n\n ## Specify the loadBalancerSourceRanges value for LoadBalancer service types.\n ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service\n ##\n # loadBalancerSourceRanges: []\n\n## Use StatefulSet instead of Deployment when deploying standalone\nuseStatefulSet: false\n\n## Setting up replication\n## ref: https://github.com/bitnami/bitnami-docker-mongodb#setting-up-a-replication\n#\nreplicaSet:\n ## Whether to create a MongoDB replica set for high availability or not\n enabled: false\n useHostnames: true\n\n ## Name of the replica set\n ##\n name: rs0\n\n ## Key used for replica set authentication\n ##\n # key: key\n\n ## Number of replicas per each node type\n ##\n replicas:\n secondary: 0\n arbiter: 0\n\n ## Pod Disruption Budget\n ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/\n pdb:\n enabled: false\n minAvailable:\n secondary: 1\n arbiter: 1\n # maxUnavailable:\n # secondary: 1\n # arbiter: 1\n\n# Annotations to be added to the deployment or statefulsets\nannotations: {}\n\n# Additional labels to apply to the deployment or statefulsets\nlabels: {}\n\n# Annotations to be added to MongoDB pods\npodAnnotations: {}\n\n# Additional pod labels to apply\npodLabels: {}\n\n## Use an alternate scheduler, e.g. \"stork\".\n## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n##\n# schedulerName:\n\n## Configure resource requests and limits\n## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n##\nresources: {}\n# Define separate resources per arbiter, which are less then primary or secondary\n# used only when replica set is enabled\nresourcesArbiter: {}\n# limits:\n# cpu: 500m\n# memory: 512Mi\n# requests:\n# cpu: 100m\n# memory: 256Mi\n\n## Pod priority\n## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/\n# priorityClassName: \"\"\n\n## Node selector\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector\nnodeSelector: {}\n\n## Affinity\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\naffinity: {}\n# Define separate affinity for arbiter pod\naffinityArbiter: {}\n\n## Tolerations\n## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\ntolerations: []\n\n## Add sidecars to the pod\n##\n## For example:\n## sidecars:\n## - name: your-image-name\n## image: your-image\n## imagePullPolicy: Always\n## ports:\n## - name: portname\n## containerPort: 1234\nsidecars: []\n## Array to add extra volumes\n##\nextraVolumes: []\n## Array to add extra mounts (normally used with extraVolumes)\n##\nextraVolumeMounts: []\n\n## Add sidecars to the arbiter pod\n# used only when replica set is enabled\n##\n## For example:\n## sidecars:\n## - name: your-image-name\n## image: your-image\n## imagePullPolicy: Always\n## ports:\n## - name: portname\n## containerPort: 1234\nsidecarsArbiter: []\n## Array to add extra volumes to the arbiter\n# used only when replica set is enabled\n##\nextraVolumesArbiter: []\n## Array to add extra mounts (normally used with extraVolumes) to the arbiter\n# used only when replica set is enabled\n##\nextraVolumeMountsArbiter: []\n\n## updateStrategy for MongoDB Primary, Secondary and Arbitrer statefulsets\n## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies\nupdateStrategy:\n type: RollingUpdate\n\n## Enable persistence using Persistent Volume Claims\n## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/\n##\npersistence:\n enabled: true\n ## A manually managed Persistent Volume and Claim\n ## Requires persistence.enabled: true\n ## If defined, PVC must be created manually before volume will be bound\n ##\n # existingClaim:\n\n ## The path the volume will be mounted at, useful when using different\n ## MongoDB images.\n ##\n mountPath: /bitnami/mongodb\n\n ## The subdirectory of the volume to mount to, useful in dev environments\n ## and one PV for multiple services.\n ##\n subPath: \"\"\n\n ## mongodb data Persistent Volume Storage Class\n ## If defined, storageClassName: \n ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning\n ## If undefined (the default) or set to null, no storageClassName spec is\n ## set, choosing the default provisioner. (gp2 on AWS, standard on\n ## GKE, AWS & OpenStack)\n ##\n # storageClass: \"-\"\n accessModes:\n - ReadWriteOnce\n size: 8Gi\n annotations: {}\n\n## Configure the ingress resource that allows you to access the\n## MongoDB installation. Set up the URL\n## ref: http://kubernetes.io/docs/user-guide/ingress/\n##\ningress:\n ## Set to true to enable ingress record generation\n enabled: false\n\n ## Set this to true in order to add the corresponding annotations for cert-manager\n certManager: false\n\n ## Ingress annotations done as key:value pairs\n ## For a full list of possible ingress annotations, please see\n ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md\n ##\n ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: \"true\" will automatically be set\n ## If certManager is set to true, annotation kubernetes.io/tls-acme: \"true\" will automatically be set\n annotations:\n # kubernetes.io/ingress.class: nginx\n\n ## The list of hostnames to be covered with this ingress record.\n ## Most likely this will be just one host, but in the event more hosts are needed, this is an array\n hosts:\n - name: mongodb.local\n path: /\n\n ## The tls configuration for the ingress\n ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n tls:\n - hosts:\n - mongodb.local\n secretName: mongodb.local-tls\n\n secrets:\n ## If you're providing your own certificates, please use this to add the certificates as secrets\n ## key and certificate should start with -----BEGIN CERTIFICATE----- or\n ## -----BEGIN RSA PRIVATE KEY-----\n ##\n ## name should line up with a tlsSecret set further up\n ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set\n ##\n ## It is also possible to create and manage the certificates outside of this helm chart\n ## Please see README.md for more information\n # - name: airflow.local-tls\n # key:\n # certificate:\n\n## Configure the options for init containers to be run before the main app containers\n## are started. All init containers are run sequentially and must exit without errors\n## for the next one to be started.\n## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\n# extraInitContainers: |\n# - name: do-something\n# image: busybox\n# command: ['do', 'something']\n\n## Configure extra options for liveness and readiness probes\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)\nlivenessProbe:\n enabled: true\n initialDelaySeconds: 30\n periodSeconds: 10\n timeoutSeconds: 5\n failureThreshold: 6\n successThreshold: 1\nreadinessProbe:\n enabled: true\n initialDelaySeconds: 5\n periodSeconds: 10\n timeoutSeconds: 5\n failureThreshold: 6\n successThreshold: 1\n\n# Define custom config map with init scripts\ninitConfigMap: {}\n# name: \"init-config-map\"\n\n## Entries for the MongoDB config file. For documentation of all options, see:\n## http://docs.mongodb.org/manual/reference/configuration-options/\n##\nconfigmap:\n# # where and how to store data.\n# storage:\n# dbPath: /bitnami/mongodb/data/db\n# journal:\n# enabled: true\n# directoryPerDB: false\n# # where to write logging data.\n# systemLog:\n# destination: file\n# quiet: false\n# logAppend: true\n# logRotate: reopen\n# path: /opt/bitnami/mongodb/logs/mongodb.log\n# verbosity: 0\n# # network interfaces\n# net:\n# port: 27017\n# unixDomainSocket:\n# enabled: true\n# pathPrefix: /opt/bitnami/mongodb/tmp\n# ipv6: false\n# bindIpAll: true\n# # replica set options\n# #replication:\n# #replSetName: replicaset\n# #enableMajorityReadConcern: true\n# # process management options\n# processManagement:\n# fork: false\n# pidFilePath: /opt/bitnami/mongodb/tmp/mongodb.pid\n# # set parameter options\n# setParameter:\n# enableLocalhostAuthBypass: true\n# # security options\n# security:\n# authorization: disabled\n# #keyFile: /opt/bitnami/mongodb/conf/keyfile\n\n## Prometheus Exporter / Metrics\n##\nmetrics:\n enabled: true\n\n image:\n registry: docker.io\n repository: bitnami/mongodb-exporter\n tag: 0.10.0-debian-10-r27\n pullPolicy: IfNotPresent\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n\n ## String with extra arguments to the metrics exporter\n ## ref: https://github.com/percona/mongodb_exporter/blob/master/mongodb_exporter.go\n extraArgs: \"\"\n\n ## Metrics exporter resource requests and limits\n ## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n ##\n # resources: {}\n\n ## Metrics exporter liveness and readiness probes\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)\n livenessProbe:\n enabled: true\n initialDelaySeconds: 15\n periodSeconds: 5\n timeoutSeconds: 5\n failureThreshold: 3\n successThreshold: 1\n readinessProbe:\n enabled: true\n initialDelaySeconds: 5\n periodSeconds: 5\n timeoutSeconds: 1\n failureThreshold: 3\n successThreshold: 1\n\n ## Metrics exporter pod Annotation\n podAnnotations:\n prometheus.io/scrape: \"true\"\n prometheus.io/port: \"9216\"\n\n ## Prometheus Service Monitor\n ## ref: https://github.com/coreos/prometheus-operator\n ## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md\n serviceMonitor:\n ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry\n enabled: false\n\n ## Specify a namespace if needed\n # namespace: monitoring\n\n ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec\n additionalLabels: {}\n\n ## Specify Metric Relabellings to add to the scrape endpoint\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint\n # relabellings:\n\n alerting:\n ## Define individual alerting rules as required\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#rulegroup\n ## https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/\n rules: {}\n\n ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Prometheus Rules to work with\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec\n additionalLabels: {}","position":{"start":{"line":115,"column":1,"offset":3500},"end":{"line":620,"column":31,"offset":21023},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":622,"column":4,"offset":21028},"end":{"line":622,"column":11,"offset":21035},"indent":[]}}],"position":{"start":{"line":622,"column":1,"offset":21025},"end":{"line":622,"column":11,"offset":21035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":624,"column":1,"offset":21037},"end":{"line":624,"column":74,"offset":21110},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":624,"column":76,"offset":21112},"end":{"line":624,"column":83,"offset":21119},"indent":[]}}],"position":{"start":{"line":624,"column":74,"offset":21110},"end":{"line":624,"column":85,"offset":21121},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":624,"column":85,"offset":21121},"end":{"line":627,"column":76,"offset":21502},"indent":[1,1,1]}}],"position":{"start":{"line":624,"column":1,"offset":21037},"end":{"line":627,"column":76,"offset":21502},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":629,"column":1,"offset":21504},"end":{"line":629,"column":47,"offset":21550},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":631,"column":1,"offset":21552},"end":{"line":631,"column":26,"offset":21577},"indent":[]}}],"position":{"start":{"line":631,"column":1,"offset":21552},"end":{"line":631,"column":26,"offset":21577},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: factory\nspec:\n replicas: 1\n selector:\n matchLabels:\n app: factory\n minReadySeconds: 10\n strategy:\n type: RollingUpdate\n rollingUpdate:\n maxUnavailable: 1\n maxSurge: 1\n template:\n metadata:\n labels:\n app: factory\n spec:\n containers:\n - name: machinery\n image: cedricvers/factory-buildx:1.0.5\n ports:\n - containerPort: 80\n - containerPort: 8081\n env:\n - name: MACHINERY_VERSION\n value: \"1.0.1\"\n - name: FACTORY_ENVIRONMENT\n value: \"kubernetes\"\n - name: FACTORY_PWD\n value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"\n - name: MONGODB_HOST\n value: \"mongodb\"\n - name: MONGODB_DATABASE_CREDENTIALS\n value: \"admin\"\n - name: MONGODB_USERNAME\n value: \"root\"\n - name: MONGODB_PASSWORD\n value: \"9832sfascvn31\"\n - name: MQTT_URL\n value: \"tcp://127.0.0.1:1883\"\n - name: MQTT_USERNAME\n value: \"\"\n - name: MQTT_PASSWORD\n value: \"\"\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: factory\n labels:\n app: factory\nspec:\n ports:\n - port: 80\n targetPort: 80\n name: frontend\n protocol: TCP\n - port: 8081\n name: backend\n targetPort: 8081\n protocol: TCP\n selector:\n app: factory\n---\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n name: factory\n annotations:\n kubernetes.io/ingress.class: traefik\nspec:\n rules:\n - host: factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 80\n - host: api.factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 8081","position":{"start":{"line":633,"column":1,"offset":21579},"end":{"line":721,"column":32,"offset":23773},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Running","position":{"start":{"line":723,"column":3,"offset":23777},"end":{"line":723,"column":10,"offset":23784},"indent":[]}}],"position":{"start":{"line":723,"column":1,"offset":23775},"end":{"line":723,"column":10,"offset":23784},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":725,"column":1,"offset":23786},"end":{"line":725,"column":94,"offset":23879},"indent":[]}}],"position":{"start":{"line":725,"column":1,"offset":23786},"end":{"line":725,"column":94,"offset":23879},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":727,"column":5,"offset":23885},"end":{"line":727,"column":12,"offset":23892},"indent":[]}}],"position":{"start":{"line":727,"column":5,"offset":23885},"end":{"line":727,"column":12,"offset":23892},"indent":[]}}],"position":{"start":{"line":727,"column":1,"offset":23881},"end":{"line":727,"column":12,"offset":23892},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":728,"column":5,"offset":23897},"end":{"line":728,"column":12,"offset":23904},"indent":[]}}],"position":{"start":{"line":728,"column":5,"offset":23897},"end":{"line":728,"column":12,"offset":23904},"indent":[]}}],"position":{"start":{"line":728,"column":1,"offset":23893},"end":{"line":728,"column":12,"offset":23904},"indent":[]}}],"position":{"start":{"line":727,"column":1,"offset":23881},"end":{"line":728,"column":12,"offset":23904},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":731,"column":1,"offset":23907},"end":{"line":731,"column":31,"offset":23937},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":731,"column":31,"offset":23937}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`## Global Docker image parameters`}{`\n`}{`## Please, note that this will override the image parameters, including dependencies, configured to use the global value`}{`\n`}{`## Current available global Docker image parameters: imageRegistry and imagePullSecrets`}{`\n`}{`##`}{`\n`}{`# global:`}{`\n`}{`#   imageRegistry: myRegistryName`}{`\n`}{`#   imagePullSecrets:`}{`\n`}{`#     - myRegistryKeySecretName`}{`\n`}{`#   storageClass: myStorageClass`}{`\n`}{`\n`}{`image:`}{`\n`}{`  ## Bitnami MongoDB registry`}{`\n`}{`  ##`}{`\n`}{`  registry: docker.io`}{`\n`}{`  ## Bitnami MongoDB image name`}{`\n`}{`  ##`}{`\n`}{`  repository: bitnami/mongodb`}{`\n`}{`  ## Bitnami MongoDB image tag`}{`\n`}{`  ## ref: https://hub.docker.com/r/bitnami/mongodb/tags/`}{`\n`}{`  ##`}{`\n`}{`  tag: 4.2.3-debian-10-r31`}{`\n`}{`  ## Specify a imagePullPolicy`}{`\n`}{`  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images`}{`\n`}{`  ##`}{`\n`}{`  pullPolicy: IfNotPresent`}{`\n`}{`  ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`  ## Secrets must be manually created in the namespace.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`  ##`}{`\n`}{`  # pullSecrets:`}{`\n`}{`  #   - myRegistryKeySecretName`}{`\n`}{`\n`}{`  ## Set to true if you would like to see extra information on logs`}{`\n`}{`  ## It turns on Bitnami debugging in minideb-extras-base`}{`\n`}{`  ## ref:  https://github.com/bitnami/minideb-extras-base`}{`\n`}{`  debug: false`}{`\n`}{`\n`}{`## String to partially override mongodb.fullname template (will maintain the release name)`}{`\n`}{`##`}{`\n`}{`# nameOverride:`}{`\n`}{`\n`}{`## String to fully override mongodb.fullname template`}{`\n`}{`##`}{`\n`}{`# fullnameOverride:`}{`\n`}{`\n`}{`# Add custom extra environment variables to all the MongoDB containers`}{`\n`}{`# extraEnvVars:`}{`\n`}{`\n`}{`## Init containers parameters:`}{`\n`}{`## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.`}{`\n`}{`##`}{`\n`}{`volumePermissions:`}{`\n`}{`  enabled: false`}{`\n`}{`  image:`}{`\n`}{`    registry: docker.io`}{`\n`}{`    repository: bitnami/minideb`}{`\n`}{`    tag: buster`}{`\n`}{`    pullPolicy: Always`}{`\n`}{`    ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`    ## Secrets must be manually created in the namespace.`}{`\n`}{`    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`    ##`}{`\n`}{`    # pullSecrets:`}{`\n`}{`    #   - myRegistryKeySecretName`}{`\n`}{`  resources: {}`}{`\n`}{`\n`}{`## Enable authentication`}{`\n`}{`## ref: https://docs.mongodb.com/manual/tutorial/enable-authentication/`}{`\n`}{`#`}{`\n`}{`usePassword: true`}{`\n`}{`# existingSecret: name-of-existing-secret`}{`\n`}{`\n`}{`## MongoDB admin password`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#setting-the-root-password-on-first-run`}{`\n`}{`##`}{`\n`}{`mongodbRootPassword: 9832sfascvn31`}{`\n`}{`\n`}{`## MongoDB custom user and database`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#creating-a-user-and-database-on-first-run`}{`\n`}{`##`}{`\n`}{`# mongodbUsername: username`}{`\n`}{`# mongodbPassword: password`}{`\n`}{`# mongodbDatabase: database`}{`\n`}{`\n`}{`## Whether enable/disable IPv6 on MongoDB`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-ipv6`}{`\n`}{`##`}{`\n`}{`mongodbEnableIPv6: false`}{`\n`}{`\n`}{`## Whether enable/disable DirectoryPerDB on MongoDB`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-directoryperdb`}{`\n`}{`##`}{`\n`}{`mongodbDirectoryPerDB: false`}{`\n`}{`\n`}{`## MongoDB System Log configuration`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb#configuring-system-log-verbosity-level`}{`\n`}{`##`}{`\n`}{`mongodbSystemLogVerbosity: 0`}{`\n`}{`mongodbDisableSystemLog: false`}{`\n`}{`\n`}{`## MongoDB additional command line flags`}{`\n`}{`##`}{`\n`}{`## Can be used to specify command line flags, for example:`}{`\n`}{`##`}{`\n`}{`## mongodbExtraFlags:`}{`\n`}{`##  - \"--wiredTigerCacheSizeGB=2\"`}{`\n`}{`mongodbExtraFlags: []`}{`\n`}{`\n`}{`## Pod Security Context`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/`}{`\n`}{`##`}{`\n`}{`securityContext:`}{`\n`}{`  enabled: true`}{`\n`}{`  fsGroup: 1001`}{`\n`}{`  runAsUser: 1001`}{`\n`}{`\n`}{`## Kubernetes Cluster Domain`}{`\n`}{`clusterDomain: cluster.local`}{`\n`}{`\n`}{`## Kubernetes service type`}{`\n`}{`service:`}{`\n`}{`  ## Specify an explicit service name.`}{`\n`}{`  # name: svc-mongo`}{`\n`}{`  ## Provide any additional annotations which may be required.`}{`\n`}{`  ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart`}{`\n`}{`  annotations: {}`}{`\n`}{`  type: ClusterIP`}{`\n`}{`  # clusterIP: None`}{`\n`}{`  port: 27017`}{`\n`}{`\n`}{`  ## Specify the nodePort value for the LoadBalancer and NodePort service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport`}{`\n`}{`  ##`}{`\n`}{`  # nodePort:`}{`\n`}{`\n`}{`  ## Specify the externalIP value ClusterIP service type.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips`}{`\n`}{`  # externalIPs: []`}{`\n`}{`\n`}{`  ## Specify the loadBalancerIP value for LoadBalancer service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer`}{`\n`}{`  ##`}{`\n`}{`  # loadBalancerIP:`}{`\n`}{`\n`}{`  ## Specify the loadBalancerSourceRanges value for LoadBalancer service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service`}{`\n`}{`  ##`}{`\n`}{`  # loadBalancerSourceRanges: []`}{`\n`}{`\n`}{`## Use StatefulSet instead of Deployment when deploying standalone`}{`\n`}{`useStatefulSet: false`}{`\n`}{`\n`}{`## Setting up replication`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb#setting-up-a-replication`}{`\n`}{`#`}{`\n`}{`replicaSet:`}{`\n`}{`  ## Whether to create a MongoDB replica set for high availability or not`}{`\n`}{`  enabled: false`}{`\n`}{`  useHostnames: true`}{`\n`}{`\n`}{`  ## Name of the replica set`}{`\n`}{`  ##`}{`\n`}{`  name: rs0`}{`\n`}{`\n`}{`  ## Key used for replica set authentication`}{`\n`}{`  ##`}{`\n`}{`  # key: key`}{`\n`}{`\n`}{`  ## Number of replicas per each node type`}{`\n`}{`  ##`}{`\n`}{`  replicas:`}{`\n`}{`    secondary: 0`}{`\n`}{`    arbiter: 0`}{`\n`}{`\n`}{`  ## Pod Disruption Budget`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/`}{`\n`}{`  pdb:`}{`\n`}{`    enabled: false`}{`\n`}{`    minAvailable:`}{`\n`}{`      secondary: 1`}{`\n`}{`      arbiter: 1`}{`\n`}{`    # maxUnavailable:`}{`\n`}{`      # secondary: 1`}{`\n`}{`      # arbiter: 1`}{`\n`}{`\n`}{`# Annotations to be added to the deployment or statefulsets`}{`\n`}{`annotations: {}`}{`\n`}{`\n`}{`# Additional labels to apply to the deployment or statefulsets`}{`\n`}{`labels: {}`}{`\n`}{`\n`}{`# Annotations to be added to MongoDB pods`}{`\n`}{`podAnnotations: {}`}{`\n`}{`\n`}{`# Additional pod labels to apply`}{`\n`}{`podLabels: {}`}{`\n`}{`\n`}{`## Use an alternate scheduler, e.g. \"stork\".`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/`}{`\n`}{`##`}{`\n`}{`# schedulerName:`}{`\n`}{`\n`}{`## Configure resource requests and limits`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/compute-resources/`}{`\n`}{`##`}{`\n`}{`resources: {}`}{`\n`}{`# Define separate resources per arbiter, which are less then primary or secondary`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`resourcesArbiter: {}`}{`\n`}{`# limits:`}{`\n`}{`#   cpu: 500m`}{`\n`}{`#   memory: 512Mi`}{`\n`}{`# requests:`}{`\n`}{`#   cpu: 100m`}{`\n`}{`#   memory: 256Mi`}{`\n`}{`\n`}{`## Pod priority`}{`\n`}{`## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/`}{`\n`}{`# priorityClassName: \"\"`}{`\n`}{`\n`}{`## Node selector`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector`}{`\n`}{`nodeSelector: {}`}{`\n`}{`\n`}{`## Affinity`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity`}{`\n`}{`affinity: {}`}{`\n`}{`# Define separate affinity for arbiter pod`}{`\n`}{`affinityArbiter: {}`}{`\n`}{`\n`}{`## Tolerations`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/`}{`\n`}{`tolerations: []`}{`\n`}{`\n`}{`## Add sidecars to the pod`}{`\n`}{`##`}{`\n`}{`## For example:`}{`\n`}{`## sidecars:`}{`\n`}{`##   - name: your-image-name`}{`\n`}{`##     image: your-image`}{`\n`}{`##     imagePullPolicy: Always`}{`\n`}{`##     ports:`}{`\n`}{`##       - name: portname`}{`\n`}{`##         containerPort: 1234`}{`\n`}{`sidecars: []`}{`\n`}{`## Array to add extra volumes`}{`\n`}{`##`}{`\n`}{`extraVolumes: []`}{`\n`}{`## Array to add extra mounts (normally used with extraVolumes)`}{`\n`}{`##`}{`\n`}{`extraVolumeMounts: []`}{`\n`}{`\n`}{`## Add sidecars to the arbiter pod`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`## For example:`}{`\n`}{`## sidecars:`}{`\n`}{`##   - name: your-image-name`}{`\n`}{`##     image: your-image`}{`\n`}{`##     imagePullPolicy: Always`}{`\n`}{`##     ports:`}{`\n`}{`##       - name: portname`}{`\n`}{`##         containerPort: 1234`}{`\n`}{`sidecarsArbiter: []`}{`\n`}{`## Array to add extra volumes to the arbiter`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`extraVolumesArbiter: []`}{`\n`}{`## Array to add extra mounts (normally used with extraVolumes) to the arbiter`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`extraVolumeMountsArbiter: []`}{`\n`}{`\n`}{`## updateStrategy for MongoDB Primary, Secondary and Arbitrer statefulsets`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies`}{`\n`}{`updateStrategy:`}{`\n`}{`  type: RollingUpdate`}{`\n`}{`\n`}{`## Enable persistence using Persistent Volume Claims`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/`}{`\n`}{`##`}{`\n`}{`persistence:`}{`\n`}{`  enabled: true`}{`\n`}{`  ## A manually managed Persistent Volume and Claim`}{`\n`}{`  ## Requires persistence.enabled: true`}{`\n`}{`  ## If defined, PVC must be created manually before volume will be bound`}{`\n`}{`  ##`}{`\n`}{`  # existingClaim:`}{`\n`}{`\n`}{`  ## The path the volume will be mounted at, useful when using different`}{`\n`}{`  ## MongoDB images.`}{`\n`}{`  ##`}{`\n`}{`  mountPath: /bitnami/mongodb`}{`\n`}{`\n`}{`  ## The subdirectory of the volume to mount to, useful in dev environments`}{`\n`}{`  ## and one PV for multiple services.`}{`\n`}{`  ##`}{`\n`}{`  subPath: \"\"`}{`\n`}{`\n`}{`  ## mongodb data Persistent Volume Storage Class`}{`\n`}{`  ## If defined, storageClassName: `}{`\n`}{`  ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning`}{`\n`}{`  ## If undefined (the default) or set to null, no storageClassName spec is`}{`\n`}{`  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on`}{`\n`}{`  ##   GKE, AWS & OpenStack)`}{`\n`}{`  ##`}{`\n`}{`  # storageClass: \"-\"`}{`\n`}{`  accessModes:`}{`\n`}{`    - ReadWriteOnce`}{`\n`}{`  size: 8Gi`}{`\n`}{`  annotations: {}`}{`\n`}{`\n`}{`## Configure the ingress resource that allows you to access the`}{`\n`}{`## MongoDB installation. Set up the URL`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/ingress/`}{`\n`}{`##`}{`\n`}{`ingress:`}{`\n`}{`  ## Set to true to enable ingress record generation`}{`\n`}{`  enabled: false`}{`\n`}{`\n`}{`  ## Set this to true in order to add the corresponding annotations for cert-manager`}{`\n`}{`  certManager: false`}{`\n`}{`\n`}{`  ## Ingress annotations done as key:value pairs`}{`\n`}{`  ## For a full list of possible ingress annotations, please see`}{`\n`}{`  ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md`}{`\n`}{`  ##`}{`\n`}{`  ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: \"true\" will automatically be set`}{`\n`}{`  ## If certManager is set to true, annotation kubernetes.io/tls-acme: \"true\" will automatically be set`}{`\n`}{`  annotations:`}{`\n`}{`  #  kubernetes.io/ingress.class: nginx`}{`\n`}{`\n`}{`  ## The list of hostnames to be covered with this ingress record.`}{`\n`}{`  ## Most likely this will be just one host, but in the event more hosts are needed, this is an array`}{`\n`}{`  hosts:`}{`\n`}{`  - name: mongodb.local`}{`\n`}{`    path: /`}{`\n`}{`\n`}{`  ## The tls configuration for the ingress`}{`\n`}{`  ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls`}{`\n`}{`  tls:`}{`\n`}{`  - hosts:`}{`\n`}{`      - mongodb.local`}{`\n`}{`    secretName: mongodb.local-tls`}{`\n`}{`\n`}{`  secrets:`}{`\n`}{`  ## If you're providing your own certificates, please use this to add the certificates as secrets`}{`\n`}{`  ## key and certificate should start with -----BEGIN CERTIFICATE----- or`}{`\n`}{`  ## -----BEGIN RSA PRIVATE KEY-----`}{`\n`}{`  ##`}{`\n`}{`  ## name should line up with a tlsSecret set further up`}{`\n`}{`  ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set`}{`\n`}{`  ##`}{`\n`}{`  ## It is also possible to create and manage the certificates outside of this helm chart`}{`\n`}{`  ## Please see README.md for more information`}{`\n`}{`  # - name: airflow.local-tls`}{`\n`}{`  #   key:`}{`\n`}{`  #   certificate:`}{`\n`}{`\n`}{`## Configure the options for init containers to be run before the main app containers`}{`\n`}{`## are started. All init containers are run sequentially and must exit without errors`}{`\n`}{`## for the next one to be started.`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/`}{`\n`}{`# extraInitContainers: |`}{`\n`}{`#   - name: do-something`}{`\n`}{`#     image: busybox`}{`\n`}{`#     command: ['do', 'something']`}{`\n`}{`\n`}{`## Configure extra options for liveness and readiness probes`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)`}{`\n`}{`livenessProbe:`}{`\n`}{`  enabled: true`}{`\n`}{`  initialDelaySeconds: 30`}{`\n`}{`  periodSeconds: 10`}{`\n`}{`  timeoutSeconds: 5`}{`\n`}{`  failureThreshold: 6`}{`\n`}{`  successThreshold: 1`}{`\n`}{`readinessProbe:`}{`\n`}{`  enabled: true`}{`\n`}{`  initialDelaySeconds: 5`}{`\n`}{`  periodSeconds: 10`}{`\n`}{`  timeoutSeconds: 5`}{`\n`}{`  failureThreshold: 6`}{`\n`}{`  successThreshold: 1`}{`\n`}{`\n`}{`# Define custom config map with init scripts`}{`\n`}{`initConfigMap: {}`}{`\n`}{`#  name: \"init-config-map\"`}{`\n`}{`\n`}{`## Entries for the MongoDB config file. For documentation of all options, see:`}{`\n`}{`##   http://docs.mongodb.org/manual/reference/configuration-options/`}{`\n`}{`##`}{`\n`}{`configmap:`}{`\n`}{`#  # where and how to store data.`}{`\n`}{`#  storage:`}{`\n`}{`#    dbPath: /bitnami/mongodb/data/db`}{`\n`}{`#    journal:`}{`\n`}{`#      enabled: true`}{`\n`}{`#    directoryPerDB: false`}{`\n`}{`#  # where to write logging data.`}{`\n`}{`#  systemLog:`}{`\n`}{`#    destination: file`}{`\n`}{`#    quiet: false`}{`\n`}{`#    logAppend: true`}{`\n`}{`#    logRotate: reopen`}{`\n`}{`#    path: /opt/bitnami/mongodb/logs/mongodb.log`}{`\n`}{`#    verbosity: 0`}{`\n`}{`#  # network interfaces`}{`\n`}{`#  net:`}{`\n`}{`#    port: 27017`}{`\n`}{`#    unixDomainSocket:`}{`\n`}{`#      enabled: true`}{`\n`}{`#      pathPrefix: /opt/bitnami/mongodb/tmp`}{`\n`}{`#    ipv6: false`}{`\n`}{`#    bindIpAll: true`}{`\n`}{`#  # replica set options`}{`\n`}{`#  #replication:`}{`\n`}{`#    #replSetName: replicaset`}{`\n`}{`#    #enableMajorityReadConcern: true`}{`\n`}{`#  # process management options`}{`\n`}{`#  processManagement:`}{`\n`}{`#     fork: false`}{`\n`}{`#     pidFilePath: /opt/bitnami/mongodb/tmp/mongodb.pid`}{`\n`}{`#  # set parameter options`}{`\n`}{`#  setParameter:`}{`\n`}{`#     enableLocalhostAuthBypass: true`}{`\n`}{`#  # security options`}{`\n`}{`#  security:`}{`\n`}{`#    authorization: disabled`}{`\n`}{`#    #keyFile: /opt/bitnami/mongodb/conf/keyfile`}{`\n`}{`\n`}{`## Prometheus Exporter / Metrics`}{`\n`}{`##`}{`\n`}{`metrics:`}{`\n`}{`  enabled: true`}{`\n`}{`\n`}{`  image:`}{`\n`}{`    registry: docker.io`}{`\n`}{`    repository: bitnami/mongodb-exporter`}{`\n`}{`    tag: 0.10.0-debian-10-r27`}{`\n`}{`    pullPolicy: IfNotPresent`}{`\n`}{`    ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`    ## Secrets must be manually created in the namespace.`}{`\n`}{`    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`    ##`}{`\n`}{`    # pullSecrets:`}{`\n`}{`    #   - myRegistryKeySecretName`}{`\n`}{`\n`}{`  ## String with extra arguments to the metrics exporter`}{`\n`}{`  ## ref: https://github.com/percona/mongodb_exporter/blob/master/mongodb_exporter.go`}{`\n`}{`  extraArgs: \"\"`}{`\n`}{`\n`}{`  ## Metrics exporter resource requests and limits`}{`\n`}{`  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/`}{`\n`}{`  ##`}{`\n`}{`  # resources: {}`}{`\n`}{`\n`}{`  ## Metrics exporter liveness and readiness probes`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)`}{`\n`}{`  livenessProbe:`}{`\n`}{`    enabled: true`}{`\n`}{`    initialDelaySeconds: 15`}{`\n`}{`    periodSeconds: 5`}{`\n`}{`    timeoutSeconds: 5`}{`\n`}{`    failureThreshold: 3`}{`\n`}{`    successThreshold: 1`}{`\n`}{`  readinessProbe:`}{`\n`}{`    enabled: true`}{`\n`}{`    initialDelaySeconds: 5`}{`\n`}{`    periodSeconds: 5`}{`\n`}{`    timeoutSeconds: 1`}{`\n`}{`    failureThreshold: 3`}{`\n`}{`    successThreshold: 1`}{`\n`}{`\n`}{`  ## Metrics exporter pod Annotation`}{`\n`}{`  podAnnotations:`}{`\n`}{`    prometheus.io/scrape: \"true\"`}{`\n`}{`    prometheus.io/port: \"9216\"`}{`\n`}{`\n`}{`  ## Prometheus Service Monitor`}{`\n`}{`  ## ref: https://github.com/coreos/prometheus-operator`}{`\n`}{`  ##      https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md`}{`\n`}{`  serviceMonitor:`}{`\n`}{`    ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry`}{`\n`}{`    enabled: false`}{`\n`}{`\n`}{`    ## Specify a namespace if needed`}{`\n`}{`    # namespace: monitoring`}{`\n`}{`\n`}{`    ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with`}{`\n`}{`    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec`}{`\n`}{`    additionalLabels: {}`}{`\n`}{`\n`}{`    ## Specify Metric Relabellings to add to the scrape endpoint`}{`\n`}{`    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint`}{`\n`}{`    # relabellings:`}{`\n`}{`\n`}{`    alerting:`}{`\n`}{`      ## Define individual alerting rules as required`}{`\n`}{`      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#rulegroup`}{`\n`}{`      ##      https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/`}{`\n`}{`      rules: {}`}{`\n`}{`\n`}{`      ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Prometheus Rules to work with`}{`\n`}{`      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec`}{`\n`}{`      additionalLabels: {}`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`apiVersion: apps/v1`}{`\n`}{`kind: Deployment`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`spec:`}{`\n`}{`  replicas: 1`}{`\n`}{`  selector:`}{`\n`}{`    matchLabels:`}{`\n`}{`      app: factory`}{`\n`}{`  minReadySeconds: 10`}{`\n`}{`  strategy:`}{`\n`}{`    type: RollingUpdate`}{`\n`}{`    rollingUpdate:`}{`\n`}{`      maxUnavailable: 1`}{`\n`}{`      maxSurge: 1`}{`\n`}{`  template:`}{`\n`}{`    metadata:`}{`\n`}{`      labels:`}{`\n`}{`        app: factory`}{`\n`}{`    spec:`}{`\n`}{`      containers:`}{`\n`}{`      - name: machinery`}{`\n`}{`        image: cedricvers/factory-buildx:1.0.5`}{`\n`}{`        ports:`}{`\n`}{`          - containerPort: 80`}{`\n`}{`          - containerPort: 8081`}{`\n`}{`        env:`}{`\n`}{`        - name: MACHINERY_VERSION`}{`\n`}{`          value: \"1.0.1\"`}{`\n`}{`        - name: FACTORY_ENVIRONMENT`}{`\n`}{`          value: \"kubernetes\"`}{`\n`}{`        - name: FACTORY_PWD`}{`\n`}{`          value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"`}{`\n`}{`        - name: MONGODB_HOST`}{`\n`}{`          value: \"mongodb\"`}{`\n`}{`        - name: MONGODB_DATABASE_CREDENTIALS`}{`\n`}{`          value: \"admin\"`}{`\n`}{`        - name: MONGODB_USERNAME`}{`\n`}{`          value: \"root\"`}{`\n`}{`        - name: MONGODB_PASSWORD`}{`\n`}{`          value: \"9832sfascvn31\"`}{`\n`}{`        - name: MQTT_URL`}{`\n`}{`          value: \"tcp://127.0.0.1:1883\"`}{`\n`}{`        - name: MQTT_USERNAME`}{`\n`}{`          value: \"\"`}{`\n`}{`        - name: MQTT_PASSWORD`}{`\n`}{`          value: \"\"`}{`\n`}{`---`}{`\n`}{`apiVersion: v1`}{`\n`}{`kind: Service`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  labels:`}{`\n`}{`    app: factory`}{`\n`}{`spec:`}{`\n`}{`  ports:`}{`\n`}{`  - port: 80`}{`\n`}{`    targetPort: 80`}{`\n`}{`    name: frontend`}{`\n`}{`    protocol: TCP`}{`\n`}{`  - port: 8081`}{`\n`}{`    name: backend`}{`\n`}{`    targetPort: 8081`}{`\n`}{`    protocol: TCP`}{`\n`}{`  selector:`}{`\n`}{`    app: factory`}{`\n`}{`---`}{`\n`}{`apiVersion: extensions/v1beta1`}{`\n`}{`kind: Ingress`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  annotations:`}{`\n`}{`    kubernetes.io/ingress.class: traefik`}{`\n`}{`spec:`}{`\n`}{`  rules:`}{`\n`}{`  - host: factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 80`}{`\n`}{`  - host: api.factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 8081`}
\n

{`Running`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ac8eb4fb515f4efca4465f0896385c04.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ac8eb4fb515f4efca4465f0896385c04.json new file mode 100644 index 0000000..d4bc462 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ac8eb4fb515f4efca4465f0896385c04.json @@ -0,0 +1 @@ +{"expireTime":9007200838769371000,"key":"gatsby-plugin-mdx-entire-payload-8b7ebb76d7ebd6800abf51e7ac0a71a6-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":73,"column":1,"offset":2191},"end":{"line":84,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":87,"column":1,"offset":2495},"end":{"line":87,"column":31,"offset":2525},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":87,"column":31,"offset":2525}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-acc08a461b9ec5aa0f2601269984dbc9.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-acc08a461b9ec5aa0f2601269984dbc9.json new file mode 100644 index 0000000..8489f1f --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-acc08a461b9ec5aa0f2601269984dbc9.json @@ -0,0 +1 @@ +{"expireTime":9007200838825035000,"key":"gatsby-plugin-mdx-entire-payload-d8b688284a5b266d96d293c238636734-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":113,"column":4,"offset":3479},"end":{"line":113,"column":11,"offset":3486},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":11,"offset":3486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":115,"column":1,"offset":3488},"end":{"line":115,"column":74,"offset":3561},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":115,"column":76,"offset":3563},"end":{"line":115,"column":83,"offset":3570},"indent":[]}}],"position":{"start":{"line":115,"column":74,"offset":3561},"end":{"line":115,"column":85,"offset":3572},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":115,"column":85,"offset":3572},"end":{"line":118,"column":76,"offset":3953},"indent":[1,1,1]}}],"position":{"start":{"line":115,"column":1,"offset":3488},"end":{"line":118,"column":76,"offset":3953},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":120,"column":1,"offset":3955},"end":{"line":120,"column":47,"offset":4001},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":122,"column":1,"offset":4003},"end":{"line":122,"column":26,"offset":4028},"indent":[]}}],"position":{"start":{"line":122,"column":1,"offset":4003},"end":{"line":122,"column":26,"offset":4028},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: factory\nspec:\n replicas: 1\n selector:\n matchLabels:\n app: factory\n minReadySeconds: 10\n strategy:\n type: RollingUpdate\n rollingUpdate:\n maxUnavailable: 1\n maxSurge: 1\n template:\n metadata:\n labels:\n app: factory\n spec:\n containers:\n - name: machinery\n image: cedricvers/factory-buildx:1.0.5\n ports:\n - containerPort: 80\n - containerPort: 8081\n env:\n - name: MACHINERY_VERSION\n value: \"1.0.1\"\n - name: FACTORY_ENVIRONMENT\n value: \"kubernetes\"\n - name: FACTORY_PWD\n value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"\n - name: MONGODB_HOST\n value: \"mongodb\"\n - name: MONGODB_DATABASE_CREDENTIALS\n value: \"admin\"\n - name: MONGODB_USERNAME\n value: \"root\"\n - name: MONGODB_PASSWORD\n value: \"9832sfascvn31\"\n - name: MQTT_URL\n value: \"tcp://127.0.0.1:1883\"\n - name: MQTT_USERNAME\n value: \"\"\n - name: MQTT_PASSWORD\n value: \"\"\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: factory\n labels:\n app: factory\nspec:\n ports:\n - port: 80\n targetPort: 80\n name: frontend\n protocol: TCP\n - port: 8081\n name: backend\n targetPort: 8081\n protocol: TCP\n selector:\n app: factory\n---\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n name: factory\n annotations:\n kubernetes.io/ingress.class: traefik\nspec:\n rules:\n - host: factory.verstraeten.io\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 80\n - host: api.factory.verstraeten.io\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 8081","position":{"start":{"line":124,"column":1,"offset":4030},"end":{"line":212,"column":32,"offset":6232},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":215,"column":1,"offset":6235},"end":{"line":215,"column":31,"offset":6265},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":215,"column":31,"offset":6265}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`apiVersion: apps/v1`}{`\n`}{`kind: Deployment`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`spec:`}{`\n`}{`  replicas: 1`}{`\n`}{`  selector:`}{`\n`}{`    matchLabels:`}{`\n`}{`      app: factory`}{`\n`}{`  minReadySeconds: 10`}{`\n`}{`  strategy:`}{`\n`}{`    type: RollingUpdate`}{`\n`}{`    rollingUpdate:`}{`\n`}{`      maxUnavailable: 1`}{`\n`}{`      maxSurge: 1`}{`\n`}{`  template:`}{`\n`}{`    metadata:`}{`\n`}{`      labels:`}{`\n`}{`        app: factory`}{`\n`}{`    spec:`}{`\n`}{`      containers:`}{`\n`}{`      - name: machinery`}{`\n`}{`        image: cedricvers/factory-buildx:1.0.5`}{`\n`}{`        ports:`}{`\n`}{`          - containerPort: 80`}{`\n`}{`          - containerPort: 8081`}{`\n`}{`        env:`}{`\n`}{`        - name: MACHINERY_VERSION`}{`\n`}{`          value: \"1.0.1\"`}{`\n`}{`        - name: FACTORY_ENVIRONMENT`}{`\n`}{`          value: \"kubernetes\"`}{`\n`}{`        - name: FACTORY_PWD`}{`\n`}{`          value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"`}{`\n`}{`        - name: MONGODB_HOST`}{`\n`}{`          value: \"mongodb\"`}{`\n`}{`        - name: MONGODB_DATABASE_CREDENTIALS`}{`\n`}{`          value: \"admin\"`}{`\n`}{`        - name: MONGODB_USERNAME`}{`\n`}{`          value: \"root\"`}{`\n`}{`        - name: MONGODB_PASSWORD`}{`\n`}{`          value: \"9832sfascvn31\"`}{`\n`}{`        - name: MQTT_URL`}{`\n`}{`          value: \"tcp://127.0.0.1:1883\"`}{`\n`}{`        - name: MQTT_USERNAME`}{`\n`}{`          value: \"\"`}{`\n`}{`        - name: MQTT_PASSWORD`}{`\n`}{`          value: \"\"`}{`\n`}{`---`}{`\n`}{`apiVersion: v1`}{`\n`}{`kind: Service`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  labels:`}{`\n`}{`    app: factory`}{`\n`}{`spec:`}{`\n`}{`  ports:`}{`\n`}{`  - port: 80`}{`\n`}{`    targetPort: 80`}{`\n`}{`    name: frontend`}{`\n`}{`    protocol: TCP`}{`\n`}{`  - port: 8081`}{`\n`}{`    name: backend`}{`\n`}{`    targetPort: 8081`}{`\n`}{`    protocol: TCP`}{`\n`}{`  selector:`}{`\n`}{`    app: factory`}{`\n`}{`---`}{`\n`}{`apiVersion: extensions/v1beta1`}{`\n`}{`kind: Ingress`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  annotations:`}{`\n`}{`    kubernetes.io/ingress.class: traefik`}{`\n`}{`spec:`}{`\n`}{`  rules:`}{`\n`}{`  - host: factory.verstraeten.io`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 80`}{`\n`}{`  - host: api.factory.verstraeten.io`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 8081`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b68667b1ec646f37bd344f0f4d1fefa2.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b68667b1ec646f37bd344f0f4d1fefa2.json deleted file mode 100644 index 72a5727..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b68667b1ec646f37bd344f0f4d1fefa2.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838684636000,"key":"gatsby-plugin-mdx-entire-payload-4a29ca1abe90a5aa1fe8bf6e2aef5364-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).","position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":223,"offset":1710},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Cloud or on premise","position":{"start":{"line":26,"column":4,"offset":1715},"end":{"line":26,"column":23,"offset":1734},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1712},"end":{"line":26,"column":23,"offset":1734},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster. This means that whatever security policy you have, you can run it where you want.","position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":193,"offset":1928},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":1736},"end":{"line":28,"column":193,"offset":1928},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes-cloud.png","alt":"architecture kubernetes","position":{"start":{"line":30,"column":1,"offset":1930},"end":{"line":30,"column":97,"offset":2026},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":1930},"end":{"line":30,"column":97,"offset":2026},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Licensing","position":{"start":{"line":32,"column":4,"offset":2031},"end":{"line":32,"column":13,"offset":2040},"indent":[]}}],"position":{"start":{"line":32,"column":1,"offset":2028},"end":{"line":32,"column":13,"offset":2040},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is publicly available but requires a license key to operate correctly. A license key can be requested by contactig ","position":{"start":{"line":34,"column":1,"offset":2042},"end":{"line":34,"column":136,"offset":2177},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"sales@kerberos.io","position":{"start":{"line":34,"column":138,"offset":2179},"end":{"line":34,"column":155,"offset":2196},"indent":[]}}],"position":{"start":{"line":34,"column":136,"offset":2177},"end":{"line":34,"column":157,"offset":2198},"indent":[]}},{"type":"text","value":" for more information.","position":{"start":{"line":34,"column":157,"offset":2198},"end":{"line":34,"column":179,"offset":2220},"indent":[]}}],"position":{"start":{"line":34,"column":1,"offset":2042},"end":{"line":34,"column":179,"offset":2220},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":37,"column":1,"offset":2223},"end":{"line":37,"column":31,"offset":2253},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":37,"column":31,"offset":2253}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n

{`Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal).`}

\n

{`Cloud or on premise`}

\n

{`You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster. This means that whatever security policy you have, you can run it where you want.`}

\n

\"architecture

\n

{`Licensing`}

\n

{`Kerberos Enterprise is publicly available but requires a license key to operate correctly. A license key can be requested by contactig `}{`sales@kerberos.io`}{` for more information.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b7bce085df39548ca4c865835c50c28e.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b7bce085df39548ca4c865835c50c28e.json index 19723a2..7f51d01 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b7bce085df39548ca4c865835c50c28e.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b7bce085df39548ca4c865835c50c28e.json @@ -1 +1 @@ -{"expireTime":9007200838510870000,"key":"gatsby-plugin-mdx-entire-payload-adc4ae920f7585dcde6484ccdff6b63b-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Upgrade","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":10,"offset":168},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":10,"offset":168},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To upgrade your Kerberos agent to a new version you should follow the approach which fits your initial installation method. If you installed KiOS follow the KiOS upgrade procedure, if installed on Raspbian follow the Raspbian upgrade procedure, etc.","position":{"start":{"line":10,"column":1,"offset":170},"end":{"line":10,"column":250,"offset":419},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":170},"end":{"line":10,"column":250,"offset":419},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Please note that it might be possible that some new files are added or existing files were updated. To make sure everything works as expected, you should clear your browser cache.","position":{"start":{"line":12,"column":1,"offset":421},"end":{"line":12,"column":180,"offset":600},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":421},"end":{"line":12,"column":180,"offset":600},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":14,"column":4,"offset":605},"end":{"line":14,"column":8,"offset":609},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":602},"end":{"line":14,"column":8,"offset":609},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you installed KiOS, you can use the built-in upgrade method, ","position":{"start":{"line":16,"column":1,"offset":611},"end":{"line":16,"column":65,"offset":675},"indent":[]}},{"type":"inlineCode","value":"fwupdate","position":{"start":{"line":16,"column":65,"offset":675},"end":{"line":16,"column":75,"offset":685},"indent":[]}},{"type":"text","value":". The ","position":{"start":{"line":16,"column":75,"offset":685},"end":{"line":16,"column":81,"offset":691},"indent":[]}},{"type":"inlineCode","value":"fwupdate","position":{"start":{"line":16,"column":81,"offset":691},"end":{"line":16,"column":91,"offset":701},"indent":[]}},{"type":"text","value":" command is a shell script which contains a couple of functions. For example it allows you to download, extract and flash a new version of KiOS to your SD card. The process is pretty straight forward.","position":{"start":{"line":16,"column":91,"offset":701},"end":{"line":16,"column":291,"offset":901},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":611},"end":{"line":16,"column":291,"offset":901},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"First SSH or connect to KiOS first, and execute following command to see your current version.","position":{"start":{"line":18,"column":1,"offset":903},"end":{"line":18,"column":95,"offset":997},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":903},"end":{"line":18,"column":95,"offset":997},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"fwupdate current","position":{"start":{"line":20,"column":1,"offset":999},"end":{"line":22,"column":4,"offset":1027},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Next look for all available versions of KiOS.","position":{"start":{"line":24,"column":1,"offset":1029},"end":{"line":24,"column":46,"offset":1074},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1029},"end":{"line":24,"column":46,"offset":1074},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"fwupdate versions","position":{"start":{"line":26,"column":1,"offset":1076},"end":{"line":28,"column":4,"offset":1105},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Select the version to which you would like to upgrade, and run following command.","position":{"start":{"line":30,"column":1,"offset":1107},"end":{"line":30,"column":82,"offset":1188},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":1107},"end":{"line":30,"column":82,"offset":1188},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"fwupdate upgrade ","position":{"start":{"line":32,"column":1,"offset":1190},"end":{"line":34,"column":4,"offset":1228},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"KiOS will reboot, and your new version will be available.","position":{"start":{"line":36,"column":1,"offset":1230},"end":{"line":36,"column":58,"offset":1287},"indent":[]}}],"position":{"start":{"line":36,"column":1,"offset":1230},"end":{"line":36,"column":58,"offset":1287},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Raspbian","position":{"start":{"line":38,"column":4,"offset":1292},"end":{"line":38,"column":12,"offset":1300},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":1289},"end":{"line":38,"column":12,"offset":1300},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to install a new version of the Kerberos agent for Raspbian, there is no automated versioning process available like KiOS. To perform an upgrade you'll need to follow the ","position":{"start":{"line":40,"column":1,"offset":1302},"end":{"line":40,"column":184,"offset":1485},"indent":[]}},{"type":"link","title":null,"url":"/opensource/installation#raspbian","children":[{"type":"text","value":"traditional installation","position":{"start":{"line":40,"column":185,"offset":1486},"end":{"line":40,"column":209,"offset":1510},"indent":[]}}],"position":{"start":{"line":40,"column":184,"offset":1485},"end":{"line":40,"column":245,"offset":1546},"indent":[]}},{"type":"text","value":" procedure of Raspbian.","position":{"start":{"line":40,"column":245,"offset":1546},"end":{"line":40,"column":268,"offset":1569},"indent":[]}}],"position":{"start":{"line":40,"column":1,"offset":1302},"end":{"line":40,"column":268,"offset":1569},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Docker","position":{"start":{"line":42,"column":4,"offset":1574},"end":{"line":42,"column":10,"offset":1580},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":1571},"end":{"line":42,"column":10,"offset":1580},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When a new release is available, a new Docker image will be available on the Docker hub. You can simply delete your existing container and image, and download it again.","position":{"start":{"line":44,"column":1,"offset":1582},"end":{"line":44,"column":169,"offset":1750},"indent":[]}}],"position":{"start":{"line":44,"column":1,"offset":1582},"end":{"line":44,"column":169,"offset":1750},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":47,"column":1,"offset":1753},"end":{"line":47,"column":31,"offset":1783},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":47,"column":31,"offset":1783}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Upgrade`}

\n

{`To upgrade your Kerberos agent to a new version you should follow the approach which fits your initial installation method. If you installed KiOS follow the KiOS upgrade procedure, if installed on Raspbian follow the Raspbian upgrade procedure, etc.`}

\n

{`Please note that it might be possible that some new files are added or existing files were updated. To make sure everything works as expected, you should clear your browser cache.`}

\n

{`KiOS`}

\n

{`If you installed KiOS, you can use the built-in upgrade method, `}{`fwupdate`}{`. The `}{`fwupdate`}{` command is a shell script which contains a couple of functions. For example it allows you to download, extract and flash a new version of KiOS to your SD card. The process is pretty straight forward.`}

\n

{`First SSH or connect to KiOS first, and execute following command to see your current version.`}

\n
{`fwupdate current`}
\n

{`Next look for all available versions of KiOS.`}

\n
{`fwupdate versions`}
\n

{`Select the version to which you would like to upgrade, and run following command.`}

\n
{`fwupdate upgrade `}
\n

{`KiOS will reboot, and your new version will be available.`}

\n

{`Raspbian`}

\n

{`If you want to install a new version of the Kerberos agent for Raspbian, there is no automated versioning process available like KiOS. To perform an upgrade you'll need to follow the `}{`traditional installation`}{` procedure of Raspbian.`}

\n

{`Docker`}

\n

{`When a new release is available, a new Docker image will be available on the Docker hub. You can simply delete your existing container and image, and download it again.`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760429000,"key":"gatsby-plugin-mdx-entire-payload-adc4ae920f7585dcde6484ccdff6b63b-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Upgrade","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":10,"offset":168},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":10,"offset":168},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To upgrade your Kerberos agent to a new version you should follow the approach which fits your initial installation method. If you installed KiOS follow the KiOS upgrade procedure, if installed on Raspbian follow the Raspbian upgrade procedure, etc.","position":{"start":{"line":10,"column":1,"offset":170},"end":{"line":10,"column":250,"offset":419},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":170},"end":{"line":10,"column":250,"offset":419},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Please note that it might be possible that some new files are added or existing files were updated. To make sure everything works as expected, you should clear your browser cache.","position":{"start":{"line":12,"column":1,"offset":421},"end":{"line":12,"column":180,"offset":600},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":421},"end":{"line":12,"column":180,"offset":600},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"KiOS","position":{"start":{"line":14,"column":4,"offset":605},"end":{"line":14,"column":8,"offset":609},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":602},"end":{"line":14,"column":8,"offset":609},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you installed KiOS, you can use the built-in upgrade method, ","position":{"start":{"line":16,"column":1,"offset":611},"end":{"line":16,"column":65,"offset":675},"indent":[]}},{"type":"inlineCode","value":"fwupdate","position":{"start":{"line":16,"column":65,"offset":675},"end":{"line":16,"column":75,"offset":685},"indent":[]}},{"type":"text","value":". The ","position":{"start":{"line":16,"column":75,"offset":685},"end":{"line":16,"column":81,"offset":691},"indent":[]}},{"type":"inlineCode","value":"fwupdate","position":{"start":{"line":16,"column":81,"offset":691},"end":{"line":16,"column":91,"offset":701},"indent":[]}},{"type":"text","value":" command is a shell script which contains a couple of functions. For example it allows you to download, extract and flash a new version of KiOS to your SD card. The process is pretty straight forward.","position":{"start":{"line":16,"column":91,"offset":701},"end":{"line":16,"column":291,"offset":901},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":611},"end":{"line":16,"column":291,"offset":901},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"First SSH or connect to KiOS first, and execute following command to see your current version.","position":{"start":{"line":18,"column":1,"offset":903},"end":{"line":18,"column":95,"offset":997},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":903},"end":{"line":18,"column":95,"offset":997},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"fwupdate current","position":{"start":{"line":20,"column":1,"offset":999},"end":{"line":22,"column":4,"offset":1027},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Next look for all available versions of KiOS.","position":{"start":{"line":24,"column":1,"offset":1029},"end":{"line":24,"column":46,"offset":1074},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1029},"end":{"line":24,"column":46,"offset":1074},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"fwupdate versions","position":{"start":{"line":26,"column":1,"offset":1076},"end":{"line":28,"column":4,"offset":1105},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Select the version to which you would like to upgrade, and run following command.","position":{"start":{"line":30,"column":1,"offset":1107},"end":{"line":30,"column":82,"offset":1188},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":1107},"end":{"line":30,"column":82,"offset":1188},"indent":[]}},{"type":"code","lang":"bash","meta":null,"value":"fwupdate upgrade ","position":{"start":{"line":32,"column":1,"offset":1190},"end":{"line":34,"column":4,"offset":1228},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"KiOS will reboot, and your new version will be available.","position":{"start":{"line":36,"column":1,"offset":1230},"end":{"line":36,"column":58,"offset":1287},"indent":[]}}],"position":{"start":{"line":36,"column":1,"offset":1230},"end":{"line":36,"column":58,"offset":1287},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Raspbian","position":{"start":{"line":38,"column":4,"offset":1292},"end":{"line":38,"column":12,"offset":1300},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":1289},"end":{"line":38,"column":12,"offset":1300},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to install a new version of the Kerberos agent for Raspbian, there is no automated versioning process available like KiOS. To perform an upgrade you'll need to follow the ","position":{"start":{"line":40,"column":1,"offset":1302},"end":{"line":40,"column":184,"offset":1485},"indent":[]}},{"type":"link","title":null,"url":"/opensource/installation#raspbian","children":[{"type":"text","value":"traditional installation","position":{"start":{"line":40,"column":185,"offset":1486},"end":{"line":40,"column":209,"offset":1510},"indent":[]}}],"position":{"start":{"line":40,"column":184,"offset":1485},"end":{"line":40,"column":245,"offset":1546},"indent":[]}},{"type":"text","value":" procedure of Raspbian.","position":{"start":{"line":40,"column":245,"offset":1546},"end":{"line":40,"column":268,"offset":1569},"indent":[]}}],"position":{"start":{"line":40,"column":1,"offset":1302},"end":{"line":40,"column":268,"offset":1569},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Docker","position":{"start":{"line":42,"column":4,"offset":1574},"end":{"line":42,"column":10,"offset":1580},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":1571},"end":{"line":42,"column":10,"offset":1580},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When a new release is available, a new Docker image will be available on the Docker hub. You can simply delete your existing container and image, and download it again.","position":{"start":{"line":44,"column":1,"offset":1582},"end":{"line":44,"column":169,"offset":1750},"indent":[]}}],"position":{"start":{"line":44,"column":1,"offset":1582},"end":{"line":44,"column":169,"offset":1750},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":47,"column":1,"offset":1753},"end":{"line":47,"column":31,"offset":1783},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":47,"column":31,"offset":1783}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Upgrade`}

\n

{`To upgrade your Kerberos agent to a new version you should follow the approach which fits your initial installation method. If you installed KiOS follow the KiOS upgrade procedure, if installed on Raspbian follow the Raspbian upgrade procedure, etc.`}

\n

{`Please note that it might be possible that some new files are added or existing files were updated. To make sure everything works as expected, you should clear your browser cache.`}

\n

{`KiOS`}

\n

{`If you installed KiOS, you can use the built-in upgrade method, `}{`fwupdate`}{`. The `}{`fwupdate`}{` command is a shell script which contains a couple of functions. For example it allows you to download, extract and flash a new version of KiOS to your SD card. The process is pretty straight forward.`}

\n

{`First SSH or connect to KiOS first, and execute following command to see your current version.`}

\n
{`fwupdate current`}
\n

{`Next look for all available versions of KiOS.`}

\n
{`fwupdate versions`}
\n

{`Select the version to which you would like to upgrade, and run following command.`}

\n
{`fwupdate upgrade `}
\n

{`KiOS will reboot, and your new version will be available.`}

\n

{`Raspbian`}

\n

{`If you want to install a new version of the Kerberos agent for Raspbian, there is no automated versioning process available like KiOS. To perform an upgrade you'll need to follow the `}{`traditional installation`}{` procedure of Raspbian.`}

\n

{`Docker`}

\n

{`When a new release is available, a new Docker image will be available on the Docker hub. You can simply delete your existing container and image, and download it again.`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b7d455e0c2e4a40aab216de5f40db7ac.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b7d455e0c2e4a40aab216de5f40db7ac.json deleted file mode 100644 index dd8fb02..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b7d455e0c2e4a40aab216de5f40db7ac.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838682354000,"key":"gatsby-plugin-mdx-entire-payload-295a87d626b23dea95c9b4577c3ee07c-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide the high availability and fail over requirements our customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and provide a never-seen up and running video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":310,"offset":1385},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":310,"offset":1385},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":23,"column":1,"offset":1388},"end":{"line":23,"column":31,"offset":1418},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":23,"column":31,"offset":1418}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide the high availability and fail over requirements our customers have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and provide a never-seen up and running video surveillance system.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b960f34c777127d0740671b5b4e06ebe.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b960f34c777127d0740671b5b4e06ebe.json deleted file mode 100644 index c29b6d0..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-b960f34c777127d0740671b5b4e06ebe.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838682683000,"key":"gatsby-plugin-mdx-entire-payload-ad99e0b5559c6bac009300c49330f3c3-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-agent-architecture-kubernetes-cloud.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":94,"offset":1489},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":94,"offset":1489},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":25,"column":1,"offset":1492},"end":{"line":25,"column":31,"offset":1522},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":25,"column":31,"offset":1522}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-bae7eec54345dd03dab9de1825c5fb76.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-bae7eec54345dd03dab9de1825c5fb76.json new file mode 100644 index 0000000..65ac460 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-bae7eec54345dd03dab9de1825c5fb76.json @@ -0,0 +1 @@ +{"expireTime":9007200838836902000,"key":"gatsby-plugin-mdx-entire-payload-14b4eb97308314b46211ee627f3c675d-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":107,"column":4,"offset":3144},"end":{"line":107,"column":11,"offset":3151},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":3141},"end":{"line":107,"column":11,"offset":3151},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}}],"position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":112,"column":1,"offset":3398},"end":{"line":112,"column":78,"offset":3475},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":116,"column":1,"offset":3501},"end":{"line":116,"column":8,"offset":3508},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":118,"column":4,"offset":3513},"end":{"line":118,"column":11,"offset":3520},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3510},"end":{"line":118,"column":11,"offset":3520},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":120,"column":74,"offset":3595},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":120,"column":76,"offset":3597},"end":{"line":120,"column":83,"offset":3604},"indent":[]}}],"position":{"start":{"line":120,"column":74,"offset":3595},"end":{"line":120,"column":85,"offset":3606},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":120,"column":85,"offset":3606},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}}],"position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":125,"column":1,"offset":3989},"end":{"line":125,"column":47,"offset":4035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}}],"position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":129,"column":1,"offset":4064},"end":{"line":129,"column":25,"offset":4088},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":131,"column":3,"offset":4092},"end":{"line":131,"column":25,"offset":4114},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":4090},"end":{"line":131,"column":25,"offset":4114},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":135,"column":12,"offset":4222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4223},"end":{"line":136,"column":12,"offset":4234},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4235},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":137,"column":12,"offset":4246},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":141,"column":1,"offset":4275},"end":{"line":145,"column":73,"offset":4587},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":147,"column":4,"offset":4592},"end":{"line":147,"column":21,"offset":4609},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4589},"end":{"line":147,"column":21,"offset":4609},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS. Look for the\nTraefik service, and copy its external ip. Add this IP to your DNS server, so it will resolve your domains:","position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":108,"offset":4839},"indent":[1]}}],"position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":108,"offset":4839},"indent":[1]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"traefik.domain.com (change to your domain)","position":{"start":{"line":152,"column":5,"offset":4845},"end":{"line":152,"column":47,"offset":4887},"indent":[]}}],"position":{"start":{"line":152,"column":5,"offset":4845},"end":{"line":152,"column":47,"offset":4887},"indent":[]}}],"position":{"start":{"line":152,"column":1,"offset":4841},"end":{"line":152,"column":47,"offset":4887},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"factory.domain.com (change to your domain).","position":{"start":{"line":153,"column":5,"offset":4892},"end":{"line":153,"column":48,"offset":4935},"indent":[]}}],"position":{"start":{"line":153,"column":5,"offset":4892},"end":{"line":153,"column":48,"offset":4935},"indent":[]}}],"position":{"start":{"line":153,"column":1,"offset":4888},"end":{"line":153,"column":48,"offset":4935},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"api.factory.domain.com (change to your domain).","position":{"start":{"line":154,"column":5,"offset":4940},"end":{"line":154,"column":52,"offset":4987},"indent":[]}}],"position":{"start":{"line":154,"column":5,"offset":4940},"end":{"line":154,"column":52,"offset":4987},"indent":[]}}],"position":{"start":{"line":154,"column":1,"offset":4936},"end":{"line":154,"column":52,"offset":4987},"indent":[]}}],"position":{"start":{"line":152,"column":1,"offset":4841},"end":{"line":154,"column":52,"offset":4987},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Look for the external ip, by listing the services.","position":{"start":{"line":156,"column":1,"offset":4989},"end":{"line":156,"column":51,"offset":5039},"indent":[]}}],"position":{"start":{"line":156,"column":1,"offset":4989},"end":{"line":156,"column":51,"offset":5039},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":" $ kubectl get svc\n NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n factory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\n kubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\n mongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\n--> traefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h\n traefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":158,"column":1,"offset":5041},"end":{"line":164,"column":109,"offset":5718},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Access the system","position":{"start":{"line":167,"column":4,"offset":5724},"end":{"line":167,"column":21,"offset":5741},"indent":[]}}],"position":{"start":{"line":167,"column":1,"offset":5721},"end":{"line":167,"column":21,"offset":5741},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating","position":{"start":{"line":169,"column":1,"offset":5743},"end":{"line":169,"column":129,"offset":5871},"indent":[]}}],"position":{"start":{"line":169,"column":1,"offset":5743},"end":{"line":169,"column":129,"offset":5871},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":172,"column":1,"offset":5874},"end":{"line":172,"column":31,"offset":5904},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":172,"column":31,"offset":5904}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS. Look for the\nTraefik service, and copy its external ip. Add this IP to your DNS server, so it will resolve your domains:`}

\n
    \n
  • {`traefik.domain.com (change to your domain)`}
  • \n
  • {`factory.domain.com (change to your domain).`}
  • \n
  • {`api.factory.domain.com (change to your domain).`}
  • \n
\n

{`Look for the external ip, by listing the services.`}

\n
{`    $ kubectl get svc`}{`\n`}{`    NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`    factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`    kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`    mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`--> traefik              LoadBalancer   10.0.10.97    34.66.138.141   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`    traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n

{`Access the system`}

\n

{`Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-bf546b931485862eb682f9184213699e.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-bf546b931485862eb682f9184213699e.json deleted file mode 100644 index f54f271..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-bf546b931485862eb682f9184213699e.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838512189000,"key":"gatsby-plugin-mdx-entire-payload-e4bf86689854f720100189bd7afed95f-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. A lot of people and companies started to adopt the system, and requested enhancements.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":10,"column":153,"offset":325},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":10,"column":153,"offset":325},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":13,"column":1,"offset":328},"end":{"line":13,"column":31,"offset":358},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":13,"column":31,"offset":358}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. A lot of people and companies started to adopt the system, and requested enhancements.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c195f4b74e6b73d89724cbf2c59b82ef.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c195f4b74e6b73d89724cbf2c59b82ef.json new file mode 100644 index 0000000..2b59db9 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c195f4b74e6b73d89724cbf2c59b82ef.json @@ -0,0 +1 @@ +{"expireTime":9007200838769980000,"key":"gatsby-plugin-mdx-entire-payload-0adbadd304344b0e3e995bcf1b84fae3-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":73,"column":1,"offset":2191},"end":{"line":84,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":86,"column":4,"offset":2497},"end":{"line":86,"column":11,"offset":2504},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2494},"end":{"line":86,"column":11,"offset":2504},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":89,"column":1,"offset":2507},"end":{"line":89,"column":72,"offset":2578},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":92,"column":1,"offset":2581},"end":{"line":92,"column":31,"offset":2611},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":92,"column":31,"offset":2611}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c1e67df03a7015deafd8b0a4af2b2a31.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c1e67df03a7015deafd8b0a4af2b2a31.json index 3edc0f8..5db355e 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c1e67df03a7015deafd8b0a4af2b2a31.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c1e67df03a7015deafd8b0a4af2b2a31.json @@ -1 +1 @@ -{"expireTime":9007200838510857000,"key":"gatsby-plugin-mdx-entire-payload-47f678153ba3caebb1e488e13b5ce5ff-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Kerberos.io","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":14,"offset":172},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":14,"offset":172},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The ","position":{"start":{"line":10,"column":1,"offset":174},"end":{"line":10,"column":5,"offset":178},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Kerberos(dot)io","position":{"start":{"line":10,"column":7,"offset":180},"end":{"line":10,"column":22,"offset":195},"indent":[]}}],"position":{"start":{"line":10,"column":5,"offset":178},"end":{"line":10,"column":24,"offset":197},"indent":[]}},{"type":"text","value":" project, is a video surveillance solution, which was initiated back in 2014. Over the years it has evolved into a trusted, stable and feature-rich video surveillance system. To set the expectations, watch the video below to understand what it can and can't do. If you want to install Kerberos(dot)io, it's recommended to have a look ","position":{"start":{"line":10,"column":24,"offset":197},"end":{"line":10,"column":358,"offset":531},"indent":[]}},{"type":"link","title":null,"url":"/architectures","children":[{"type":"text","value":"at the architectures page","position":{"start":{"line":10,"column":359,"offset":532},"end":{"line":10,"column":384,"offset":557},"indent":[]}}],"position":{"start":{"line":10,"column":358,"offset":531},"end":{"line":10,"column":401,"offset":574},"indent":[]}},{"type":"text","value":" to find the best solution for your usecase.","position":{"start":{"line":10,"column":401,"offset":574},"end":{"line":10,"column":445,"offset":618},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":174},"end":{"line":10,"column":445,"offset":618},"indent":[]}},{"type":"jsx","value":"
","position":{"start":{"line":12,"column":1,"offset":620},"end":{"line":12,"column":186,"offset":805},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"The name: Kerberos.io","position":{"start":{"line":14,"column":4,"offset":810},"end":{"line":14,"column":25,"offset":831},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":807},"end":{"line":14,"column":25,"offset":831},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Many people are confused, and don't understand why this project is called Kerberos(dot)io. If you've been in the IT world for a while you will notice that Kerberos is already used for the authentication protocol ","position":{"start":{"line":16,"column":1,"offset":833},"end":{"line":16,"column":213,"offset":1045},"indent":[]}},{"type":"link","title":null,"url":"https://en.wikipedia.org/wiki/Kerberos_(protocol)","children":[{"type":"text","value":"Kerberos","position":{"start":{"line":16,"column":214,"offset":1046},"end":{"line":16,"column":222,"offset":1054},"indent":[]}}],"position":{"start":{"line":16,"column":213,"offset":1045},"end":{"line":16,"column":274,"offset":1106},"indent":[]}},{"type":"text","value":".\nWe believe that the name Kerberos(dot)io makes sense for this project as well, with a strong emphasize on the suffix ","position":{"start":{"line":16,"column":274,"offset":1106},"end":{"line":17,"column":118,"offset":1225},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":".io","position":{"start":{"line":17,"column":120,"offset":1227},"end":{"line":17,"column":123,"offset":1230},"indent":[]}}],"position":{"start":{"line":17,"column":118,"offset":1225},"end":{"line":17,"column":125,"offset":1232},"indent":[]}},{"type":"text","value":", which stands for input and output devices (e.g. any type of camera). Kerberos(dot)io can be seen as a kind of security protocol driven by hardware devices such as surveillance cameras. To make writing easier we will from now on, refer to Kerberos instead of Kerberos(dot)io.","position":{"start":{"line":17,"column":125,"offset":1232},"end":{"line":17,"column":401,"offset":1508},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":833},"end":{"line":17,"column":401,"offset":1508},"indent":[1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Why Kerberos","position":{"start":{"line":19,"column":4,"offset":1513},"end":{"line":19,"column":16,"offset":1525},"indent":[]}}],"position":{"start":{"line":19,"column":1,"offset":1510},"end":{"line":19,"column":16,"offset":1525},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"As burglary is very common, we believe that video surveillance is a trivial tool in our daily lifes which helps us to feel a little bit more secure. Responding to this need, a lot of companies have started developing their own video surveillance software in the past few years.","position":{"start":{"line":21,"column":1,"offset":1527},"end":{"line":21,"column":278,"offset":1804},"indent":[]}}],"position":{"start":{"line":21,"column":1,"offset":1527},"end":{"line":21,"column":278,"offset":1804},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Nowadays we have a myriad of expensive cameras, recorders, and software solutions which are mainly outdated and difficult to install and use. Kerberos goal is to solve these problems and to provide every human being or enterprise in this world to have their own ecological, affordable, easy-to-use and innovative surveillance solution. Read more about our strategy here.","position":{"start":{"line":23,"column":1,"offset":1806},"end":{"line":23,"column":371,"offset":2176},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":1806},"end":{"line":23,"column":371,"offset":2176},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"What is Kerberos","position":{"start":{"line":25,"column":4,"offset":2181},"end":{"line":25,"column":20,"offset":2197},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":2178},"end":{"line":25,"column":20,"offset":2197},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos is a video surveillance solution, that uses computer vision algorithms to detect changes, and that can trigger actions (notifications, api, etc). It comes in two flavors, Kerberos Open Source and Kerberos Enterprise. Kerberos can be deployed to any Linux OS, Docker, or cluster such as Kubernetes.","position":{"start":{"line":27,"column":1,"offset":2199},"end":{"line":27,"column":307,"offset":2505},"indent":[]}}],"position":{"start":{"line":27,"column":1,"offset":2199},"end":{"line":27,"column":307,"offset":2505},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"The Kerberos agent","position":{"start":{"line":29,"column":4,"offset":2510},"end":{"line":29,"column":22,"offset":2528},"indent":[]}}],"position":{"start":{"line":29,"column":1,"offset":2507},"end":{"line":29,"column":22,"offset":2528},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you install Kerberos Open Source or Kerberos Enterprise we will refer to it as a Kerberos agent. A Kerberos agent, is a software solution that processes the video stream of a single surveillance camera, makes and visualises recordings and takes actions (for example sending notifications).","position":{"start":{"line":31,"column":1,"offset":2530},"end":{"line":31,"column":295,"offset":2824},"indent":[]}}],"position":{"start":{"line":31,"column":1,"offset":2530},"end":{"line":31,"column":295,"offset":2824},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"How does it work","position":{"start":{"line":33,"column":4,"offset":2829},"end":{"line":33,"column":20,"offset":2845},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":2826},"end":{"line":33,"column":20,"offset":2845},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Kerberos agent comes in two flavors, Open Source and Enterprise. Both versions have a web interface (front-end) and a video processing engine (back-end). The front-end allows a user to modify specific settings and watch recordings in a easy-to-use interface. The back-end is a solution that processes the camera feed with computer vision algorithms to detect motion, and makes recordings and/or execute specific actions. Kerberos supports any type of IP-camera (RTSP/ONVIF), USB (V4L2) and the popular Raspberry Pi camera.","position":{"start":{"line":35,"column":1,"offset":2847},"end":{"line":35,"column":527,"offset":3373},"indent":[]}}],"position":{"start":{"line":35,"column":1,"offset":2847},"end":{"line":35,"column":527,"offset":3373},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Depending on the flavor you choose, you will have to install different components, but the idea as described above remains the same. If you would like to learn more dive deeper in the related sections: ","position":{"start":{"line":37,"column":1,"offset":3375},"end":{"line":37,"column":203,"offset":3577},"indent":[]}},{"type":"link","title":null,"url":"/opensource/introduction","children":[{"type":"text","value":"Open Source","position":{"start":{"line":37,"column":204,"offset":3578},"end":{"line":37,"column":215,"offset":3589},"indent":[]}}],"position":{"start":{"line":37,"column":203,"offset":3577},"end":{"line":37,"column":242,"offset":3616},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":37,"column":242,"offset":3616},"end":{"line":37,"column":244,"offset":3618},"indent":[]}},{"type":"link","title":null,"url":"/enterprise/introduction","children":[{"type":"text","value":"Enterprise","position":{"start":{"line":37,"column":245,"offset":3619},"end":{"line":37,"column":255,"offset":3629},"indent":[]}}],"position":{"start":{"line":37,"column":244,"offset":3618},"end":{"line":37,"column":282,"offset":3656},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":37,"column":282,"offset":3656},"end":{"line":37,"column":283,"offset":3657},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":3375},"end":{"line":37,"column":283,"offset":3657},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Open Source vs Enterprise","position":{"start":{"line":39,"column":4,"offset":3662},"end":{"line":39,"column":29,"offset":3687},"indent":[]}}],"position":{"start":{"line":39,"column":1,"offset":3659},"end":{"line":39,"column":29,"offset":3687},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Kerberos project started as an Open Source project, with a main focus on low-cost devices such as the Raspberry Pi. Later on the Open Source version was bundled inside the Docker technology so that it was easier to distribute. Anyone can use the Open Source version for personal usage.","position":{"start":{"line":41,"column":1,"offset":3689},"end":{"line":41,"column":290,"offset":3978},"indent":[]}}],"position":{"start":{"line":41,"column":1,"offset":3689},"end":{"line":41,"column":290,"offset":3978},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Enterprises are more demanding, and have a lot of surveillance cameras, therefore they need a scalable surveillance system. The Enterprise edition of Kerberos is a licensed service which allows you to operate a video surveillance cluster (Kubernetes) on-premise or in the cloud (AWS/GCP/Azure). This will be released in 2020/Q1.","position":{"start":{"line":43,"column":1,"offset":3980},"end":{"line":43,"column":329,"offset":4308},"indent":[]}}],"position":{"start":{"line":43,"column":1,"offset":3980},"end":{"line":43,"column":329,"offset":4308},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Open Source and Enterprise edition are significantly different from a source code point of view. The Enterprise version is a complete rewrite of the Open Source version, and got all the best practices we discovered over the years implemented. Both version are and will remain updated in the future.","position":{"start":{"line":45,"column":1,"offset":4310},"end":{"line":45,"column":303,"offset":4612},"indent":[]}}],"position":{"start":{"line":45,"column":1,"offset":4310},"end":{"line":45,"column":303,"offset":4612},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Cloud","position":{"start":{"line":47,"column":4,"offset":4617},"end":{"line":47,"column":9,"offset":4622},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":4614},"end":{"line":47,"column":9,"offset":4622},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When installing a Kerberos agent inside your local network, it's possible to review your activity by using the agent's web interface. By its nature, you will not be able to access the web interface from the cloud (outside your local network). On top of that, the Kerberos agent doesn't come with a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera. To simplify and resolve all of these challenges, ","position":{"start":{"line":49,"column":1,"offset":4624},"end":{"line":49,"column":478,"offset":5101},"indent":[]}},{"type":"link","title":null,"url":"/cloud","children":[{"type":"text","value":"Kerberos Cloud","position":{"start":{"line":49,"column":479,"offset":5102},"end":{"line":49,"column":493,"offset":5116},"indent":[]}}],"position":{"start":{"line":49,"column":478,"offset":5101},"end":{"line":49,"column":502,"offset":5125},"indent":[]}},{"type":"text","value":" was developed. Read more about the ","position":{"start":{"line":49,"column":502,"offset":5125},"end":{"line":49,"column":538,"offset":5161},"indent":[]}},{"type":"link","title":null,"url":"/cloud","children":[{"type":"text","value":"different features and functions of Kerberos Cloud here","position":{"start":{"line":49,"column":539,"offset":5162},"end":{"line":49,"column":594,"offset":5217},"indent":[]}}],"position":{"start":{"line":49,"column":538,"offset":5161},"end":{"line":49,"column":603,"offset":5226},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":49,"column":603,"offset":5226},"end":{"line":49,"column":604,"offset":5227},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":4624},"end":{"line":49,"column":604,"offset":5227},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":52,"column":1,"offset":5230},"end":{"line":52,"column":31,"offset":5260},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":52,"column":31,"offset":5260}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Kerberos.io`}

\n

{`The `}{`Kerberos(dot)io`}{` project, is a video surveillance solution, which was initiated back in 2014. Over the years it has evolved into a trusted, stable and feature-rich video surveillance system. To set the expectations, watch the video below to understand what it can and can't do. If you want to install Kerberos(dot)io, it's recommended to have a look `}{`at the architectures page`}{` to find the best solution for your usecase.`}

\n
\n

{`The name: Kerberos.io`}

\n

{`Many people are confused, and don't understand why this project is called Kerberos(dot)io. If you've been in the IT world for a while you will notice that Kerberos is already used for the authentication protocol `}{`Kerberos`}{`.\nWe believe that the name Kerberos(dot)io makes sense for this project as well, with a strong emphasize on the suffix `}{`.io`}{`, which stands for input and output devices (e.g. any type of camera). Kerberos(dot)io can be seen as a kind of security protocol driven by hardware devices such as surveillance cameras. To make writing easier we will from now on, refer to Kerberos instead of Kerberos(dot)io.`}

\n

{`Why Kerberos`}

\n

{`As burglary is very common, we believe that video surveillance is a trivial tool in our daily lifes which helps us to feel a little bit more secure. Responding to this need, a lot of companies have started developing their own video surveillance software in the past few years.`}

\n

{`Nowadays we have a myriad of expensive cameras, recorders, and software solutions which are mainly outdated and difficult to install and use. Kerberos goal is to solve these problems and to provide every human being or enterprise in this world to have their own ecological, affordable, easy-to-use and innovative surveillance solution. Read more about our strategy here.`}

\n

{`What is Kerberos`}

\n

{`Kerberos is a video surveillance solution, that uses computer vision algorithms to detect changes, and that can trigger actions (notifications, api, etc). It comes in two flavors, Kerberos Open Source and Kerberos Enterprise. Kerberos can be deployed to any Linux OS, Docker, or cluster such as Kubernetes.`}

\n

{`The Kerberos agent`}

\n

{`When you install Kerberos Open Source or Kerberos Enterprise we will refer to it as a Kerberos agent. A Kerberos agent, is a software solution that processes the video stream of a single surveillance camera, makes and visualises recordings and takes actions (for example sending notifications).`}

\n

{`How does it work`}

\n

{`The Kerberos agent comes in two flavors, Open Source and Enterprise. Both versions have a web interface (front-end) and a video processing engine (back-end). The front-end allows a user to modify specific settings and watch recordings in a easy-to-use interface. The back-end is a solution that processes the camera feed with computer vision algorithms to detect motion, and makes recordings and/or execute specific actions. Kerberos supports any type of IP-camera (RTSP/ONVIF), USB (V4L2) and the popular Raspberry Pi camera.`}

\n

{`Depending on the flavor you choose, you will have to install different components, but the idea as described above remains the same. If you would like to learn more dive deeper in the related sections: `}{`Open Source`}{`, `}{`Enterprise`}{`.`}

\n

{`Open Source vs Enterprise`}

\n

{`The Kerberos project started as an Open Source project, with a main focus on low-cost devices such as the Raspberry Pi. Later on the Open Source version was bundled inside the Docker technology so that it was easier to distribute. Anyone can use the Open Source version for personal usage.`}

\n

{`Enterprises are more demanding, and have a lot of surveillance cameras, therefore they need a scalable surveillance system. The Enterprise edition of Kerberos is a licensed service which allows you to operate a video surveillance cluster (Kubernetes) on-premise or in the cloud (AWS/GCP/Azure). This will be released in 2020/Q1.`}

\n

{`The Open Source and Enterprise edition are significantly different from a source code point of view. The Enterprise version is a complete rewrite of the Open Source version, and got all the best practices we discovered over the years implemented. Both version are and will remain updated in the future.`}

\n

{`Cloud`}

\n

{`When installing a Kerberos agent inside your local network, it's possible to review your activity by using the agent's web interface. By its nature, you will not be able to access the web interface from the cloud (outside your local network). On top of that, the Kerberos agent doesn't come with a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera. To simplify and resolve all of these challenges, `}{`Kerberos Cloud`}{` was developed. Read more about the `}{`different features and functions of Kerberos Cloud here`}{`.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760428000,"key":"gatsby-plugin-mdx-entire-payload-47f678153ba3caebb1e488e13b5ce5ff-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Kerberos.io","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":14,"offset":172},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":14,"offset":172},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The ","position":{"start":{"line":10,"column":1,"offset":174},"end":{"line":10,"column":5,"offset":178},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Kerberos(dot)io","position":{"start":{"line":10,"column":7,"offset":180},"end":{"line":10,"column":22,"offset":195},"indent":[]}}],"position":{"start":{"line":10,"column":5,"offset":178},"end":{"line":10,"column":24,"offset":197},"indent":[]}},{"type":"text","value":" project, is a video surveillance solution, which was initiated back in 2014. Over the years it has evolved into a trusted, stable and feature-rich video surveillance system. To set the expectations, watch the video below to understand what it can and can't do. If you want to install Kerberos(dot)io, it's recommended to have a look ","position":{"start":{"line":10,"column":24,"offset":197},"end":{"line":10,"column":358,"offset":531},"indent":[]}},{"type":"link","title":null,"url":"/architectures","children":[{"type":"text","value":"at the architectures page","position":{"start":{"line":10,"column":359,"offset":532},"end":{"line":10,"column":384,"offset":557},"indent":[]}}],"position":{"start":{"line":10,"column":358,"offset":531},"end":{"line":10,"column":401,"offset":574},"indent":[]}},{"type":"text","value":" to find the best solution for your usecase.","position":{"start":{"line":10,"column":401,"offset":574},"end":{"line":10,"column":445,"offset":618},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":174},"end":{"line":10,"column":445,"offset":618},"indent":[]}},{"type":"jsx","value":"
","position":{"start":{"line":12,"column":1,"offset":620},"end":{"line":12,"column":186,"offset":805},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"The name: Kerberos.io","position":{"start":{"line":14,"column":4,"offset":810},"end":{"line":14,"column":25,"offset":831},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":807},"end":{"line":14,"column":25,"offset":831},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Many people are confused, and don't understand why this project is called Kerberos(dot)io. If you've been in the IT world for a while you will notice that Kerberos is already used for the authentication protocol ","position":{"start":{"line":16,"column":1,"offset":833},"end":{"line":16,"column":213,"offset":1045},"indent":[]}},{"type":"link","title":null,"url":"https://en.wikipedia.org/wiki/Kerberos_(protocol)","children":[{"type":"text","value":"Kerberos","position":{"start":{"line":16,"column":214,"offset":1046},"end":{"line":16,"column":222,"offset":1054},"indent":[]}}],"position":{"start":{"line":16,"column":213,"offset":1045},"end":{"line":16,"column":274,"offset":1106},"indent":[]}},{"type":"text","value":".\nWe believe that the name Kerberos(dot)io makes sense for this project as well, with a strong emphasize on the suffix ","position":{"start":{"line":16,"column":274,"offset":1106},"end":{"line":17,"column":118,"offset":1225},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":".io","position":{"start":{"line":17,"column":120,"offset":1227},"end":{"line":17,"column":123,"offset":1230},"indent":[]}}],"position":{"start":{"line":17,"column":118,"offset":1225},"end":{"line":17,"column":125,"offset":1232},"indent":[]}},{"type":"text","value":", which stands for input and output devices (e.g. any type of camera). Kerberos(dot)io can be seen as a kind of security protocol driven by hardware devices such as surveillance cameras. To make writing easier we will from now on, refer to Kerberos instead of Kerberos(dot)io.","position":{"start":{"line":17,"column":125,"offset":1232},"end":{"line":17,"column":401,"offset":1508},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":833},"end":{"line":17,"column":401,"offset":1508},"indent":[1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Why Kerberos","position":{"start":{"line":19,"column":4,"offset":1513},"end":{"line":19,"column":16,"offset":1525},"indent":[]}}],"position":{"start":{"line":19,"column":1,"offset":1510},"end":{"line":19,"column":16,"offset":1525},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"As burglary is very common, we believe that video surveillance is a trivial tool in our daily lifes which helps us to feel a little bit more secure. Responding to this need, a lot of companies have started developing their own video surveillance software in the past few years.","position":{"start":{"line":21,"column":1,"offset":1527},"end":{"line":21,"column":278,"offset":1804},"indent":[]}}],"position":{"start":{"line":21,"column":1,"offset":1527},"end":{"line":21,"column":278,"offset":1804},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Nowadays we have a myriad of expensive cameras, recorders, and software solutions which are mainly outdated and difficult to install and use. Kerberos goal is to solve these problems and to provide every human being or enterprise in this world to have their own ecological, affordable, easy-to-use and innovative surveillance solution. Read more about our strategy here.","position":{"start":{"line":23,"column":1,"offset":1806},"end":{"line":23,"column":371,"offset":2176},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":1806},"end":{"line":23,"column":371,"offset":2176},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"What is Kerberos","position":{"start":{"line":25,"column":4,"offset":2181},"end":{"line":25,"column":20,"offset":2197},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":2178},"end":{"line":25,"column":20,"offset":2197},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos is a video surveillance solution, that uses computer vision algorithms to detect changes, and that can trigger actions (notifications, api, etc). It comes in two flavors, Kerberos Open Source and Kerberos Enterprise. Kerberos can be deployed to any Linux OS, Docker, or cluster such as Kubernetes.","position":{"start":{"line":27,"column":1,"offset":2199},"end":{"line":27,"column":307,"offset":2505},"indent":[]}}],"position":{"start":{"line":27,"column":1,"offset":2199},"end":{"line":27,"column":307,"offset":2505},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"The Kerberos agent","position":{"start":{"line":29,"column":4,"offset":2510},"end":{"line":29,"column":22,"offset":2528},"indent":[]}}],"position":{"start":{"line":29,"column":1,"offset":2507},"end":{"line":29,"column":22,"offset":2528},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you install Kerberos Open Source or Kerberos Enterprise we will refer to it as a Kerberos agent. A Kerberos agent, is a software solution that processes the video stream of a single surveillance camera, makes and visualises recordings and takes actions (for example sending notifications).","position":{"start":{"line":31,"column":1,"offset":2530},"end":{"line":31,"column":295,"offset":2824},"indent":[]}}],"position":{"start":{"line":31,"column":1,"offset":2530},"end":{"line":31,"column":295,"offset":2824},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"How does it work","position":{"start":{"line":33,"column":4,"offset":2829},"end":{"line":33,"column":20,"offset":2845},"indent":[]}}],"position":{"start":{"line":33,"column":1,"offset":2826},"end":{"line":33,"column":20,"offset":2845},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Kerberos agent comes in two flavors, Open Source and Enterprise. Both versions have a web interface (front-end) and a video processing engine (back-end). The front-end allows a user to modify specific settings and watch recordings in a easy-to-use interface. The back-end is a solution that processes the camera feed with computer vision algorithms to detect motion, and makes recordings and/or execute specific actions. Kerberos supports any type of IP-camera (RTSP/ONVIF), USB (V4L2) and the popular Raspberry Pi camera.","position":{"start":{"line":35,"column":1,"offset":2847},"end":{"line":35,"column":527,"offset":3373},"indent":[]}}],"position":{"start":{"line":35,"column":1,"offset":2847},"end":{"line":35,"column":527,"offset":3373},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Depending on the flavor you choose, you will have to install different components, but the idea as described above remains the same. If you would like to learn more dive deeper in the related sections: ","position":{"start":{"line":37,"column":1,"offset":3375},"end":{"line":37,"column":203,"offset":3577},"indent":[]}},{"type":"link","title":null,"url":"/opensource/introduction","children":[{"type":"text","value":"Open Source","position":{"start":{"line":37,"column":204,"offset":3578},"end":{"line":37,"column":215,"offset":3589},"indent":[]}}],"position":{"start":{"line":37,"column":203,"offset":3577},"end":{"line":37,"column":242,"offset":3616},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":37,"column":242,"offset":3616},"end":{"line":37,"column":244,"offset":3618},"indent":[]}},{"type":"link","title":null,"url":"/enterprise/introduction","children":[{"type":"text","value":"Enterprise","position":{"start":{"line":37,"column":245,"offset":3619},"end":{"line":37,"column":255,"offset":3629},"indent":[]}}],"position":{"start":{"line":37,"column":244,"offset":3618},"end":{"line":37,"column":282,"offset":3656},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":37,"column":282,"offset":3656},"end":{"line":37,"column":283,"offset":3657},"indent":[]}}],"position":{"start":{"line":37,"column":1,"offset":3375},"end":{"line":37,"column":283,"offset":3657},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Open Source vs Enterprise","position":{"start":{"line":39,"column":4,"offset":3662},"end":{"line":39,"column":29,"offset":3687},"indent":[]}}],"position":{"start":{"line":39,"column":1,"offset":3659},"end":{"line":39,"column":29,"offset":3687},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Kerberos project started as an Open Source project, with a main focus on low-cost devices such as the Raspberry Pi. Later on the Open Source version was bundled inside the Docker technology so that it was easier to distribute. Anyone can use the Open Source version for personal usage.","position":{"start":{"line":41,"column":1,"offset":3689},"end":{"line":41,"column":290,"offset":3978},"indent":[]}}],"position":{"start":{"line":41,"column":1,"offset":3689},"end":{"line":41,"column":290,"offset":3978},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Enterprises are more demanding, and have a lot of surveillance cameras, therefore they need a scalable surveillance system. The Enterprise edition of Kerberos is a licensed service which allows you to operate a video surveillance cluster (Kubernetes) on-premise or in the cloud (AWS/GCP/Azure). This will be released in 2020/Q1.","position":{"start":{"line":43,"column":1,"offset":3980},"end":{"line":43,"column":329,"offset":4308},"indent":[]}}],"position":{"start":{"line":43,"column":1,"offset":3980},"end":{"line":43,"column":329,"offset":4308},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The Open Source and Enterprise edition are significantly different from a source code point of view. The Enterprise version is a complete rewrite of the Open Source version, and got all the best practices we discovered over the years implemented. Both version are and will remain updated in the future.","position":{"start":{"line":45,"column":1,"offset":4310},"end":{"line":45,"column":303,"offset":4612},"indent":[]}}],"position":{"start":{"line":45,"column":1,"offset":4310},"end":{"line":45,"column":303,"offset":4612},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Cloud","position":{"start":{"line":47,"column":4,"offset":4617},"end":{"line":47,"column":9,"offset":4622},"indent":[]}}],"position":{"start":{"line":47,"column":1,"offset":4614},"end":{"line":47,"column":9,"offset":4622},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When installing a Kerberos agent inside your local network, it's possible to review your activity by using the agent's web interface. By its nature, you will not be able to access the web interface from the cloud (outside your local network). On top of that, the Kerberos agent doesn't come with a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera. To simplify and resolve all of these challenges, ","position":{"start":{"line":49,"column":1,"offset":4624},"end":{"line":49,"column":478,"offset":5101},"indent":[]}},{"type":"link","title":null,"url":"/cloud","children":[{"type":"text","value":"Kerberos Cloud","position":{"start":{"line":49,"column":479,"offset":5102},"end":{"line":49,"column":493,"offset":5116},"indent":[]}}],"position":{"start":{"line":49,"column":478,"offset":5101},"end":{"line":49,"column":502,"offset":5125},"indent":[]}},{"type":"text","value":" was developed. Read more about the ","position":{"start":{"line":49,"column":502,"offset":5125},"end":{"line":49,"column":538,"offset":5161},"indent":[]}},{"type":"link","title":null,"url":"/cloud","children":[{"type":"text","value":"different features and functions of Kerberos Cloud here","position":{"start":{"line":49,"column":539,"offset":5162},"end":{"line":49,"column":594,"offset":5217},"indent":[]}}],"position":{"start":{"line":49,"column":538,"offset":5161},"end":{"line":49,"column":603,"offset":5226},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":49,"column":603,"offset":5226},"end":{"line":49,"column":604,"offset":5227},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":4624},"end":{"line":49,"column":604,"offset":5227},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":52,"column":1,"offset":5230},"end":{"line":52,"column":31,"offset":5260},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":52,"column":31,"offset":5260}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Kerberos.io`}

\n

{`The `}{`Kerberos(dot)io`}{` project, is a video surveillance solution, which was initiated back in 2014. Over the years it has evolved into a trusted, stable and feature-rich video surveillance system. To set the expectations, watch the video below to understand what it can and can't do. If you want to install Kerberos(dot)io, it's recommended to have a look `}{`at the architectures page`}{` to find the best solution for your usecase.`}

\n
\n

{`The name: Kerberos.io`}

\n

{`Many people are confused, and don't understand why this project is called Kerberos(dot)io. If you've been in the IT world for a while you will notice that Kerberos is already used for the authentication protocol `}{`Kerberos`}{`.\nWe believe that the name Kerberos(dot)io makes sense for this project as well, with a strong emphasize on the suffix `}{`.io`}{`, which stands for input and output devices (e.g. any type of camera). Kerberos(dot)io can be seen as a kind of security protocol driven by hardware devices such as surveillance cameras. To make writing easier we will from now on, refer to Kerberos instead of Kerberos(dot)io.`}

\n

{`Why Kerberos`}

\n

{`As burglary is very common, we believe that video surveillance is a trivial tool in our daily lifes which helps us to feel a little bit more secure. Responding to this need, a lot of companies have started developing their own video surveillance software in the past few years.`}

\n

{`Nowadays we have a myriad of expensive cameras, recorders, and software solutions which are mainly outdated and difficult to install and use. Kerberos goal is to solve these problems and to provide every human being or enterprise in this world to have their own ecological, affordable, easy-to-use and innovative surveillance solution. Read more about our strategy here.`}

\n

{`What is Kerberos`}

\n

{`Kerberos is a video surveillance solution, that uses computer vision algorithms to detect changes, and that can trigger actions (notifications, api, etc). It comes in two flavors, Kerberos Open Source and Kerberos Enterprise. Kerberos can be deployed to any Linux OS, Docker, or cluster such as Kubernetes.`}

\n

{`The Kerberos agent`}

\n

{`When you install Kerberos Open Source or Kerberos Enterprise we will refer to it as a Kerberos agent. A Kerberos agent, is a software solution that processes the video stream of a single surveillance camera, makes and visualises recordings and takes actions (for example sending notifications).`}

\n

{`How does it work`}

\n

{`The Kerberos agent comes in two flavors, Open Source and Enterprise. Both versions have a web interface (front-end) and a video processing engine (back-end). The front-end allows a user to modify specific settings and watch recordings in a easy-to-use interface. The back-end is a solution that processes the camera feed with computer vision algorithms to detect motion, and makes recordings and/or execute specific actions. Kerberos supports any type of IP-camera (RTSP/ONVIF), USB (V4L2) and the popular Raspberry Pi camera.`}

\n

{`Depending on the flavor you choose, you will have to install different components, but the idea as described above remains the same. If you would like to learn more dive deeper in the related sections: `}{`Open Source`}{`, `}{`Enterprise`}{`.`}

\n

{`Open Source vs Enterprise`}

\n

{`The Kerberos project started as an Open Source project, with a main focus on low-cost devices such as the Raspberry Pi. Later on the Open Source version was bundled inside the Docker technology so that it was easier to distribute. Anyone can use the Open Source version for personal usage.`}

\n

{`Enterprises are more demanding, and have a lot of surveillance cameras, therefore they need a scalable surveillance system. The Enterprise edition of Kerberos is a licensed service which allows you to operate a video surveillance cluster (Kubernetes) on-premise or in the cloud (AWS/GCP/Azure). This will be released in 2020/Q1.`}

\n

{`The Open Source and Enterprise edition are significantly different from a source code point of view. The Enterprise version is a complete rewrite of the Open Source version, and got all the best practices we discovered over the years implemented. Both version are and will remain updated in the future.`}

\n

{`Cloud`}

\n

{`When installing a Kerberos agent inside your local network, it's possible to review your activity by using the agent's web interface. By its nature, you will not be able to access the web interface from the cloud (outside your local network). On top of that, the Kerberos agent doesn't come with a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera. To simplify and resolve all of these challenges, `}{`Kerberos Cloud`}{` was developed. Read more about the `}{`different features and functions of Kerberos Cloud here`}{`.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c21beb2fa8e8453f9f228b3086e047c3.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c21beb2fa8e8453f9f228b3086e047c3.json deleted file mode 100644 index b69a361..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c21beb2fa8e8453f9f228b3086e047c3.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838525569000,"key":"gatsby-plugin-mdx-entire-payload-b0b6c79dd99e82626ad0fee8939c8d83-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable of you want to monitor dozens of hundreds of them. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":75,"offset":681},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":75,"offset":681},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":17,"column":1,"offset":684},"end":{"line":17,"column":31,"offset":714},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":17,"column":31,"offset":714}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable of you want to monitor dozens of hundreds of them. Although Kerberos Open Source ships\nas a docker image, it has no high availability of fail-over functionality.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c91cdbcb8d8826bf1375fb5eb8aebafc.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c91cdbcb8d8826bf1375fb5eb8aebafc.json deleted file mode 100644 index d082c95..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-c91cdbcb8d8826bf1375fb5eb8aebafc.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838681899000,"key":"gatsby-plugin-mdx-entire-payload-508b1561049b881b6eabbcebfedf1077-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":839},"end":{"line":16,"column":186,"offset":1024},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Orchestration and high-availability","position":{"start":{"line":18,"column":4,"offset":1029},"end":{"line":18,"column":39,"offset":1064},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1026},"end":{"line":18,"column":39,"offset":1064},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":21,"column":1,"offset":1067},"end":{"line":21,"column":31,"offset":1097},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":21,"column":31,"offset":1097}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.`}

\n
\n

{`Orchestration and high-availability`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-cf91ba4e064977d9d8744996bec34baf.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-cf91ba4e064977d9d8744996bec34baf.json new file mode 100644 index 0000000..4d77a6e --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-cf91ba4e064977d9d8744996bec34baf.json @@ -0,0 +1 @@ +{"expireTime":9007200838781890000,"key":"gatsby-plugin-mdx-entire-payload-09b57634669a4bb990799c1d85400418-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":73,"column":1,"offset":2191},"end":{"line":84,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":86,"column":4,"offset":2497},"end":{"line":86,"column":11,"offset":2504},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2494},"end":{"line":86,"column":11,"offset":2504},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":88,"column":4,"offset":2509},"end":{"line":88,"column":11,"offset":2516},"indent":[]}}],"position":{"start":{"line":88,"column":2,"offset":2507},"end":{"line":88,"column":13,"offset":2518},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":44,"offset":2549},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.","position":{"start":{"line":88,"column":44,"offset":2549},"end":{"line":88,"column":204,"offset":2709},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":204,"offset":2709},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":90,"column":1,"offset":2711},"end":{"line":90,"column":72,"offset":2782},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":92,"column":1,"offset":2784},"end":{"line":92,"column":22,"offset":2805},"indent":[]}}],"position":{"start":{"line":92,"column":1,"offset":2784},"end":{"line":92,"column":22,"offset":2805},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":94,"column":1,"offset":2807},"end":{"line":99,"column":22,"offset":2931},"indent":[1,1,1,1,1]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":101,"column":3,"offset":2935},"end":{"line":101,"column":10,"offset":2942},"indent":[]}}],"position":{"start":{"line":101,"column":1,"offset":2933},"end":{"line":101,"column":10,"offset":2942},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise","position":{"start":{"line":103,"column":1,"offset":2944},"end":{"line":103,"column":20,"offset":2963},"indent":[]}}],"position":{"start":{"line":103,"column":1,"offset":2944},"end":{"line":103,"column":20,"offset":2963},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":106,"column":1,"offset":2966},"end":{"line":106,"column":31,"offset":2996},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":106,"column":31,"offset":2996}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-cf9f0bb43e2ce7f7bcc2344a5968a66f.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-cf9f0bb43e2ce7f7bcc2344a5968a66f.json deleted file mode 100644 index e226aa5..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-cf9f0bb43e2ce7f7bcc2344a5968a66f.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838683664000,"key":"gatsby-plugin-mdx-entire-payload-1e33c186fda2a82df8ddc1526a889b25-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you have. Kubernetes will scale them across your nodes (VM's/Baremetal). ","position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":198,"offset":1685},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":198,"offset":1685},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":27,"column":1,"offset":1688},"end":{"line":27,"column":31,"offset":1718},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":27,"column":31,"offset":1718}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n

{`Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you have. Kubernetes will scale them across your nodes (VM's/Baremetal). `}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-d21a7e052ca0deb1bed2dfb7da717d7e.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-d21a7e052ca0deb1bed2dfb7da717d7e.json deleted file mode 100644 index 4a25ab9..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-d21a7e052ca0deb1bed2dfb7da717d7e.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838682696000,"key":"gatsby-plugin-mdx-entire-payload-60bb8800b3a2d6a5379a010a1d22e2f2-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes-cloud.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":97,"offset":1492},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":97,"offset":1492},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":25,"column":1,"offset":1495},"end":{"line":25,"column":31,"offset":1525},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":25,"column":31,"offset":1525}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-d7796b1a984dc6af7d818c599c508e07.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-d7796b1a984dc6af7d818c599c508e07.json deleted file mode 100644 index 97444d0..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-d7796b1a984dc6af7d818c599c508e07.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838681943000,"key":"gatsby-plugin-mdx-entire-payload-ddb7e678e36a012a62c2161019cfbc25-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":839},"end":{"line":16,"column":186,"offset":1024},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1029},"end":{"line":18,"column":14,"offset":1039},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1026},"end":{"line":18,"column":14,"offset":1039},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide the high-availability and fail over requirements customers have, Kerberos Enterprise was built on top of Kubernetes.","position":{"start":{"line":20,"column":1,"offset":1041},"end":{"line":20,"column":128,"offset":1168},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1041},"end":{"line":20,"column":128,"offset":1168},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":23,"column":1,"offset":1171},"end":{"line":23,"column":31,"offset":1201},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":23,"column":31,"offset":1201}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.`}

\n
\n

{`Kubernetes`}

\n

{`To provide the high-availability and fail over requirements customers have, Kerberos Enterprise was built on top of Kubernetes.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-dc524e71a0878ac85869771105bc5aa2.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-dc524e71a0878ac85869771105bc5aa2.json new file mode 100644 index 0000000..fec02bc --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-dc524e71a0878ac85869771105bc5aa2.json @@ -0,0 +1 @@ +{"expireTime":9007200838824565000,"key":"gatsby-plugin-mdx-entire-payload-4d654e85fe624cdcdea342d35a682bbc-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kerberos factory","position":{"start":{"line":113,"column":4,"offset":3479},"end":{"line":113,"column":20,"offset":3495},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":20,"offset":3495},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":115,"column":1,"offset":3497},"end":{"line":115,"column":74,"offset":3570},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":115,"column":76,"offset":3572},"end":{"line":115,"column":83,"offset":3579},"indent":[]}}],"position":{"start":{"line":115,"column":74,"offset":3570},"end":{"line":115,"column":85,"offset":3581},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating","position":{"start":{"line":115,"column":85,"offset":3581},"end":{"line":115,"column":128,"offset":3624},"indent":[]}}],"position":{"start":{"line":115,"column":1,"offset":3497},"end":{"line":115,"column":128,"offset":3624},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":117,"column":1,"offset":3626},"end":{"line":117,"column":47,"offset":3672},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":120,"column":1,"offset":3675},"end":{"line":120,"column":31,"offset":3705},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":120,"column":31,"offset":3705}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Kerberos factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-deab0012004d6fd2df771b1528aac216.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-deab0012004d6fd2df771b1528aac216.json deleted file mode 100644 index 74f3e9d..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-deab0012004d6fd2df771b1528aac216.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838525830000,"key":"gatsby-plugin-mdx-entire-payload-b90fc6a83f84b31bf6f28e18be8112b8-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":17,"column":1,"offset":840},"end":{"line":17,"column":31,"offset":870},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":17,"column":31,"offset":870}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e1e7deff34f9356134cf2ee45a22c675.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e1e7deff34f9356134cf2ee45a22c675.json new file mode 100644 index 0000000..2a46b33 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e1e7deff34f9356134cf2ee45a22c675.json @@ -0,0 +1 @@ +{"expireTime":9007200838836974000,"key":"gatsby-plugin-mdx-entire-payload-65cc89f8f5a236f82eda6d7ce7046c0b-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":107,"column":4,"offset":3144},"end":{"line":107,"column":11,"offset":3151},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":3141},"end":{"line":107,"column":11,"offset":3151},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}}],"position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":112,"column":1,"offset":3398},"end":{"line":112,"column":78,"offset":3475},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":116,"column":1,"offset":3501},"end":{"line":116,"column":8,"offset":3508},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":118,"column":4,"offset":3513},"end":{"line":118,"column":11,"offset":3520},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3510},"end":{"line":118,"column":11,"offset":3520},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":120,"column":74,"offset":3595},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":120,"column":76,"offset":3597},"end":{"line":120,"column":83,"offset":3604},"indent":[]}}],"position":{"start":{"line":120,"column":74,"offset":3595},"end":{"line":120,"column":85,"offset":3606},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":120,"column":85,"offset":3606},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}}],"position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":125,"column":1,"offset":3989},"end":{"line":125,"column":47,"offset":4035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}}],"position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":129,"column":1,"offset":4064},"end":{"line":129,"column":25,"offset":4088},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":131,"column":3,"offset":4092},"end":{"line":131,"column":25,"offset":4114},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":4090},"end":{"line":131,"column":25,"offset":4114},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":135,"column":12,"offset":4222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4223},"end":{"line":136,"column":12,"offset":4234},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4235},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":137,"column":12,"offset":4246},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":141,"column":1,"offset":4275},"end":{"line":145,"column":73,"offset":4587},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":147,"column":4,"offset":4592},"end":{"line":147,"column":21,"offset":4609},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4589},"end":{"line":147,"column":21,"offset":4609},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure your DNS server. Look for the\nTraefik service, and copy its external ip.","position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":43,"offset":4786},"indent":[1]}}],"position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":43,"offset":4786},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":" $ kubectl get svc\n NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n factory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\n kubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\n mongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\n--> traefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h\n traefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":152,"column":1,"offset":4788},"end":{"line":158,"column":109,"offset":5465},"indent":[1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Add this IP to your DNS server, so it will resolve your domains:","position":{"start":{"line":160,"column":1,"offset":5467},"end":{"line":160,"column":65,"offset":5531},"indent":[]}}],"position":{"start":{"line":160,"column":1,"offset":5467},"end":{"line":160,"column":65,"offset":5531},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"traefik.domain.com (change to your domain)","position":{"start":{"line":162,"column":5,"offset":5537},"end":{"line":162,"column":47,"offset":5579},"indent":[]}}],"position":{"start":{"line":162,"column":5,"offset":5537},"end":{"line":162,"column":47,"offset":5579},"indent":[]}}],"position":{"start":{"line":162,"column":1,"offset":5533},"end":{"line":162,"column":47,"offset":5579},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"factory.domain.com (change to your domain).","position":{"start":{"line":163,"column":5,"offset":5584},"end":{"line":163,"column":48,"offset":5627},"indent":[]}}],"position":{"start":{"line":163,"column":5,"offset":5584},"end":{"line":163,"column":48,"offset":5627},"indent":[]}}],"position":{"start":{"line":163,"column":1,"offset":5580},"end":{"line":163,"column":48,"offset":5627},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"api.factory.domain.com (change to your domain).","position":{"start":{"line":164,"column":5,"offset":5632},"end":{"line":164,"column":52,"offset":5679},"indent":[]}}],"position":{"start":{"line":164,"column":5,"offset":5632},"end":{"line":164,"column":52,"offset":5679},"indent":[]}}],"position":{"start":{"line":164,"column":1,"offset":5628},"end":{"line":164,"column":52,"offset":5679},"indent":[]}}],"position":{"start":{"line":162,"column":1,"offset":5533},"end":{"line":164,"column":52,"offset":5679},"indent":[1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Access the system","position":{"start":{"line":166,"column":4,"offset":5684},"end":{"line":166,"column":21,"offset":5701},"indent":[]}}],"position":{"start":{"line":166,"column":1,"offset":5681},"end":{"line":166,"column":21,"offset":5701},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating","position":{"start":{"line":168,"column":1,"offset":5703},"end":{"line":168,"column":129,"offset":5831},"indent":[]}}],"position":{"start":{"line":168,"column":1,"offset":5703},"end":{"line":168,"column":129,"offset":5831},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":171,"column":1,"offset":5834},"end":{"line":171,"column":31,"offset":5864},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":171,"column":31,"offset":5864}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure your DNS server. Look for the\nTraefik service, and copy its external ip.`}

\n
{`    $ kubectl get svc`}{`\n`}{`    NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`    factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`    kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`    mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`--> traefik              LoadBalancer   10.0.10.97    34.66.138.141   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`    traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n

{`Add this IP to your DNS server, so it will resolve your domains:`}

\n
    \n
  • {`traefik.domain.com (change to your domain)`}
  • \n
  • {`factory.domain.com (change to your domain).`}
  • \n
  • {`api.factory.domain.com (change to your domain).`}
  • \n
\n

{`Access the system`}

\n

{`Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e2962ee393c344b9e2afed7573764805.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e2962ee393c344b9e2afed7573764805.json new file mode 100644 index 0000000..133e543 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e2962ee393c344b9e2afed7573764805.json @@ -0,0 +1 @@ +{"expireTime":9007200838836840000,"key":"gatsby-plugin-mdx-entire-payload-d5b6491de6c1e0aaee375fee34093ba7-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":107,"column":4,"offset":3144},"end":{"line":107,"column":11,"offset":3151},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":3141},"end":{"line":107,"column":11,"offset":3151},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}}],"position":{"start":{"line":109,"column":1,"offset":3153},"end":{"line":110,"column":117,"offset":3396},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":112,"column":1,"offset":3398},"end":{"line":112,"column":78,"offset":3475},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}}],"position":{"start":{"line":114,"column":1,"offset":3477},"end":{"line":114,"column":23,"offset":3499},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":116,"column":1,"offset":3501},"end":{"line":116,"column":8,"offset":3508},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":118,"column":4,"offset":3513},"end":{"line":118,"column":11,"offset":3520},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":3510},"end":{"line":118,"column":11,"offset":3520},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":120,"column":74,"offset":3595},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":120,"column":76,"offset":3597},"end":{"line":120,"column":83,"offset":3604},"indent":[]}}],"position":{"start":{"line":120,"column":74,"offset":3595},"end":{"line":120,"column":85,"offset":3606},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":120,"column":85,"offset":3606},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}}],"position":{"start":{"line":120,"column":1,"offset":3522},"end":{"line":123,"column":76,"offset":3987},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":125,"column":1,"offset":3989},"end":{"line":125,"column":47,"offset":4035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}}],"position":{"start":{"line":127,"column":1,"offset":4037},"end":{"line":127,"column":26,"offset":4062},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":129,"column":1,"offset":4064},"end":{"line":129,"column":25,"offset":4088},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":131,"column":3,"offset":4092},"end":{"line":131,"column":25,"offset":4114},"indent":[]}}],"position":{"start":{"line":131,"column":1,"offset":4090},"end":{"line":131,"column":25,"offset":4114},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}}],"position":{"start":{"line":133,"column":1,"offset":4116},"end":{"line":133,"column":94,"offset":4209},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4215},"end":{"line":135,"column":12,"offset":4222},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":135,"column":12,"offset":4222},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4227},"end":{"line":136,"column":12,"offset":4234},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4223},"end":{"line":136,"column":12,"offset":4234},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":5,"offset":4239},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4235},"end":{"line":137,"column":12,"offset":4246},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4211},"end":{"line":137,"column":12,"offset":4246},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4248},"end":{"line":139,"column":26,"offset":4273},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":141,"column":1,"offset":4275},"end":{"line":145,"column":73,"offset":4587},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":147,"column":4,"offset":4592},"end":{"line":147,"column":21,"offset":4609},"indent":[]}}],"position":{"start":{"line":147,"column":1,"offset":4589},"end":{"line":147,"column":21,"offset":4609},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS. Look for the\nTraefik service, and copy its external ip. Add this IP to your DNS server, so it will resolve your domains:","position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":108,"offset":4839},"indent":[1]}}],"position":{"start":{"line":149,"column":1,"offset":4611},"end":{"line":150,"column":108,"offset":4839},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":" $ kubectl get svc\n NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\n factory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\n kubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\n mongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\n--> traefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h\n traefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":154,"column":1,"offset":4843},"end":{"line":160,"column":109,"offset":5520},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Access the system","position":{"start":{"line":163,"column":4,"offset":5526},"end":{"line":163,"column":21,"offset":5543},"indent":[]}}],"position":{"start":{"line":163,"column":1,"offset":5523},"end":{"line":163,"column":21,"offset":5543},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating","position":{"start":{"line":165,"column":1,"offset":5545},"end":{"line":165,"column":129,"offset":5673},"indent":[]}}],"position":{"start":{"line":165,"column":1,"offset":5545},"end":{"line":165,"column":129,"offset":5673},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":168,"column":1,"offset":5676},"end":{"line":168,"column":31,"offset":5706},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":168,"column":31,"offset":5706}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS. Look for the\nTraefik service, and copy its external ip. Add this IP to your DNS server, so it will resolve your domains:`}

\n
{`    $ kubectl get svc`}{`\n`}{`    NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`    factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`    kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`    mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`--> traefik              LoadBalancer   10.0.10.97    34.66.138.141   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`    traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n

{`Access the system`}

\n

{`Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e4e6783028e3167ef60464e5d5d71a1c.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e4e6783028e3167ef60464e5d5d71a1c.json new file mode 100644 index 0000000..e744389 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e4e6783028e3167ef60464e5d5d71a1c.json @@ -0,0 +1 @@ +{"expireTime":9007200838767956000,"key":"gatsby-plugin-mdx-entire-payload-ebd1eaebc4c32e6fb5fa5317e64be567-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":23,"column":4,"offset":774},"end":{"line":23,"column":8,"offset":778},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":771},"end":{"line":23,"column":8,"offset":778},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":25,"column":4,"offset":783},"end":{"line":25,"column":8,"offset":787},"indent":[]}}],"position":{"start":{"line":25,"column":2,"offset":781},"end":{"line":25,"column":10,"offset":789},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":780},"end":{"line":25,"column":29,"offset":808},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":25,"column":29,"offset":808},"end":{"line":25,"column":172,"offset":951},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":25,"column":174,"offset":953},"end":{"line":25,"column":180,"offset":959},"indent":[]}}],"position":{"start":{"line":25,"column":172,"offset":951},"end":{"line":25,"column":182,"offset":961},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":25,"column":182,"offset":961},"end":{"line":25,"column":254,"offset":1033},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":780},"end":{"line":25,"column":254,"offset":1033},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the helm client","position":{"start":{"line":27,"column":1,"offset":1035},"end":{"line":27,"column":72,"offset":1106},"indent":[]}}],"position":{"start":{"line":27,"column":1,"offset":1035},"end":{"line":27,"column":72,"offset":1106},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":29,"column":1,"offset":1108},"end":{"line":35,"column":24,"offset":1213},"indent":[1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":38,"column":1,"offset":1216},"end":{"line":38,"column":31,"offset":1246},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":38,"column":31,"offset":1246}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the helm client`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e77601507b5c1e7b6fd34442f10f50f3.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e77601507b5c1e7b6fd34442f10f50f3.json deleted file mode 100644 index 9d587d1..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e77601507b5c1e7b6fd34442f10f50f3.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838523924000,"key":"gatsby-plugin-mdx-entire-payload-a11fb5b0d834189c6b0c6d00df1008af-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":10,"column":152,"offset":324},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":10,"column":152,"offset":324},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":13,"column":1,"offset":327},"end":{"line":13,"column":31,"offset":357},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":13,"column":31,"offset":357}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e7c80861f8f64039fab82fae732a5fed.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e7c80861f8f64039fab82fae732a5fed.json new file mode 100644 index 0000000..1af0b79 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e7c80861f8f64039fab82fae732a5fed.json @@ -0,0 +1 @@ +{"expireTime":9007200838780796000,"key":"gatsby-plugin-mdx-entire-payload-91252586373130f4adf031d873601cca-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":73,"column":1,"offset":2191},"end":{"line":84,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":86,"column":4,"offset":2497},"end":{"line":86,"column":11,"offset":2504},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2494},"end":{"line":86,"column":11,"offset":2504},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Traefik is a load balancer.","position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":28,"offset":2533},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":28,"offset":2533},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":90,"column":1,"offset":2535},"end":{"line":90,"column":72,"offset":2606},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":93,"column":1,"offset":2609},"end":{"line":93,"column":31,"offset":2639},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":93,"column":31,"offset":2639}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik is a load balancer.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e8f1ac81a660935cddcc2cab6635d41c.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e8f1ac81a660935cddcc2cab6635d41c.json index f036870..e924968 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e8f1ac81a660935cddcc2cab6635d41c.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e8f1ac81a660935cddcc2cab6635d41c.json @@ -1 +1 @@ -{"expireTime":9007200838510879000,"key":"gatsby-plugin-mdx-entire-payload-ce6120d685d56b5ffef1f440aeebbc68-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Web interface","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":16,"offset":174},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":16,"offset":174},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The web is responsible for the visualization. It's a GUI which helps the user to find activity at a specific period, configure the machinery, view a live stream, see system information and much more.","position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":200,"offset":375},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":200,"offset":375},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It's written in PHP using the extremely popular PHP Framework Laravel, and Javascript using the client-side framework BackboneJS. We will discuss the different pages and functionality briefly. Please check out ","position":{"start":{"line":12,"column":1,"offset":377},"end":{"line":12,"column":211,"offset":587},"indent":[]}},{"type":"link","title":null,"url":"https://demo.kerberos.io","children":[{"type":"text","value":"the demo environment","position":{"start":{"line":12,"column":212,"offset":588},"end":{"line":12,"column":232,"offset":608},"indent":[]}}],"position":{"start":{"line":12,"column":211,"offset":587},"end":{"line":12,"column":259,"offset":635},"indent":[]}},{"type":"text","value":" if you want to see a real life example.","position":{"start":{"line":12,"column":259,"offset":635},"end":{"line":12,"column":299,"offset":675},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":377},"end":{"line":12,"column":299,"offset":675},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Overview","position":{"start":{"line":14,"column":4,"offset":680},"end":{"line":14,"column":12,"offset":688},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":677},"end":{"line":14,"column":12,"offset":688},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"We will shortly discuss the different pages that make up the web interface of Kerberos Open Source.","position":{"start":{"line":16,"column":1,"offset":690},"end":{"line":16,"column":100,"offset":789},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":690},"end":{"line":16,"column":100,"offset":789},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Dashboard","position":{"start":{"line":18,"column":5,"offset":795},"end":{"line":18,"column":14,"offset":804},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":791},"end":{"line":18,"column":14,"offset":804},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The landing page of the web is the dashboard. On the dashboard a user will see some statistics: activity per hour, activity per day, a live stream, the latest activity and a heatmap.","position":{"start":{"line":20,"column":1,"offset":806},"end":{"line":20,"column":183,"offset":988},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":806},"end":{"line":20,"column":183,"offset":988},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/web/dashboard.png","alt":"web dashboard","position":{"start":{"line":22,"column":1,"offset":990},"end":{"line":22,"column":56,"offset":1045},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":990},"end":{"line":22,"column":56,"offset":1045},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Overview","position":{"start":{"line":24,"column":5,"offset":1051},"end":{"line":24,"column":13,"offset":1059},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1047},"end":{"line":24,"column":13,"offset":1059},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When selecting a specific day, you'll will get a timeline and overview. By using the timeline you can navigate through a day; the timeline highlights the amount of activity, from gray to red.","position":{"start":{"line":26,"column":1,"offset":1061},"end":{"line":26,"column":192,"offset":1252},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1061},"end":{"line":26,"column":192,"offset":1252},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/web/overview.png","alt":"web overview","position":{"start":{"line":28,"column":1,"offset":1254},"end":{"line":28,"column":54,"offset":1307},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":1254},"end":{"line":28,"column":54,"offset":1307},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Settings","position":{"start":{"line":30,"column":5,"offset":1313},"end":{"line":30,"column":13,"offset":1321},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":1309},"end":{"line":30,"column":13,"offset":1321},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The settings page allows you to configure the machinery. You can define the type of camera, post-processes, conditions and much more; it's highly configurable.","position":{"start":{"line":32,"column":1,"offset":1323},"end":{"line":32,"column":160,"offset":1482},"indent":[]}}],"position":{"start":{"line":32,"column":1,"offset":1323},"end":{"line":32,"column":160,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/web/settings.png","alt":"web settings","position":{"start":{"line":36,"column":1,"offset":1486},"end":{"line":36,"column":54,"offset":1539},"indent":[]}}],"position":{"start":{"line":36,"column":1,"offset":1486},"end":{"line":36,"column":54,"offset":1539},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"System","position":{"start":{"line":38,"column":5,"offset":1545},"end":{"line":38,"column":11,"offset":1551},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":1541},"end":{"line":38,"column":11,"offset":1551},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The system page allows you to monitor the system. On this page you'll get an overview of the system specifications (CPU, Memory, Network, etc). Several actions are available: you can download system information (for debugging purposes) and download or remove your images.","position":{"start":{"line":40,"column":1,"offset":1553},"end":{"line":40,"column":272,"offset":1824},"indent":[]}}],"position":{"start":{"line":40,"column":1,"offset":1553},"end":{"line":40,"column":272,"offset":1824},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/web/system.png","alt":"web system","position":{"start":{"line":42,"column":1,"offset":1826},"end":{"line":42,"column":50,"offset":1875},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":1826},"end":{"line":42,"column":50,"offset":1875},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Project structure","position":{"start":{"line":44,"column":4,"offset":1880},"end":{"line":44,"column":21,"offset":1897},"indent":[]}}],"position":{"start":{"line":44,"column":1,"offset":1877},"end":{"line":44,"column":21,"offset":1897},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The web interface is using the Laravel framework (version 5.4). There is a lot of documentation related to Laravel, please review ","position":{"start":{"line":46,"column":1,"offset":1899},"end":{"line":46,"column":131,"offset":2029},"indent":[]}},{"type":"link","title":null,"url":"https://laravel.com/docs/5.4","children":[{"type":"text","value":"their documentation website here","position":{"start":{"line":46,"column":132,"offset":2030},"end":{"line":46,"column":164,"offset":2062},"indent":[]}}],"position":{"start":{"line":46,"column":131,"offset":2029},"end":{"line":46,"column":195,"offset":2093},"indent":[]}},{"type":"text","value":". In a nutshell this is how the web is organised.","position":{"start":{"line":46,"column":195,"offset":2093},"end":{"line":46,"column":244,"offset":2142},"indent":[]}}],"position":{"start":{"line":46,"column":1,"offset":1899},"end":{"line":46,"column":244,"offset":2142},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Back-end","position":{"start":{"line":48,"column":5,"offset":2148},"end":{"line":48,"column":13,"offset":2156},"indent":[]}}],"position":{"start":{"line":48,"column":1,"offset":2144},"end":{"line":48,"column":13,"offset":2156},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"config/app.php - general application settings.","position":{"start":{"line":50,"column":3,"offset":2160},"end":{"line":50,"column":49,"offset":2206},"indent":[]}}],"position":{"start":{"line":50,"column":3,"offset":2160},"end":{"line":50,"column":49,"offset":2206},"indent":[]}}],"position":{"start":{"line":50,"column":1,"offset":2158},"end":{"line":50,"column":49,"offset":2206},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"config/kerberos.php - this file contains web specific parameters; the user credentials to sign in, etc.","position":{"start":{"line":51,"column":3,"offset":2209},"end":{"line":51,"column":106,"offset":2312},"indent":[]}}],"position":{"start":{"line":51,"column":3,"offset":2209},"end":{"line":51,"column":106,"offset":2312},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":2207},"end":{"line":51,"column":106,"offset":2312},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"app/Http/Controllers - MVC controllers","position":{"start":{"line":52,"column":3,"offset":2315},"end":{"line":52,"column":41,"offset":2353},"indent":[]}}],"position":{"start":{"line":52,"column":3,"offset":2315},"end":{"line":52,"column":41,"offset":2353},"indent":[]}}],"position":{"start":{"line":52,"column":1,"offset":2313},"end":{"line":52,"column":41,"offset":2353},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"app/Http/Repositories -repositories are injected into the controller.","position":{"start":{"line":53,"column":3,"offset":2356},"end":{"line":53,"column":72,"offset":2425},"indent":[]}}],"position":{"start":{"line":53,"column":3,"offset":2356},"end":{"line":53,"column":72,"offset":2425},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":2354},"end":{"line":53,"column":72,"offset":2425},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"app/Providers/AppServiceProvider.php - bind repositories to a specific interface - dependency injection.","position":{"start":{"line":54,"column":3,"offset":2428},"end":{"line":54,"column":107,"offset":2532},"indent":[]}}],"position":{"start":{"line":54,"column":3,"offset":2428},"end":{"line":54,"column":107,"offset":2532},"indent":[]}}],"position":{"start":{"line":54,"column":1,"offset":2426},"end":{"line":54,"column":107,"offset":2532},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"routes/api.php - contains all the URI endpoints for Ajax calls.","position":{"start":{"line":55,"column":3,"offset":2535},"end":{"line":55,"column":66,"offset":2598},"indent":[]}}],"position":{"start":{"line":55,"column":3,"offset":2535},"end":{"line":55,"column":66,"offset":2598},"indent":[]}}],"position":{"start":{"line":55,"column":1,"offset":2533},"end":{"line":55,"column":66,"offset":2598},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"routes/web.php - url routing for pages.","position":{"start":{"line":56,"column":3,"offset":2601},"end":{"line":56,"column":42,"offset":2640},"indent":[]}}],"position":{"start":{"line":56,"column":3,"offset":2601},"end":{"line":56,"column":42,"offset":2640},"indent":[]}}],"position":{"start":{"line":56,"column":1,"offset":2599},"end":{"line":56,"column":42,"offset":2640},"indent":[]}}],"position":{"start":{"line":50,"column":1,"offset":2158},"end":{"line":56,"column":42,"offset":2640},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Front-end","position":{"start":{"line":58,"column":5,"offset":2646},"end":{"line":58,"column":14,"offset":2655},"indent":[]}}],"position":{"start":{"line":58,"column":1,"offset":2642},"end":{"line":58,"column":14,"offset":2655},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/css/less - LESS is used for the CSS.","position":{"start":{"line":60,"column":3,"offset":2659},"end":{"line":60,"column":46,"offset":2702},"indent":[]}}],"position":{"start":{"line":60,"column":3,"offset":2659},"end":{"line":60,"column":46,"offset":2702},"indent":[]}}],"position":{"start":{"line":60,"column":1,"offset":2657},"end":{"line":60,"column":46,"offset":2702},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/js/app - BackboneJS and RequireJS is used for building modular JS classes.","position":{"start":{"line":61,"column":3,"offset":2705},"end":{"line":61,"column":84,"offset":2786},"indent":[]}}],"position":{"start":{"line":61,"column":3,"offset":2705},"end":{"line":61,"column":84,"offset":2786},"indent":[]}}],"position":{"start":{"line":61,"column":1,"offset":2703},"end":{"line":61,"column":84,"offset":2786},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/js/mustache - Mustache is used for the client-side view rendering.","position":{"start":{"line":62,"column":3,"offset":2789},"end":{"line":62,"column":76,"offset":2862},"indent":[]}}],"position":{"start":{"line":62,"column":3,"offset":2789},"end":{"line":62,"column":76,"offset":2862},"indent":[]}}],"position":{"start":{"line":62,"column":1,"offset":2787},"end":{"line":62,"column":76,"offset":2862},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/js/vendor - This is where the bower extensions are installed.","position":{"start":{"line":63,"column":3,"offset":2865},"end":{"line":63,"column":71,"offset":2933},"indent":[]}}],"position":{"start":{"line":63,"column":3,"offset":2865},"end":{"line":63,"column":71,"offset":2933},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":2863},"end":{"line":63,"column":71,"offset":2933},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/capture - A directory where images are written to by default.","position":{"start":{"line":64,"column":3,"offset":2936},"end":{"line":64,"column":71,"offset":3004},"indent":[]}}],"position":{"start":{"line":64,"column":3,"offset":2936},"end":{"line":64,"column":71,"offset":3004},"indent":[]}}],"position":{"start":{"line":64,"column":1,"offset":2934},"end":{"line":64,"column":71,"offset":3004},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/bower.json - The bower extensions used in the web repository.","position":{"start":{"line":65,"column":3,"offset":3007},"end":{"line":65,"column":71,"offset":3075},"indent":[]}}],"position":{"start":{"line":65,"column":3,"offset":3007},"end":{"line":65,"column":71,"offset":3075},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":3005},"end":{"line":65,"column":71,"offset":3075},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/Gruntfile.js - We are using Grunt for our task manager.","position":{"start":{"line":66,"column":3,"offset":3078},"end":{"line":66,"column":65,"offset":3140},"indent":[]}}],"position":{"start":{"line":66,"column":3,"offset":3078},"end":{"line":66,"column":65,"offset":3140},"indent":[]}}],"position":{"start":{"line":66,"column":1,"offset":3076},"end":{"line":66,"column":65,"offset":3140},"indent":[]}}],"position":{"start":{"line":60,"column":1,"offset":2657},"end":{"line":66,"column":65,"offset":3140},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"API","position":{"start":{"line":68,"column":4,"offset":3145},"end":{"line":68,"column":7,"offset":3148},"indent":[]}}],"position":{"start":{"line":68,"column":1,"offset":3142},"end":{"line":68,"column":7,"offset":3148},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to integrate the Kerberos agent with your own application, you're at the right place! The web interface comes with a RESTfull API, that allows you to retrieve and modify information from the Kerberos agent.","position":{"start":{"line":70,"column":1,"offset":3150},"end":{"line":70,"column":219,"offset":3368},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":3150},"end":{"line":70,"column":219,"offset":3368},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disable the machinery","position":{"start":{"line":72,"column":3,"offset":3372},"end":{"line":72,"column":24,"offset":3393},"indent":[]}}],"position":{"start":{"line":72,"column":3,"offset":3372},"end":{"line":72,"column":24,"offset":3393},"indent":[]}}],"position":{"start":{"line":72,"column":1,"offset":3370},"end":{"line":72,"column":24,"offset":3393},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Health check","position":{"start":{"line":73,"column":3,"offset":3396},"end":{"line":73,"column":15,"offset":3408},"indent":[]}}],"position":{"start":{"line":73,"column":3,"offset":3396},"end":{"line":73,"column":15,"offset":3408},"indent":[]}}],"position":{"start":{"line":73,"column":1,"offset":3394},"end":{"line":73,"column":15,"offset":3408},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Enable or disable output devices","position":{"start":{"line":74,"column":3,"offset":3411},"end":{"line":74,"column":35,"offset":3443},"indent":[]}}],"position":{"start":{"line":74,"column":3,"offset":3411},"end":{"line":74,"column":35,"offset":3443},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":3409},"end":{"line":74,"column":35,"offset":3443},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"etc.","position":{"start":{"line":75,"column":3,"offset":3446},"end":{"line":75,"column":7,"offset":3450},"indent":[]}}],"position":{"start":{"line":75,"column":3,"offset":3446},"end":{"line":75,"column":7,"offset":3450},"indent":[]}}],"position":{"start":{"line":75,"column":1,"offset":3444},"end":{"line":75,"column":7,"offset":3450},"indent":[]}}],"position":{"start":{"line":72,"column":1,"offset":3370},"end":{"line":75,"column":7,"offset":3450},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Authentication","position":{"start":{"line":77,"column":5,"offset":3456},"end":{"line":77,"column":19,"offset":3470},"indent":[]}}],"position":{"start":{"line":77,"column":1,"offset":3452},"end":{"line":77,"column":19,"offset":3470},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To use the RESTfull API of your Kerberos agent you need to define an Authorization header with each request. We use Basic Authentication to secure the different endpoints.","position":{"start":{"line":79,"column":1,"offset":3472},"end":{"line":79,"column":172,"offset":3643},"indent":[]}}],"position":{"start":{"line":79,"column":1,"offset":3472},"end":{"line":79,"column":172,"offset":3643},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"\"Authorization\": \"Basic root:root\"","position":{"start":{"line":81,"column":1,"offset":3645},"end":{"line":83,"column":4,"offset":3691},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"An example with Python looks like this.","position":{"start":{"line":85,"column":1,"offset":3693},"end":{"line":85,"column":40,"offset":3732},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":3693},"end":{"line":85,"column":40,"offset":3732},"indent":[]}},{"type":"code","lang":"python","meta":null,"value":"import requests\nimport json\nimport base64\nurl = \"http://ip-of-pi/api/v1/condition/enabled\"\nusername = \"user\"\npassword = \"passw\"\nbasicAuth = base64.b64encode('%s:%s' % (username, password))\nheaders = {\"Authorization\": \"Basic \" + basicAuth, \"Content-Type\": \"application/json\"}\ndata = '{\"active\": \"true\"}'\n#Call REST API\nresponse = requests.put(url, data=data, headers=headers)\nprint(response.text)","position":{"start":{"line":87,"column":1,"offset":3734},"end":{"line":100,"column":4,"offset":4143},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"If you're using the wrong credentials, the web will return following error message.","position":{"start":{"line":102,"column":1,"offset":4145},"end":{"line":102,"column":84,"offset":4228},"indent":[]}}],"position":{"start":{"line":102,"column":1,"offset":4145},"end":{"line":102,"column":84,"offset":4228},"indent":[]}},{"type":"code","lang":"text","meta":null,"value":"Invalid credentials.","position":{"start":{"line":104,"column":1,"offset":4230},"end":{"line":106,"column":4,"offset":4262},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Endpoints","position":{"start":{"line":108,"column":5,"offset":4268},"end":{"line":108,"column":14,"offset":4277},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":4264},"end":{"line":108,"column":14,"offset":4277},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"All endpoints are prefixed with api/v","position":{"start":{"line":110,"column":1,"offset":4279},"end":{"line":110,"column":38,"offset":4316},"indent":[]}},{"type":"linkReference","identifier":"version","label":"version","referenceType":"shortcut","children":[{"type":"text","value":"version","position":{"start":{"line":110,"column":39,"offset":4317},"end":{"line":110,"column":46,"offset":4324},"indent":[]}}],"position":{"start":{"line":110,"column":38,"offset":4316},"end":{"line":110,"column":47,"offset":4325},"indent":[]}},{"type":"text","value":"/, in which the last part defines the API version number. Below you will find all the available endpoints with there signature and response. Note that when you call an endpoint which doesn't exists, the web will throw an 404.","position":{"start":{"line":110,"column":47,"offset":4325},"end":{"line":110,"column":272,"offset":4550},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":4279},"end":{"line":110,"column":272,"offset":4550},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n\t\"error\": \"API method does not exists\"\n}","position":{"start":{"line":112,"column":1,"offset":4552},"end":{"line":116,"column":4,"offset":4606},"indent":[1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Version 1","position":{"start":{"line":118,"column":5,"offset":4612},"end":{"line":118,"column":14,"offset":4621},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":4608},"end":{"line":118,"column":14,"offset":4621},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Below you'll find a list of all API methods which are available for version 1.","position":{"start":{"line":120,"column":1,"offset":4623},"end":{"line":120,"column":79,"offset":4701},"indent":[]}}],"position":{"start":{"line":120,"column":1,"offset":4623},"end":{"line":120,"column":79,"offset":4701},"indent":[]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"GET api/v1/name","position":{"start":{"line":122,"column":1,"offset":4703},"end":{"line":122,"column":18,"offset":4720},"indent":[]}}],"position":{"start":{"line":122,"column":1,"offset":4703},"end":{"line":122,"column":18,"offset":4720},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":124,"column":3,"offset":4724},"end":{"line":124,"column":14,"offset":4735},"indent":[]}}],"position":{"start":{"line":124,"column":1,"offset":4722},"end":{"line":124,"column":16,"offset":4737},"indent":[]}}],"position":{"start":{"line":124,"column":1,"offset":4722},"end":{"line":124,"column":16,"offset":4737},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Retrieve the name of your instance.","position":{"start":{"line":126,"column":1,"offset":4739},"end":{"line":126,"column":36,"offset":4774},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":4739},"end":{"line":126,"column":36,"offset":4774},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":128,"column":3,"offset":4778},"end":{"line":128,"column":11,"offset":4786},"indent":[]}}],"position":{"start":{"line":128,"column":1,"offset":4776},"end":{"line":128,"column":13,"offset":4788},"indent":[]}}],"position":{"start":{"line":128,"column":1,"offset":4776},"end":{"line":128,"column":13,"offset":4788},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n\t\"name\": \"frontdoor\"\n}","position":{"start":{"line":129,"column":1,"offset":4789},"end":{"line":133,"column":4,"offset":4825},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"PUT api/v1/name","position":{"start":{"line":135,"column":1,"offset":4827},"end":{"line":135,"column":18,"offset":4844},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4827},"end":{"line":135,"column":18,"offset":4844},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":137,"column":3,"offset":4848},"end":{"line":137,"column":14,"offset":4859},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4846},"end":{"line":137,"column":16,"offset":4861},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4846},"end":{"line":137,"column":16,"offset":4861},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Change the name of your instance.","position":{"start":{"line":139,"column":1,"offset":4863},"end":{"line":139,"column":34,"offset":4896},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4863},"end":{"line":139,"column":34,"offset":4896},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Payload","position":{"start":{"line":141,"column":3,"offset":4900},"end":{"line":141,"column":10,"offset":4907},"indent":[]}}],"position":{"start":{"line":141,"column":1,"offset":4898},"end":{"line":141,"column":12,"offset":4909},"indent":[]}}],"position":{"start":{"line":141,"column":1,"offset":4898},"end":{"line":141,"column":12,"offset":4909},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n\t\"name\": \"frontdoor-changed\"\n}","position":{"start":{"line":142,"column":1,"offset":4910},"end":{"line":146,"column":4,"offset":4954},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":148,"column":3,"offset":4958},"end":{"line":148,"column":11,"offset":4966},"indent":[]}}],"position":{"start":{"line":148,"column":1,"offset":4956},"end":{"line":148,"column":13,"offset":4968},"indent":[]}}],"position":{"start":{"line":148,"column":1,"offset":4956},"end":{"line":148,"column":13,"offset":4968},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n\t\"name\": \"frontdoor-changed\"\n}","position":{"start":{"line":149,"column":1,"offset":4969},"end":{"line":153,"column":4,"offset":5013},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"GET api/v1/images/latest_sequence","position":{"start":{"line":155,"column":1,"offset":5015},"end":{"line":155,"column":36,"offset":5050},"indent":[]}}],"position":{"start":{"line":155,"column":1,"offset":5015},"end":{"line":155,"column":36,"offset":5050},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":157,"column":3,"offset":5054},"end":{"line":157,"column":14,"offset":5065},"indent":[]}}],"position":{"start":{"line":157,"column":1,"offset":5052},"end":{"line":157,"column":16,"offset":5067},"indent":[]}}],"position":{"start":{"line":157,"column":1,"offset":5052},"end":{"line":157,"column":16,"offset":5067},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Retrieve the latest sequence detected.","position":{"start":{"line":159,"column":1,"offset":5069},"end":{"line":159,"column":39,"offset":5107},"indent":[]}}],"position":{"start":{"line":159,"column":1,"offset":5069},"end":{"line":159,"column":39,"offset":5107},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":161,"column":3,"offset":5111},"end":{"line":161,"column":11,"offset":5119},"indent":[]}}],"position":{"start":{"line":161,"column":1,"offset":5109},"end":{"line":161,"column":13,"offset":5121},"indent":[]}}],"position":{"start":{"line":161,"column":1,"offset":5109},"end":{"line":161,"column":13,"offset":5121},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"[\n {\n time: \"10:59:57\",\n src: \"https://demo.kerberos.io/capture/1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\",\n local_src: \"/var/www/web/public/capture/1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\",\n metadata: {\n key: \"1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\",\n user: \"1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\",\n timestamp: 1501491597,\n microseconds: \"6-310145\",\n instanceName: \"frontdoor\",\n regionCoordinates: \"722-691-873-926\",\n numberOfChanges: \"703\",\n token: \"511\"\n },\n type: \"video\"\n }\n]","position":{"start":{"line":162,"column":1,"offset":5122},"end":{"line":181,"column":4,"offset":5823},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"GET api/v1/condition/enabled","position":{"start":{"line":183,"column":1,"offset":5825},"end":{"line":183,"column":31,"offset":5855},"indent":[]}}],"position":{"start":{"line":183,"column":1,"offset":5825},"end":{"line":183,"column":31,"offset":5855},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":185,"column":3,"offset":5859},"end":{"line":185,"column":14,"offset":5870},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":5857},"end":{"line":185,"column":16,"offset":5872},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":5857},"end":{"line":185,"column":16,"offset":5872},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Check if enabled or disabled.","position":{"start":{"line":187,"column":1,"offset":5874},"end":{"line":187,"column":30,"offset":5903},"indent":[]}}],"position":{"start":{"line":187,"column":1,"offset":5874},"end":{"line":187,"column":30,"offset":5903},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":189,"column":3,"offset":5907},"end":{"line":189,"column":11,"offset":5915},"indent":[]}}],"position":{"start":{"line":189,"column":1,"offset":5905},"end":{"line":189,"column":13,"offset":5917},"indent":[]}}],"position":{"start":{"line":189,"column":1,"offset":5905},"end":{"line":189,"column":13,"offset":5917},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n \t\"active\": \"true\",\n \t\"delay\": \"5000\"\n}","position":{"start":{"line":190,"column":1,"offset":5918},"end":{"line":195,"column":4,"offset":5971},"indent":[1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"PUT api/v1/condition/enabled","position":{"start":{"line":197,"column":1,"offset":5973},"end":{"line":197,"column":31,"offset":6003},"indent":[]}}],"position":{"start":{"line":197,"column":1,"offset":5973},"end":{"line":197,"column":31,"offset":6003},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":199,"column":3,"offset":6007},"end":{"line":199,"column":14,"offset":6018},"indent":[]}}],"position":{"start":{"line":199,"column":1,"offset":6005},"end":{"line":199,"column":16,"offset":6020},"indent":[]}}],"position":{"start":{"line":199,"column":1,"offset":6005},"end":{"line":199,"column":16,"offset":6020},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Activate or disable the system.","position":{"start":{"line":201,"column":1,"offset":6022},"end":{"line":201,"column":32,"offset":6053},"indent":[]}}],"position":{"start":{"line":201,"column":1,"offset":6022},"end":{"line":201,"column":32,"offset":6053},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Payload","position":{"start":{"line":203,"column":3,"offset":6057},"end":{"line":203,"column":10,"offset":6064},"indent":[]}}],"position":{"start":{"line":203,"column":1,"offset":6055},"end":{"line":203,"column":12,"offset":6066},"indent":[]}}],"position":{"start":{"line":203,"column":1,"offset":6055},"end":{"line":203,"column":12,"offset":6066},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n \t\"active\": \"false\"\n}","position":{"start":{"line":204,"column":1,"offset":6067},"end":{"line":208,"column":4,"offset":6102},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":210,"column":3,"offset":6106},"end":{"line":210,"column":11,"offset":6114},"indent":[]}}],"position":{"start":{"line":210,"column":1,"offset":6104},"end":{"line":210,"column":13,"offset":6116},"indent":[]}}],"position":{"start":{"line":210,"column":1,"offset":6104},"end":{"line":210,"column":13,"offset":6116},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n \t\"active\": \"false\",\n \t\"delay\": \"5000\"\n}","position":{"start":{"line":211,"column":1,"offset":6117},"end":{"line":216,"column":4,"offset":6171},"indent":[1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"GET api/v1/system/health","position":{"start":{"line":218,"column":1,"offset":6173},"end":{"line":218,"column":27,"offset":6199},"indent":[]}}],"position":{"start":{"line":218,"column":1,"offset":6173},"end":{"line":218,"column":27,"offset":6199},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":220,"column":3,"offset":6203},"end":{"line":220,"column":14,"offset":6214},"indent":[]}}],"position":{"start":{"line":220,"column":1,"offset":6201},"end":{"line":220,"column":16,"offset":6216},"indent":[]}}],"position":{"start":{"line":220,"column":1,"offset":6201},"end":{"line":220,"column":16,"offset":6216},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Check if the machinery is running (the stream is connected).","position":{"start":{"line":222,"column":1,"offset":6218},"end":{"line":222,"column":61,"offset":6278},"indent":[]}}],"position":{"start":{"line":222,"column":1,"offset":6218},"end":{"line":222,"column":61,"offset":6278},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":224,"column":3,"offset":6282},"end":{"line":224,"column":11,"offset":6290},"indent":[]}}],"position":{"start":{"line":224,"column":1,"offset":6280},"end":{"line":224,"column":13,"offset":6292},"indent":[]}}],"position":{"start":{"line":224,"column":1,"offset":6280},"end":{"line":224,"column":13,"offset":6292},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n \t\"status\": \"false\"\n}","position":{"start":{"line":225,"column":1,"offset":6293},"end":{"line":229,"column":4,"offset":6328},"indent":[1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":232,"column":1,"offset":6331},"end":{"line":232,"column":31,"offset":6361},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":232,"column":31,"offset":6361}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Web interface`}

\n

{`The web is responsible for the visualization. It's a GUI which helps the user to find activity at a specific period, configure the machinery, view a live stream, see system information and much more.`}

\n

{`It's written in PHP using the extremely popular PHP Framework Laravel, and Javascript using the client-side framework BackboneJS. We will discuss the different pages and functionality briefly. Please check out `}{`the demo environment`}{` if you want to see a real life example.`}

\n

{`Overview`}

\n

{`We will shortly discuss the different pages that make up the web interface of Kerberos Open Source.`}

\n

{`Dashboard`}

\n

{`The landing page of the web is the dashboard. On the dashboard a user will see some statistics: activity per hour, activity per day, a live stream, the latest activity and a heatmap.`}

\n

\"web

\n

{`Overview`}

\n

{`When selecting a specific day, you'll will get a timeline and overview. By using the timeline you can navigate through a day; the timeline highlights the amount of activity, from gray to red.`}

\n

\"web

\n

{`Settings`}

\n

{`The settings page allows you to configure the machinery. You can define the type of camera, post-processes, conditions and much more; it's highly configurable.`}

\n

\"web

\n

{`System`}

\n

{`The system page allows you to monitor the system. On this page you'll get an overview of the system specifications (CPU, Memory, Network, etc). Several actions are available: you can download system information (for debugging purposes) and download or remove your images.`}

\n

\"web

\n

{`Project structure`}

\n

{`The web interface is using the Laravel framework (version 5.4). There is a lot of documentation related to Laravel, please review `}{`their documentation website here`}{`. In a nutshell this is how the web is organised.`}

\n

{`Back-end`}

\n
    \n
  • {`config/app.php - general application settings.`}
  • \n
  • {`config/kerberos.php - this file contains web specific parameters; the user credentials to sign in, etc.`}
  • \n
  • {`app/Http/Controllers - MVC controllers`}
  • \n
  • {`app/Http/Repositories -repositories are injected into the controller.`}
  • \n
  • {`app/Providers/AppServiceProvider.php - bind repositories to a specific interface - dependency injection.`}
  • \n
  • {`routes/api.php - contains all the URI endpoints for Ajax calls.`}
  • \n
  • {`routes/web.php - url routing for pages.`}
  • \n
\n

{`Front-end`}

\n
    \n
  • {`public/css/less - LESS is used for the CSS.`}
  • \n
  • {`public/js/app - BackboneJS and RequireJS is used for building modular JS classes.`}
  • \n
  • {`public/js/mustache - Mustache is used for the client-side view rendering.`}
  • \n
  • {`public/js/vendor - This is where the bower extensions are installed.`}
  • \n
  • {`public/capture - A directory where images are written to by default.`}
  • \n
  • {`public/bower.json - The bower extensions used in the web repository.`}
  • \n
  • {`public/Gruntfile.js - We are using Grunt for our task manager.`}
  • \n
\n

{`API`}

\n

{`If you want to integrate the Kerberos agent with your own application, you're at the right place! The web interface comes with a RESTfull API, that allows you to retrieve and modify information from the Kerberos agent.`}

\n
    \n
  • {`Disable the machinery`}
  • \n
  • {`Health check`}
  • \n
  • {`Enable or disable output devices`}
  • \n
  • {`etc.`}
  • \n
\n

{`Authentication`}

\n

{`To use the RESTfull API of your Kerberos agent you need to define an Authorization header with each request. We use Basic Authentication to secure the different endpoints.`}

\n
{`\"Authorization\"`}{`: `}{`\"Basic root:root\"`}
\n

{`An example with Python looks like this.`}

\n
{`import`}{` requests`}{`\n`}{`import`}{` json`}{`\n`}{`import`}{` base64`}{`\n`}{`url = `}{`\"http://ip-of-pi/api/v1/condition/enabled\"`}{`\n`}{`username = `}{`\"user\"`}{`\n`}{`password = `}{`\"passw\"`}{`\n`}{`basicAuth = base64.b64encode(`}{`'`}{`%s`}{`:`}{`%s`}{`'`}{` % (username, password))`}{`\n`}{`headers = {`}{`\"Authorization\"`}{`: `}{`\"Basic \"`}{` + basicAuth, `}{`\"Content-Type\"`}{`: `}{`\"application/json\"`}{`}`}{`\n`}{`data = `}{`'{\"active\": \"true\"}'`}{`\n`}{`#Call REST API`}{`\n`}{`response = requests.put(url, `}{`data`}{`=data, `}{`headers`}{`=headers)`}{`\n`}{`print`}{`(response.text)`}
\n

{`If you're using the wrong credentials, the web will return following error message.`}

\n
{`Invalid credentials.`}
\n

{`Endpoints`}

\n

{`All endpoints are prefixed with api/v`}{`[version]`}{`/, in which the last part defines the API version number. Below you will find all the available endpoints with there signature and response. Note that when you call an endpoint which doesn't exists, the web will throw an 404.`}

\n
{`{`}{`\n`}{`\t`}{`\"error\"`}{`: `}{`\"API method does not exists\"`}{`\n`}{`}`}
\n

{`Version 1`}

\n

{`Below you'll find a list of all API methods which are available for version 1.`}

\n

{`GET api/v1/name`}

\n

{`Description`}

\n

{`Retrieve the name of your instance.`}

\n

{`Response`}

\n
{`{`}{`\n`}{`\t`}{`\"name\"`}{`: `}{`\"frontdoor\"`}{`\n`}{`}`}
\n

{`PUT api/v1/name`}

\n

{`Description`}

\n

{`Change the name of your instance.`}

\n

{`Payload`}

\n
{`{`}{`\n`}{`\t`}{`\"name\"`}{`: `}{`\"frontdoor-changed\"`}{`\n`}{`}`}
\n

{`Response`}

\n
{`{`}{`\n`}{`\t`}{`\"name\"`}{`: `}{`\"frontdoor-changed\"`}{`\n`}{`}`}
\n

{`GET api/v1/images/latest_sequence`}

\n

{`Description`}

\n

{`Retrieve the latest sequence detected.`}

\n

{`Response`}

\n
{`[`}{`\n`}{`    {`}{`\n`}{`        `}{`time`}{`: `}{`\"10:59:57\"`}{`,`}{`\n`}{`        `}{`src`}{`: `}{`\"https://demo.kerberos.io/capture/1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\"`}{`,`}{`\n`}{`        `}{`local_src`}{`: `}{`\"/var/www/web/public/capture/1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\"`}{`,`}{`\n`}{`        `}{`metadata`}{`: {`}{`\n`}{`            `}{`key`}{`: `}{`\"1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\"`}{`,`}{`\n`}{`            `}{`user`}{`: `}{`\"1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\"`}{`,`}{`\n`}{`            `}{`timestamp`}{`: `}{`1501491597`}{`,`}{`\n`}{`            `}{`microseconds`}{`: `}{`\"6-310145\"`}{`,`}{`\n`}{`            `}{`instanceName`}{`: `}{`\"frontdoor\"`}{`,`}{`\n`}{`            `}{`regionCoordinates`}{`: `}{`\"722-691-873-926\"`}{`,`}{`\n`}{`            `}{`numberOfChanges`}{`: `}{`\"703\"`}{`,`}{`\n`}{`            `}{`token`}{`: `}{`\"511\"`}{`\n`}{`        },`}{`\n`}{`        `}{`type`}{`: `}{`\"video\"`}{`\n`}{`    }`}{`\n`}{`]`}
\n

{`GET api/v1/condition/enabled`}

\n

{`Description`}

\n

{`Check if enabled or disabled.`}

\n

{`Response`}

\n
{`{`}{`\n`}{` \t`}{`\"active\"`}{`: `}{`\"true\"`}{`,`}{`\n`}{` \t`}{`\"delay\"`}{`: `}{`\"5000\"`}{`\n`}{`}`}
\n

{`PUT api/v1/condition/enabled`}

\n

{`Description`}

\n

{`Activate or disable the system.`}

\n

{`Payload`}

\n
{`{`}{`\n`}{` \t`}{`\"active\"`}{`: `}{`\"false\"`}{`\n`}{`}`}
\n

{`Response`}

\n
{`{`}{`\n`}{` \t`}{`\"active\"`}{`: `}{`\"false\"`}{`,`}{`\n`}{` \t`}{`\"delay\"`}{`: `}{`\"5000\"`}{`\n`}{`}`}
\n

{`GET api/v1/system/health`}

\n

{`Description`}

\n

{`Check if the machinery is running (the stream is connected).`}

\n

{`Response`}

\n
{`{`}{`\n`}{` \t`}{`\"status\"`}{`: `}{`\"false\"`}{`\n`}{`}`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760430000,"key":"gatsby-plugin-mdx-entire-payload-ce6120d685d56b5ffef1f440aeebbc68-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Web interface","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":16,"offset":174},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":16,"offset":174},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The web is responsible for the visualization. It's a GUI which helps the user to find activity at a specific period, configure the machinery, view a live stream, see system information and much more.","position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":200,"offset":375},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":200,"offset":375},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"It's written in PHP using the extremely popular PHP Framework Laravel, and Javascript using the client-side framework BackboneJS. We will discuss the different pages and functionality briefly. Please check out ","position":{"start":{"line":12,"column":1,"offset":377},"end":{"line":12,"column":211,"offset":587},"indent":[]}},{"type":"link","title":null,"url":"https://demo.kerberos.io","children":[{"type":"text","value":"the demo environment","position":{"start":{"line":12,"column":212,"offset":588},"end":{"line":12,"column":232,"offset":608},"indent":[]}}],"position":{"start":{"line":12,"column":211,"offset":587},"end":{"line":12,"column":259,"offset":635},"indent":[]}},{"type":"text","value":" if you want to see a real life example.","position":{"start":{"line":12,"column":259,"offset":635},"end":{"line":12,"column":299,"offset":675},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":377},"end":{"line":12,"column":299,"offset":675},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Overview","position":{"start":{"line":14,"column":4,"offset":680},"end":{"line":14,"column":12,"offset":688},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":677},"end":{"line":14,"column":12,"offset":688},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"We will shortly discuss the different pages that make up the web interface of Kerberos Open Source.","position":{"start":{"line":16,"column":1,"offset":690},"end":{"line":16,"column":100,"offset":789},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":690},"end":{"line":16,"column":100,"offset":789},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Dashboard","position":{"start":{"line":18,"column":5,"offset":795},"end":{"line":18,"column":14,"offset":804},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":791},"end":{"line":18,"column":14,"offset":804},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The landing page of the web is the dashboard. On the dashboard a user will see some statistics: activity per hour, activity per day, a live stream, the latest activity and a heatmap.","position":{"start":{"line":20,"column":1,"offset":806},"end":{"line":20,"column":183,"offset":988},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":806},"end":{"line":20,"column":183,"offset":988},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/web/dashboard.png","alt":"web dashboard","position":{"start":{"line":22,"column":1,"offset":990},"end":{"line":22,"column":56,"offset":1045},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":990},"end":{"line":22,"column":56,"offset":1045},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Overview","position":{"start":{"line":24,"column":5,"offset":1051},"end":{"line":24,"column":13,"offset":1059},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1047},"end":{"line":24,"column":13,"offset":1059},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When selecting a specific day, you'll will get a timeline and overview. By using the timeline you can navigate through a day; the timeline highlights the amount of activity, from gray to red.","position":{"start":{"line":26,"column":1,"offset":1061},"end":{"line":26,"column":192,"offset":1252},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1061},"end":{"line":26,"column":192,"offset":1252},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/web/overview.png","alt":"web overview","position":{"start":{"line":28,"column":1,"offset":1254},"end":{"line":28,"column":54,"offset":1307},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":1254},"end":{"line":28,"column":54,"offset":1307},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Settings","position":{"start":{"line":30,"column":5,"offset":1313},"end":{"line":30,"column":13,"offset":1321},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":1309},"end":{"line":30,"column":13,"offset":1321},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The settings page allows you to configure the machinery. You can define the type of camera, post-processes, conditions and much more; it's highly configurable.","position":{"start":{"line":32,"column":1,"offset":1323},"end":{"line":32,"column":160,"offset":1482},"indent":[]}}],"position":{"start":{"line":32,"column":1,"offset":1323},"end":{"line":32,"column":160,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/web/settings.png","alt":"web settings","position":{"start":{"line":36,"column":1,"offset":1486},"end":{"line":36,"column":54,"offset":1539},"indent":[]}}],"position":{"start":{"line":36,"column":1,"offset":1486},"end":{"line":36,"column":54,"offset":1539},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"System","position":{"start":{"line":38,"column":5,"offset":1545},"end":{"line":38,"column":11,"offset":1551},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":1541},"end":{"line":38,"column":11,"offset":1551},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The system page allows you to monitor the system. On this page you'll get an overview of the system specifications (CPU, Memory, Network, etc). Several actions are available: you can download system information (for debugging purposes) and download or remove your images.","position":{"start":{"line":40,"column":1,"offset":1553},"end":{"line":40,"column":272,"offset":1824},"indent":[]}}],"position":{"start":{"line":40,"column":1,"offset":1553},"end":{"line":40,"column":272,"offset":1824},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/web/system.png","alt":"web system","position":{"start":{"line":42,"column":1,"offset":1826},"end":{"line":42,"column":50,"offset":1875},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":1826},"end":{"line":42,"column":50,"offset":1875},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Project structure","position":{"start":{"line":44,"column":4,"offset":1880},"end":{"line":44,"column":21,"offset":1897},"indent":[]}}],"position":{"start":{"line":44,"column":1,"offset":1877},"end":{"line":44,"column":21,"offset":1897},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The web interface is using the Laravel framework (version 5.4). There is a lot of documentation related to Laravel, please review ","position":{"start":{"line":46,"column":1,"offset":1899},"end":{"line":46,"column":131,"offset":2029},"indent":[]}},{"type":"link","title":null,"url":"https://laravel.com/docs/5.4","children":[{"type":"text","value":"their documentation website here","position":{"start":{"line":46,"column":132,"offset":2030},"end":{"line":46,"column":164,"offset":2062},"indent":[]}}],"position":{"start":{"line":46,"column":131,"offset":2029},"end":{"line":46,"column":195,"offset":2093},"indent":[]}},{"type":"text","value":". In a nutshell this is how the web is organised.","position":{"start":{"line":46,"column":195,"offset":2093},"end":{"line":46,"column":244,"offset":2142},"indent":[]}}],"position":{"start":{"line":46,"column":1,"offset":1899},"end":{"line":46,"column":244,"offset":2142},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Back-end","position":{"start":{"line":48,"column":5,"offset":2148},"end":{"line":48,"column":13,"offset":2156},"indent":[]}}],"position":{"start":{"line":48,"column":1,"offset":2144},"end":{"line":48,"column":13,"offset":2156},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"config/app.php - general application settings.","position":{"start":{"line":50,"column":3,"offset":2160},"end":{"line":50,"column":49,"offset":2206},"indent":[]}}],"position":{"start":{"line":50,"column":3,"offset":2160},"end":{"line":50,"column":49,"offset":2206},"indent":[]}}],"position":{"start":{"line":50,"column":1,"offset":2158},"end":{"line":50,"column":49,"offset":2206},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"config/kerberos.php - this file contains web specific parameters; the user credentials to sign in, etc.","position":{"start":{"line":51,"column":3,"offset":2209},"end":{"line":51,"column":106,"offset":2312},"indent":[]}}],"position":{"start":{"line":51,"column":3,"offset":2209},"end":{"line":51,"column":106,"offset":2312},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":2207},"end":{"line":51,"column":106,"offset":2312},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"app/Http/Controllers - MVC controllers","position":{"start":{"line":52,"column":3,"offset":2315},"end":{"line":52,"column":41,"offset":2353},"indent":[]}}],"position":{"start":{"line":52,"column":3,"offset":2315},"end":{"line":52,"column":41,"offset":2353},"indent":[]}}],"position":{"start":{"line":52,"column":1,"offset":2313},"end":{"line":52,"column":41,"offset":2353},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"app/Http/Repositories -repositories are injected into the controller.","position":{"start":{"line":53,"column":3,"offset":2356},"end":{"line":53,"column":72,"offset":2425},"indent":[]}}],"position":{"start":{"line":53,"column":3,"offset":2356},"end":{"line":53,"column":72,"offset":2425},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":2354},"end":{"line":53,"column":72,"offset":2425},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"app/Providers/AppServiceProvider.php - bind repositories to a specific interface - dependency injection.","position":{"start":{"line":54,"column":3,"offset":2428},"end":{"line":54,"column":107,"offset":2532},"indent":[]}}],"position":{"start":{"line":54,"column":3,"offset":2428},"end":{"line":54,"column":107,"offset":2532},"indent":[]}}],"position":{"start":{"line":54,"column":1,"offset":2426},"end":{"line":54,"column":107,"offset":2532},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"routes/api.php - contains all the URI endpoints for Ajax calls.","position":{"start":{"line":55,"column":3,"offset":2535},"end":{"line":55,"column":66,"offset":2598},"indent":[]}}],"position":{"start":{"line":55,"column":3,"offset":2535},"end":{"line":55,"column":66,"offset":2598},"indent":[]}}],"position":{"start":{"line":55,"column":1,"offset":2533},"end":{"line":55,"column":66,"offset":2598},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"routes/web.php - url routing for pages.","position":{"start":{"line":56,"column":3,"offset":2601},"end":{"line":56,"column":42,"offset":2640},"indent":[]}}],"position":{"start":{"line":56,"column":3,"offset":2601},"end":{"line":56,"column":42,"offset":2640},"indent":[]}}],"position":{"start":{"line":56,"column":1,"offset":2599},"end":{"line":56,"column":42,"offset":2640},"indent":[]}}],"position":{"start":{"line":50,"column":1,"offset":2158},"end":{"line":56,"column":42,"offset":2640},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Front-end","position":{"start":{"line":58,"column":5,"offset":2646},"end":{"line":58,"column":14,"offset":2655},"indent":[]}}],"position":{"start":{"line":58,"column":1,"offset":2642},"end":{"line":58,"column":14,"offset":2655},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/css/less - LESS is used for the CSS.","position":{"start":{"line":60,"column":3,"offset":2659},"end":{"line":60,"column":46,"offset":2702},"indent":[]}}],"position":{"start":{"line":60,"column":3,"offset":2659},"end":{"line":60,"column":46,"offset":2702},"indent":[]}}],"position":{"start":{"line":60,"column":1,"offset":2657},"end":{"line":60,"column":46,"offset":2702},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/js/app - BackboneJS and RequireJS is used for building modular JS classes.","position":{"start":{"line":61,"column":3,"offset":2705},"end":{"line":61,"column":84,"offset":2786},"indent":[]}}],"position":{"start":{"line":61,"column":3,"offset":2705},"end":{"line":61,"column":84,"offset":2786},"indent":[]}}],"position":{"start":{"line":61,"column":1,"offset":2703},"end":{"line":61,"column":84,"offset":2786},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/js/mustache - Mustache is used for the client-side view rendering.","position":{"start":{"line":62,"column":3,"offset":2789},"end":{"line":62,"column":76,"offset":2862},"indent":[]}}],"position":{"start":{"line":62,"column":3,"offset":2789},"end":{"line":62,"column":76,"offset":2862},"indent":[]}}],"position":{"start":{"line":62,"column":1,"offset":2787},"end":{"line":62,"column":76,"offset":2862},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/js/vendor - This is where the bower extensions are installed.","position":{"start":{"line":63,"column":3,"offset":2865},"end":{"line":63,"column":71,"offset":2933},"indent":[]}}],"position":{"start":{"line":63,"column":3,"offset":2865},"end":{"line":63,"column":71,"offset":2933},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":2863},"end":{"line":63,"column":71,"offset":2933},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/capture - A directory where images are written to by default.","position":{"start":{"line":64,"column":3,"offset":2936},"end":{"line":64,"column":71,"offset":3004},"indent":[]}}],"position":{"start":{"line":64,"column":3,"offset":2936},"end":{"line":64,"column":71,"offset":3004},"indent":[]}}],"position":{"start":{"line":64,"column":1,"offset":2934},"end":{"line":64,"column":71,"offset":3004},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/bower.json - The bower extensions used in the web repository.","position":{"start":{"line":65,"column":3,"offset":3007},"end":{"line":65,"column":71,"offset":3075},"indent":[]}}],"position":{"start":{"line":65,"column":3,"offset":3007},"end":{"line":65,"column":71,"offset":3075},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":3005},"end":{"line":65,"column":71,"offset":3075},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"public/Gruntfile.js - We are using Grunt for our task manager.","position":{"start":{"line":66,"column":3,"offset":3078},"end":{"line":66,"column":65,"offset":3140},"indent":[]}}],"position":{"start":{"line":66,"column":3,"offset":3078},"end":{"line":66,"column":65,"offset":3140},"indent":[]}}],"position":{"start":{"line":66,"column":1,"offset":3076},"end":{"line":66,"column":65,"offset":3140},"indent":[]}}],"position":{"start":{"line":60,"column":1,"offset":2657},"end":{"line":66,"column":65,"offset":3140},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"API","position":{"start":{"line":68,"column":4,"offset":3145},"end":{"line":68,"column":7,"offset":3148},"indent":[]}}],"position":{"start":{"line":68,"column":1,"offset":3142},"end":{"line":68,"column":7,"offset":3148},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you want to integrate the Kerberos agent with your own application, you're at the right place! The web interface comes with a RESTfull API, that allows you to retrieve and modify information from the Kerberos agent.","position":{"start":{"line":70,"column":1,"offset":3150},"end":{"line":70,"column":219,"offset":3368},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":3150},"end":{"line":70,"column":219,"offset":3368},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Disable the machinery","position":{"start":{"line":72,"column":3,"offset":3372},"end":{"line":72,"column":24,"offset":3393},"indent":[]}}],"position":{"start":{"line":72,"column":3,"offset":3372},"end":{"line":72,"column":24,"offset":3393},"indent":[]}}],"position":{"start":{"line":72,"column":1,"offset":3370},"end":{"line":72,"column":24,"offset":3393},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Health check","position":{"start":{"line":73,"column":3,"offset":3396},"end":{"line":73,"column":15,"offset":3408},"indent":[]}}],"position":{"start":{"line":73,"column":3,"offset":3396},"end":{"line":73,"column":15,"offset":3408},"indent":[]}}],"position":{"start":{"line":73,"column":1,"offset":3394},"end":{"line":73,"column":15,"offset":3408},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Enable or disable output devices","position":{"start":{"line":74,"column":3,"offset":3411},"end":{"line":74,"column":35,"offset":3443},"indent":[]}}],"position":{"start":{"line":74,"column":3,"offset":3411},"end":{"line":74,"column":35,"offset":3443},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":3409},"end":{"line":74,"column":35,"offset":3443},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"etc.","position":{"start":{"line":75,"column":3,"offset":3446},"end":{"line":75,"column":7,"offset":3450},"indent":[]}}],"position":{"start":{"line":75,"column":3,"offset":3446},"end":{"line":75,"column":7,"offset":3450},"indent":[]}}],"position":{"start":{"line":75,"column":1,"offset":3444},"end":{"line":75,"column":7,"offset":3450},"indent":[]}}],"position":{"start":{"line":72,"column":1,"offset":3370},"end":{"line":75,"column":7,"offset":3450},"indent":[1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Authentication","position":{"start":{"line":77,"column":5,"offset":3456},"end":{"line":77,"column":19,"offset":3470},"indent":[]}}],"position":{"start":{"line":77,"column":1,"offset":3452},"end":{"line":77,"column":19,"offset":3470},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To use the RESTfull API of your Kerberos agent you need to define an Authorization header with each request. We use Basic Authentication to secure the different endpoints.","position":{"start":{"line":79,"column":1,"offset":3472},"end":{"line":79,"column":172,"offset":3643},"indent":[]}}],"position":{"start":{"line":79,"column":1,"offset":3472},"end":{"line":79,"column":172,"offset":3643},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"\"Authorization\": \"Basic root:root\"","position":{"start":{"line":81,"column":1,"offset":3645},"end":{"line":83,"column":4,"offset":3691},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"An example with Python looks like this.","position":{"start":{"line":85,"column":1,"offset":3693},"end":{"line":85,"column":40,"offset":3732},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":3693},"end":{"line":85,"column":40,"offset":3732},"indent":[]}},{"type":"code","lang":"python","meta":null,"value":"import requests\nimport json\nimport base64\nurl = \"http://ip-of-pi/api/v1/condition/enabled\"\nusername = \"user\"\npassword = \"passw\"\nbasicAuth = base64.b64encode('%s:%s' % (username, password))\nheaders = {\"Authorization\": \"Basic \" + basicAuth, \"Content-Type\": \"application/json\"}\ndata = '{\"active\": \"true\"}'\n#Call REST API\nresponse = requests.put(url, data=data, headers=headers)\nprint(response.text)","position":{"start":{"line":87,"column":1,"offset":3734},"end":{"line":100,"column":4,"offset":4143},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"text","value":"If you're using the wrong credentials, the web will return following error message.","position":{"start":{"line":102,"column":1,"offset":4145},"end":{"line":102,"column":84,"offset":4228},"indent":[]}}],"position":{"start":{"line":102,"column":1,"offset":4145},"end":{"line":102,"column":84,"offset":4228},"indent":[]}},{"type":"code","lang":"text","meta":null,"value":"Invalid credentials.","position":{"start":{"line":104,"column":1,"offset":4230},"end":{"line":106,"column":4,"offset":4262},"indent":[1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Endpoints","position":{"start":{"line":108,"column":5,"offset":4268},"end":{"line":108,"column":14,"offset":4277},"indent":[]}}],"position":{"start":{"line":108,"column":1,"offset":4264},"end":{"line":108,"column":14,"offset":4277},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"All endpoints are prefixed with api/v","position":{"start":{"line":110,"column":1,"offset":4279},"end":{"line":110,"column":38,"offset":4316},"indent":[]}},{"type":"linkReference","identifier":"version","label":"version","referenceType":"shortcut","children":[{"type":"text","value":"version","position":{"start":{"line":110,"column":39,"offset":4317},"end":{"line":110,"column":46,"offset":4324},"indent":[]}}],"position":{"start":{"line":110,"column":38,"offset":4316},"end":{"line":110,"column":47,"offset":4325},"indent":[]}},{"type":"text","value":"/, in which the last part defines the API version number. Below you will find all the available endpoints with there signature and response. Note that when you call an endpoint which doesn't exists, the web will throw an 404.","position":{"start":{"line":110,"column":47,"offset":4325},"end":{"line":110,"column":272,"offset":4550},"indent":[]}}],"position":{"start":{"line":110,"column":1,"offset":4279},"end":{"line":110,"column":272,"offset":4550},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n\t\"error\": \"API method does not exists\"\n}","position":{"start":{"line":112,"column":1,"offset":4552},"end":{"line":116,"column":4,"offset":4606},"indent":[1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Version 1","position":{"start":{"line":118,"column":5,"offset":4612},"end":{"line":118,"column":14,"offset":4621},"indent":[]}}],"position":{"start":{"line":118,"column":1,"offset":4608},"end":{"line":118,"column":14,"offset":4621},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Below you'll find a list of all API methods which are available for version 1.","position":{"start":{"line":120,"column":1,"offset":4623},"end":{"line":120,"column":79,"offset":4701},"indent":[]}}],"position":{"start":{"line":120,"column":1,"offset":4623},"end":{"line":120,"column":79,"offset":4701},"indent":[]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"GET api/v1/name","position":{"start":{"line":122,"column":1,"offset":4703},"end":{"line":122,"column":18,"offset":4720},"indent":[]}}],"position":{"start":{"line":122,"column":1,"offset":4703},"end":{"line":122,"column":18,"offset":4720},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":124,"column":3,"offset":4724},"end":{"line":124,"column":14,"offset":4735},"indent":[]}}],"position":{"start":{"line":124,"column":1,"offset":4722},"end":{"line":124,"column":16,"offset":4737},"indent":[]}}],"position":{"start":{"line":124,"column":1,"offset":4722},"end":{"line":124,"column":16,"offset":4737},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Retrieve the name of your instance.","position":{"start":{"line":126,"column":1,"offset":4739},"end":{"line":126,"column":36,"offset":4774},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":4739},"end":{"line":126,"column":36,"offset":4774},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":128,"column":3,"offset":4778},"end":{"line":128,"column":11,"offset":4786},"indent":[]}}],"position":{"start":{"line":128,"column":1,"offset":4776},"end":{"line":128,"column":13,"offset":4788},"indent":[]}}],"position":{"start":{"line":128,"column":1,"offset":4776},"end":{"line":128,"column":13,"offset":4788},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n\t\"name\": \"frontdoor\"\n}","position":{"start":{"line":129,"column":1,"offset":4789},"end":{"line":133,"column":4,"offset":4825},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"PUT api/v1/name","position":{"start":{"line":135,"column":1,"offset":4827},"end":{"line":135,"column":18,"offset":4844},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4827},"end":{"line":135,"column":18,"offset":4844},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":137,"column":3,"offset":4848},"end":{"line":137,"column":14,"offset":4859},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4846},"end":{"line":137,"column":16,"offset":4861},"indent":[]}}],"position":{"start":{"line":137,"column":1,"offset":4846},"end":{"line":137,"column":16,"offset":4861},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Change the name of your instance.","position":{"start":{"line":139,"column":1,"offset":4863},"end":{"line":139,"column":34,"offset":4896},"indent":[]}}],"position":{"start":{"line":139,"column":1,"offset":4863},"end":{"line":139,"column":34,"offset":4896},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Payload","position":{"start":{"line":141,"column":3,"offset":4900},"end":{"line":141,"column":10,"offset":4907},"indent":[]}}],"position":{"start":{"line":141,"column":1,"offset":4898},"end":{"line":141,"column":12,"offset":4909},"indent":[]}}],"position":{"start":{"line":141,"column":1,"offset":4898},"end":{"line":141,"column":12,"offset":4909},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n\t\"name\": \"frontdoor-changed\"\n}","position":{"start":{"line":142,"column":1,"offset":4910},"end":{"line":146,"column":4,"offset":4954},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":148,"column":3,"offset":4958},"end":{"line":148,"column":11,"offset":4966},"indent":[]}}],"position":{"start":{"line":148,"column":1,"offset":4956},"end":{"line":148,"column":13,"offset":4968},"indent":[]}}],"position":{"start":{"line":148,"column":1,"offset":4956},"end":{"line":148,"column":13,"offset":4968},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n\t\"name\": \"frontdoor-changed\"\n}","position":{"start":{"line":149,"column":1,"offset":4969},"end":{"line":153,"column":4,"offset":5013},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"GET api/v1/images/latest_sequence","position":{"start":{"line":155,"column":1,"offset":5015},"end":{"line":155,"column":36,"offset":5050},"indent":[]}}],"position":{"start":{"line":155,"column":1,"offset":5015},"end":{"line":155,"column":36,"offset":5050},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":157,"column":3,"offset":5054},"end":{"line":157,"column":14,"offset":5065},"indent":[]}}],"position":{"start":{"line":157,"column":1,"offset":5052},"end":{"line":157,"column":16,"offset":5067},"indent":[]}}],"position":{"start":{"line":157,"column":1,"offset":5052},"end":{"line":157,"column":16,"offset":5067},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Retrieve the latest sequence detected.","position":{"start":{"line":159,"column":1,"offset":5069},"end":{"line":159,"column":39,"offset":5107},"indent":[]}}],"position":{"start":{"line":159,"column":1,"offset":5069},"end":{"line":159,"column":39,"offset":5107},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":161,"column":3,"offset":5111},"end":{"line":161,"column":11,"offset":5119},"indent":[]}}],"position":{"start":{"line":161,"column":1,"offset":5109},"end":{"line":161,"column":13,"offset":5121},"indent":[]}}],"position":{"start":{"line":161,"column":1,"offset":5109},"end":{"line":161,"column":13,"offset":5121},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"[\n {\n time: \"10:59:57\",\n src: \"https://demo.kerberos.io/capture/1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\",\n local_src: \"/var/www/web/public/capture/1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\",\n metadata: {\n key: \"1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\",\n user: \"1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\",\n timestamp: 1501491597,\n microseconds: \"6-310145\",\n instanceName: \"frontdoor\",\n regionCoordinates: \"722-691-873-926\",\n numberOfChanges: \"703\",\n token: \"511\"\n },\n type: \"video\"\n }\n]","position":{"start":{"line":162,"column":1,"offset":5122},"end":{"line":181,"column":4,"offset":5823},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"GET api/v1/condition/enabled","position":{"start":{"line":183,"column":1,"offset":5825},"end":{"line":183,"column":31,"offset":5855},"indent":[]}}],"position":{"start":{"line":183,"column":1,"offset":5825},"end":{"line":183,"column":31,"offset":5855},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":185,"column":3,"offset":5859},"end":{"line":185,"column":14,"offset":5870},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":5857},"end":{"line":185,"column":16,"offset":5872},"indent":[]}}],"position":{"start":{"line":185,"column":1,"offset":5857},"end":{"line":185,"column":16,"offset":5872},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Check if enabled or disabled.","position":{"start":{"line":187,"column":1,"offset":5874},"end":{"line":187,"column":30,"offset":5903},"indent":[]}}],"position":{"start":{"line":187,"column":1,"offset":5874},"end":{"line":187,"column":30,"offset":5903},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":189,"column":3,"offset":5907},"end":{"line":189,"column":11,"offset":5915},"indent":[]}}],"position":{"start":{"line":189,"column":1,"offset":5905},"end":{"line":189,"column":13,"offset":5917},"indent":[]}}],"position":{"start":{"line":189,"column":1,"offset":5905},"end":{"line":189,"column":13,"offset":5917},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n \t\"active\": \"true\",\n \t\"delay\": \"5000\"\n}","position":{"start":{"line":190,"column":1,"offset":5918},"end":{"line":195,"column":4,"offset":5971},"indent":[1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"PUT api/v1/condition/enabled","position":{"start":{"line":197,"column":1,"offset":5973},"end":{"line":197,"column":31,"offset":6003},"indent":[]}}],"position":{"start":{"line":197,"column":1,"offset":5973},"end":{"line":197,"column":31,"offset":6003},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":199,"column":3,"offset":6007},"end":{"line":199,"column":14,"offset":6018},"indent":[]}}],"position":{"start":{"line":199,"column":1,"offset":6005},"end":{"line":199,"column":16,"offset":6020},"indent":[]}}],"position":{"start":{"line":199,"column":1,"offset":6005},"end":{"line":199,"column":16,"offset":6020},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Activate or disable the system.","position":{"start":{"line":201,"column":1,"offset":6022},"end":{"line":201,"column":32,"offset":6053},"indent":[]}}],"position":{"start":{"line":201,"column":1,"offset":6022},"end":{"line":201,"column":32,"offset":6053},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Payload","position":{"start":{"line":203,"column":3,"offset":6057},"end":{"line":203,"column":10,"offset":6064},"indent":[]}}],"position":{"start":{"line":203,"column":1,"offset":6055},"end":{"line":203,"column":12,"offset":6066},"indent":[]}}],"position":{"start":{"line":203,"column":1,"offset":6055},"end":{"line":203,"column":12,"offset":6066},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n \t\"active\": \"false\"\n}","position":{"start":{"line":204,"column":1,"offset":6067},"end":{"line":208,"column":4,"offset":6102},"indent":[1,1,1,1]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":210,"column":3,"offset":6106},"end":{"line":210,"column":11,"offset":6114},"indent":[]}}],"position":{"start":{"line":210,"column":1,"offset":6104},"end":{"line":210,"column":13,"offset":6116},"indent":[]}}],"position":{"start":{"line":210,"column":1,"offset":6104},"end":{"line":210,"column":13,"offset":6116},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n \t\"active\": \"false\",\n \t\"delay\": \"5000\"\n}","position":{"start":{"line":211,"column":1,"offset":6117},"end":{"line":216,"column":4,"offset":6171},"indent":[1,1,1,1,1]}},{"type":"paragraph","children":[{"type":"inlineCode","value":"GET api/v1/system/health","position":{"start":{"line":218,"column":1,"offset":6173},"end":{"line":218,"column":27,"offset":6199},"indent":[]}}],"position":{"start":{"line":218,"column":1,"offset":6173},"end":{"line":218,"column":27,"offset":6199},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Description","position":{"start":{"line":220,"column":3,"offset":6203},"end":{"line":220,"column":14,"offset":6214},"indent":[]}}],"position":{"start":{"line":220,"column":1,"offset":6201},"end":{"line":220,"column":16,"offset":6216},"indent":[]}}],"position":{"start":{"line":220,"column":1,"offset":6201},"end":{"line":220,"column":16,"offset":6216},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Check if the machinery is running (the stream is connected).","position":{"start":{"line":222,"column":1,"offset":6218},"end":{"line":222,"column":61,"offset":6278},"indent":[]}}],"position":{"start":{"line":222,"column":1,"offset":6218},"end":{"line":222,"column":61,"offset":6278},"indent":[]}},{"type":"paragraph","children":[{"type":"strong","children":[{"type":"text","value":"Response","position":{"start":{"line":224,"column":3,"offset":6282},"end":{"line":224,"column":11,"offset":6290},"indent":[]}}],"position":{"start":{"line":224,"column":1,"offset":6280},"end":{"line":224,"column":13,"offset":6292},"indent":[]}}],"position":{"start":{"line":224,"column":1,"offset":6280},"end":{"line":224,"column":13,"offset":6292},"indent":[]}},{"type":"code","lang":"json","meta":null,"value":"{\n \t\"status\": \"false\"\n}","position":{"start":{"line":225,"column":1,"offset":6293},"end":{"line":229,"column":4,"offset":6328},"indent":[1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":232,"column":1,"offset":6331},"end":{"line":232,"column":31,"offset":6361},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":232,"column":31,"offset":6361}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Web interface`}

\n

{`The web is responsible for the visualization. It's a GUI which helps the user to find activity at a specific period, configure the machinery, view a live stream, see system information and much more.`}

\n

{`It's written in PHP using the extremely popular PHP Framework Laravel, and Javascript using the client-side framework BackboneJS. We will discuss the different pages and functionality briefly. Please check out `}{`the demo environment`}{` if you want to see a real life example.`}

\n

{`Overview`}

\n

{`We will shortly discuss the different pages that make up the web interface of Kerberos Open Source.`}

\n

{`Dashboard`}

\n

{`The landing page of the web is the dashboard. On the dashboard a user will see some statistics: activity per hour, activity per day, a live stream, the latest activity and a heatmap.`}

\n

\"web

\n

{`Overview`}

\n

{`When selecting a specific day, you'll will get a timeline and overview. By using the timeline you can navigate through a day; the timeline highlights the amount of activity, from gray to red.`}

\n

\"web

\n

{`Settings`}

\n

{`The settings page allows you to configure the machinery. You can define the type of camera, post-processes, conditions and much more; it's highly configurable.`}

\n

\"web

\n

{`System`}

\n

{`The system page allows you to monitor the system. On this page you'll get an overview of the system specifications (CPU, Memory, Network, etc). Several actions are available: you can download system information (for debugging purposes) and download or remove your images.`}

\n

\"web

\n

{`Project structure`}

\n

{`The web interface is using the Laravel framework (version 5.4). There is a lot of documentation related to Laravel, please review `}{`their documentation website here`}{`. In a nutshell this is how the web is organised.`}

\n

{`Back-end`}

\n
    \n
  • {`config/app.php - general application settings.`}
  • \n
  • {`config/kerberos.php - this file contains web specific parameters; the user credentials to sign in, etc.`}
  • \n
  • {`app/Http/Controllers - MVC controllers`}
  • \n
  • {`app/Http/Repositories -repositories are injected into the controller.`}
  • \n
  • {`app/Providers/AppServiceProvider.php - bind repositories to a specific interface - dependency injection.`}
  • \n
  • {`routes/api.php - contains all the URI endpoints for Ajax calls.`}
  • \n
  • {`routes/web.php - url routing for pages.`}
  • \n
\n

{`Front-end`}

\n
    \n
  • {`public/css/less - LESS is used for the CSS.`}
  • \n
  • {`public/js/app - BackboneJS and RequireJS is used for building modular JS classes.`}
  • \n
  • {`public/js/mustache - Mustache is used for the client-side view rendering.`}
  • \n
  • {`public/js/vendor - This is where the bower extensions are installed.`}
  • \n
  • {`public/capture - A directory where images are written to by default.`}
  • \n
  • {`public/bower.json - The bower extensions used in the web repository.`}
  • \n
  • {`public/Gruntfile.js - We are using Grunt for our task manager.`}
  • \n
\n

{`API`}

\n

{`If you want to integrate the Kerberos agent with your own application, you're at the right place! The web interface comes with a RESTfull API, that allows you to retrieve and modify information from the Kerberos agent.`}

\n
    \n
  • {`Disable the machinery`}
  • \n
  • {`Health check`}
  • \n
  • {`Enable or disable output devices`}
  • \n
  • {`etc.`}
  • \n
\n

{`Authentication`}

\n

{`To use the RESTfull API of your Kerberos agent you need to define an Authorization header with each request. We use Basic Authentication to secure the different endpoints.`}

\n
{`\"Authorization\"`}{`: `}{`\"Basic root:root\"`}
\n

{`An example with Python looks like this.`}

\n
{`import`}{` requests`}{`\n`}{`import`}{` json`}{`\n`}{`import`}{` base64`}{`\n`}{`url = `}{`\"http://ip-of-pi/api/v1/condition/enabled\"`}{`\n`}{`username = `}{`\"user\"`}{`\n`}{`password = `}{`\"passw\"`}{`\n`}{`basicAuth = base64.b64encode(`}{`'`}{`%s`}{`:`}{`%s`}{`'`}{` % (username, password))`}{`\n`}{`headers = {`}{`\"Authorization\"`}{`: `}{`\"Basic \"`}{` + basicAuth, `}{`\"Content-Type\"`}{`: `}{`\"application/json\"`}{`}`}{`\n`}{`data = `}{`'{\"active\": \"true\"}'`}{`\n`}{`#Call REST API`}{`\n`}{`response = requests.put(url, `}{`data`}{`=data, `}{`headers`}{`=headers)`}{`\n`}{`print`}{`(response.text)`}
\n

{`If you're using the wrong credentials, the web will return following error message.`}

\n
{`Invalid credentials.`}
\n

{`Endpoints`}

\n

{`All endpoints are prefixed with api/v`}{`[version]`}{`/, in which the last part defines the API version number. Below you will find all the available endpoints with there signature and response. Note that when you call an endpoint which doesn't exists, the web will throw an 404.`}

\n
{`{`}{`\n`}{`\t`}{`\"error\"`}{`: `}{`\"API method does not exists\"`}{`\n`}{`}`}
\n

{`Version 1`}

\n

{`Below you'll find a list of all API methods which are available for version 1.`}

\n

{`GET api/v1/name`}

\n

{`Description`}

\n

{`Retrieve the name of your instance.`}

\n

{`Response`}

\n
{`{`}{`\n`}{`\t`}{`\"name\"`}{`: `}{`\"frontdoor\"`}{`\n`}{`}`}
\n

{`PUT api/v1/name`}

\n

{`Description`}

\n

{`Change the name of your instance.`}

\n

{`Payload`}

\n
{`{`}{`\n`}{`\t`}{`\"name\"`}{`: `}{`\"frontdoor-changed\"`}{`\n`}{`}`}
\n

{`Response`}

\n
{`{`}{`\n`}{`\t`}{`\"name\"`}{`: `}{`\"frontdoor-changed\"`}{`\n`}{`}`}
\n

{`GET api/v1/images/latest_sequence`}

\n

{`Description`}

\n

{`Retrieve the latest sequence detected.`}

\n

{`Response`}

\n
{`[`}{`\n`}{`    {`}{`\n`}{`        `}{`time`}{`: `}{`\"10:59:57\"`}{`,`}{`\n`}{`        `}{`src`}{`: `}{`\"https://demo.kerberos.io/capture/1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\"`}{`,`}{`\n`}{`        `}{`local_src`}{`: `}{`\"/var/www/web/public/capture/1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\"`}{`,`}{`\n`}{`        `}{`metadata`}{`: {`}{`\n`}{`            `}{`key`}{`: `}{`\"1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\"`}{`,`}{`\n`}{`            `}{`user`}{`: `}{`\"1501491597_6-310145_frontdoor_722-691-873-926_703_511.mp4\"`}{`,`}{`\n`}{`            `}{`timestamp`}{`: `}{`1501491597`}{`,`}{`\n`}{`            `}{`microseconds`}{`: `}{`\"6-310145\"`}{`,`}{`\n`}{`            `}{`instanceName`}{`: `}{`\"frontdoor\"`}{`,`}{`\n`}{`            `}{`regionCoordinates`}{`: `}{`\"722-691-873-926\"`}{`,`}{`\n`}{`            `}{`numberOfChanges`}{`: `}{`\"703\"`}{`,`}{`\n`}{`            `}{`token`}{`: `}{`\"511\"`}{`\n`}{`        },`}{`\n`}{`        `}{`type`}{`: `}{`\"video\"`}{`\n`}{`    }`}{`\n`}{`]`}
\n

{`GET api/v1/condition/enabled`}

\n

{`Description`}

\n

{`Check if enabled or disabled.`}

\n

{`Response`}

\n
{`{`}{`\n`}{` \t`}{`\"active\"`}{`: `}{`\"true\"`}{`,`}{`\n`}{` \t`}{`\"delay\"`}{`: `}{`\"5000\"`}{`\n`}{`}`}
\n

{`PUT api/v1/condition/enabled`}

\n

{`Description`}

\n

{`Activate or disable the system.`}

\n

{`Payload`}

\n
{`{`}{`\n`}{` \t`}{`\"active\"`}{`: `}{`\"false\"`}{`\n`}{`}`}
\n

{`Response`}

\n
{`{`}{`\n`}{` \t`}{`\"active\"`}{`: `}{`\"false\"`}{`,`}{`\n`}{` \t`}{`\"delay\"`}{`: `}{`\"5000\"`}{`\n`}{`}`}
\n

{`GET api/v1/system/health`}

\n

{`Description`}

\n

{`Check if the machinery is running (the stream is connected).`}

\n

{`Response`}

\n
{`{`}{`\n`}{` \t`}{`\"status\"`}{`: `}{`\"false\"`}{`\n`}{`}`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e97ebc3502767fd26f8d98637003ee7c.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e97ebc3502767fd26f8d98637003ee7c.json new file mode 100644 index 0000000..2786fe5 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-e97ebc3502767fd26f8d98637003ee7c.json @@ -0,0 +1 @@ +{"expireTime":9007200838767486000,"key":"gatsby-plugin-mdx-entire-payload-0aebb681a69ba03f3e6c92e27a9acdbb-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":23,"column":4,"offset":774},"end":{"line":23,"column":8,"offset":778},"indent":[]}}],"position":{"start":{"line":23,"column":1,"offset":771},"end":{"line":23,"column":8,"offset":778},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":25,"column":4,"offset":783},"end":{"line":25,"column":8,"offset":787},"indent":[]}}],"position":{"start":{"line":25,"column":2,"offset":781},"end":{"line":25,"column":10,"offset":789},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":780},"end":{"line":25,"column":29,"offset":808},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":25,"column":29,"offset":808},"end":{"line":25,"column":172,"offset":951},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":25,"column":174,"offset":953},"end":{"line":25,"column":180,"offset":959},"indent":[]}}],"position":{"start":{"line":25,"column":172,"offset":951},"end":{"line":25,"column":182,"offset":961},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":25,"column":182,"offset":961},"end":{"line":25,"column":254,"offset":1033},"indent":[]}}],"position":{"start":{"line":25,"column":1,"offset":780},"end":{"line":25,"column":254,"offset":1033},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":28,"column":1,"offset":1036},"end":{"line":28,"column":31,"offset":1066},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":28,"column":31,"offset":1066}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ea9ba0cd48a895e0119e0cae95e9c17d.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ea9ba0cd48a895e0119e0cae95e9c17d.json new file mode 100644 index 0000000..afad82b --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ea9ba0cd48a895e0119e0cae95e9c17d.json @@ -0,0 +1 @@ +{"expireTime":9007200838768870000,"key":"gatsby-plugin-mdx-entire-payload-1718847324557a164e3363ce5e2f3022-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm Client,","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":39,"offset":1879},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":39,"offset":1879},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":68,"column":1,"offset":1882},"end":{"line":68,"column":31,"offset":1912},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":68,"column":31,"offset":1912}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm Client,`}

\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ec9383e7da41a0b42fd42636a469290d.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ec9383e7da41a0b42fd42636a469290d.json deleted file mode 100644 index f6aaea8..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ec9383e7da41a0b42fd42636a469290d.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838525790000,"key":"gatsby-plugin-mdx-entire-payload-e0fa68be8f9f0bf1beafcada3549c2b3-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a huge amount of surveillance cameras.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":205,"offset":803},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":205,"offset":803},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":17,"column":1,"offset":806},"end":{"line":17,"column":31,"offset":836},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":17,"column":31,"offset":836}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a huge amount of surveillance cameras.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-eccbd7b456024e7687020bd6167b49cb.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-eccbd7b456024e7687020bd6167b49cb.json deleted file mode 100644 index cc22d3c..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-eccbd7b456024e7687020bd6167b49cb.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838683644000,"key":"gatsby-plugin-mdx-entire-payload-7c865ce4c85e5610a30a0821b51cbbc4-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":274,"offset":872},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":874},"end":{"line":16,"column":186,"offset":1059},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kubernetes","position":{"start":{"line":18,"column":4,"offset":1064},"end":{"line":18,"column":14,"offset":1074},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1061},"end":{"line":18,"column":14,"offset":1074},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.","position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1076},"end":{"line":20,"column":319,"offset":1394},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1396},"end":{"line":22,"column":91,"offset":1486},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is installed inside a Kubernetes cluster, and it will create pods/deployments for every surveillance camera you have. Kubernetes will scale them across your nodes (VM's/Baremetal). ","position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":202,"offset":1689},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1488},"end":{"line":24,"column":202,"offset":1689},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":27,"column":1,"offset":1692},"end":{"line":27,"column":31,"offset":1722},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":27,"column":31,"offset":1722}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.`}

\n
\n

{`Kubernetes`}

\n

{`To provide our customer with the high availability and fail over requirements they have, Kerberos Enterprise was built on top of Kubernetes (k8s). This container orchestrator, Kubernetes, allows us to scale a video surveillance landscape horizontally, and deliver a never-seen high available video surveillance system.`}

\n

\"architecture

\n

{`Kerberos Enterprise is installed inside a Kubernetes cluster, and it will create pods/deployments for every surveillance camera you have. Kubernetes will scale them across your nodes (VM's/Baremetal). `}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ee19ff5e4f64cc381dd76a7920c34105.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ee19ff5e4f64cc381dd76a7920c34105.json index 3c4ac50..fb8be75 100644 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ee19ff5e4f64cc381dd76a7920c34105.json +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-ee19ff5e4f64cc381dd76a7920c34105.json @@ -1 +1 @@ -{"expireTime":9007200838510857000,"key":"gatsby-plugin-mdx-entire-payload-cab813cedba0bc4c42a44e3b2613ca99-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Architectures","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":16,"offset":174},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":16,"offset":174},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"In this section we will explain some usecases and best practices, which might help you to define the architecture that fits your needs.","position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":136,"offset":311},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":136,"offset":311},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Please read the ","position":{"start":{"line":12,"column":3,"offset":315},"end":{"line":12,"column":19,"offset":331},"indent":[]}},{"type":"link","title":null,"url":"/","children":[{"type":"text","value":"introduction page","position":{"start":{"line":12,"column":20,"offset":332},"end":{"line":12,"column":37,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":19,"offset":331},"end":{"line":12,"column":41,"offset":353},"indent":[]}},{"type":"text","value":" first, before moving forward.","position":{"start":{"line":12,"column":41,"offset":353},"end":{"line":12,"column":71,"offset":383},"indent":[]}}],"position":{"start":{"line":12,"column":3,"offset":315},"end":{"line":12,"column":71,"offset":383},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":313},"end":{"line":12,"column":71,"offset":383},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When starting with Kerberos you might ask yourself, how should I deploy these so called, Kerberos agents? Well, there are different options. You can install a Kerberos agent on a Raspberry Pi, VM, Server or even in a Kubernetes cluster. So what should you do, and when? Let's have a closer look at the different options.","position":{"start":{"line":14,"column":1,"offset":385},"end":{"line":14,"column":321,"offset":705},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":385},"end":{"line":14,"column":321,"offset":705},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The first thing you need to consider is the environment, in which you want to deploy your Kerberos agents. Is it inside your house, your company or a public place? Another important factor is the number of surveillance cameras you would like to monitor, and if you have any high availability requirements.","position":{"start":{"line":16,"column":1,"offset":707},"end":{"line":16,"column":306,"offset":1012},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":707},"end":{"line":16,"column":306,"offset":1012},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Agents on-premise","position":{"start":{"line":18,"column":4,"offset":1017},"end":{"line":18,"column":21,"offset":1034},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1014},"end":{"line":18,"column":21,"offset":1034},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The most common scenario is to install your Kerberos agents on-premise. This has a couple of benefits such as latency, bandwidth and a less complex security model. When installing a Kerberos agent on-premise, you also have different options.","position":{"start":{"line":20,"column":1,"offset":1036},"end":{"line":20,"column":242,"offset":1277},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1036},"end":{"line":20,"column":242,"offset":1277},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Kerberos Open Source (< 5 Kerberos agents)","position":{"start":{"line":22,"column":5,"offset":1283},"end":{"line":22,"column":47,"offset":1325},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1279},"end":{"line":22,"column":47,"offset":1325},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you have a limited number of surveillance cameras you would like to monitor, and don't have any high availability requirements, the Kerberos Open Source agent is a good choice. For example, you can install the Kerberos Open Source agent on a Raspberry Pi, by using ","position":{"start":{"line":24,"column":1,"offset":1327},"end":{"line":24,"column":269,"offset":1595},"indent":[]}},{"type":"link","title":null,"url":"opensource/installation#kios","children":[{"type":"text","value":"KiOS","position":{"start":{"line":24,"column":270,"offset":1596},"end":{"line":24,"column":274,"offset":1600},"indent":[]}}],"position":{"start":{"line":24,"column":269,"offset":1595},"end":{"line":24,"column":305,"offset":1631},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":24,"column":305,"offset":1631},"end":{"line":24,"column":307,"offset":1633},"indent":[]}},{"type":"link","title":null,"url":"opensource/installation#raspbian","children":[{"type":"text","value":"Raspbian OS","position":{"start":{"line":24,"column":308,"offset":1634},"end":{"line":24,"column":319,"offset":1645},"indent":[]}}],"position":{"start":{"line":24,"column":307,"offset":1633},"end":{"line":24,"column":354,"offset":1680},"indent":[]}},{"type":"text","value":" or compile it from source.","position":{"start":{"line":24,"column":354,"offset":1680},"end":{"line":24,"column":381,"offset":1707},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1327},"end":{"line":24,"column":381,"offset":1707},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"On below architecture, a couple of Kerberos agents are installed on-premise (inside the local network). A Kerberos agent is installed for each surveillance camera, and each Kerberos agent runs on a seperate host (Raspberry Pi, VM, etc). The web interface of the Kerberos agents can be reached from the internal network, but cannot be accessed from the cloud.","position":{"start":{"line":26,"column":1,"offset":1709},"end":{"line":26,"column":359,"offset":2067},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1709},"end":{"line":26,"column":359,"offset":2067},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-agent-architecture-kios.png","alt":"architecture kios","position":{"start":{"line":28,"column":1,"offset":2069},"end":{"line":28,"column":76,"offset":2144},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":2069},"end":{"line":28,"column":76,"offset":2144},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Another option to install the Kerberos Open Source agent is to use Docker. Instead of having seperate hosts for each Kerberos agent, you will have a single host (Docker host) with multiple Docker containers. A Docker container is deployed for each surveillance camera, which contains the software to run the Kerberos agent.","position":{"start":{"line":30,"column":1,"offset":2146},"end":{"line":30,"column":324,"offset":2469},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":2146},"end":{"line":30,"column":324,"offset":2469},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Running your Kerberos agents inside Docker containers, allows you to process multiple surveilllance cameras using only one host.","position":{"start":{"line":32,"column":1,"offset":2471},"end":{"line":32,"column":129,"offset":2599},"indent":[]}}],"position":{"start":{"line":32,"column":1,"offset":2471},"end":{"line":32,"column":129,"offset":2599},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-agent-architecture-docker.png","alt":"architecture kios","position":{"start":{"line":34,"column":1,"offset":2601},"end":{"line":34,"column":78,"offset":2678},"indent":[]}}],"position":{"start":{"line":34,"column":1,"offset":2601},"end":{"line":34,"column":78,"offset":2678},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Kerberos Enterprise (> 5 Kerberos agents)","position":{"start":{"line":36,"column":5,"offset":2684},"end":{"line":36,"column":46,"offset":2725},"indent":[]}}],"position":{"start":{"line":36,"column":1,"offset":2680},"end":{"line":36,"column":46,"offset":2725},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"More information coming soon.","position":{"start":{"line":38,"column":1,"offset":2727},"end":{"line":38,"column":30,"offset":2756},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":2727},"end":{"line":38,"column":30,"offset":2756},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":40,"column":1,"offset":2758},"end":{"line":40,"column":88,"offset":2845},"indent":[]}}],"position":{"start":{"line":40,"column":1,"offset":2758},"end":{"line":40,"column":88,"offset":2845},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Agents in the cloud","position":{"start":{"line":42,"column":4,"offset":2850},"end":{"line":42,"column":23,"offset":2869},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":2847},"end":{"line":42,"column":23,"offset":2869},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Instead of processing your surveillance cameras on-premise you could also process them in the cloud. There are a couple advantages, for example, you don't have to manage your owner hardware, you can simply spin up a VM on one of the hyperscalers.","position":{"start":{"line":44,"column":1,"offset":2871},"end":{"line":44,"column":247,"offset":3117},"indent":[]}}],"position":{"start":{"line":44,"column":1,"offset":2871},"end":{"line":44,"column":247,"offset":3117},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When dealing with Kerberos agents in the cloud, the complexity starts with the security model. As your surveillance cameras are running somewhere on-premise, you will need to make them available to your Kerberos agents, which are running in the cloud. There are several ways to do that, such as port forwarding (not recommended) or setting up a site-to-site VPN (recommended).","position":{"start":{"line":46,"column":1,"offset":3119},"end":{"line":46,"column":377,"offset":3495},"indent":[]}}],"position":{"start":{"line":46,"column":1,"offset":3119},"end":{"line":46,"column":377,"offset":3495},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When setting up a VPN connection you will expose your surveillance cameras to your Kerberos agents. Once you've configured the Kerberos agents, data will flow through this secure tunnel, from on-premise to your cloud enviroment.","position":{"start":{"line":48,"column":1,"offset":3497},"end":{"line":48,"column":229,"offset":3725},"indent":[]}}],"position":{"start":{"line":48,"column":1,"offset":3497},"end":{"line":48,"column":229,"offset":3725},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Kerberos Open Source (< 5 Kerberos agents)","position":{"start":{"line":50,"column":5,"offset":3731},"end":{"line":50,"column":47,"offset":3773},"indent":[]}}],"position":{"start":{"line":50,"column":1,"offset":3727},"end":{"line":50,"column":47,"offset":3773},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you have a limited number of surveillance cameras you would like to monitor, and don't have any high availability requirements, the Kerberos Open Source agent is a good choice. You can install the Kerberos Open Source agent on Docker. Instead of having seperate VM's for each Kerberos agent, you will have a single VM (Docker host) with multiple Docker containers. A Docker container is deployed for each surveillance camera, which contains the software to run the Kerberos agent.","position":{"start":{"line":52,"column":1,"offset":3775},"end":{"line":52,"column":484,"offset":4258},"indent":[]}}],"position":{"start":{"line":52,"column":1,"offset":3775},"end":{"line":52,"column":484,"offset":4258},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-agent-architecture-docker-cloud.png","alt":"architecture kios","position":{"start":{"line":54,"column":1,"offset":4260},"end":{"line":54,"column":84,"offset":4343},"indent":[]}}],"position":{"start":{"line":54,"column":1,"offset":4260},"end":{"line":54,"column":84,"offset":4343},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Kerberos Enterprise (> 5 Kerberos agents)","position":{"start":{"line":56,"column":5,"offset":4349},"end":{"line":56,"column":46,"offset":4390},"indent":[]}}],"position":{"start":{"line":56,"column":1,"offset":4345},"end":{"line":56,"column":46,"offset":4390},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"More information coming soon.","position":{"start":{"line":58,"column":1,"offset":4392},"end":{"line":58,"column":30,"offset":4421},"indent":[]}}],"position":{"start":{"line":58,"column":1,"offset":4392},"end":{"line":58,"column":30,"offset":4421},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-agent-architecture-kubernetes-cloud.png","alt":"architecture kubernetes","position":{"start":{"line":60,"column":1,"offset":4423},"end":{"line":60,"column":94,"offset":4516},"indent":[]}}],"position":{"start":{"line":60,"column":1,"offset":4423},"end":{"line":60,"column":94,"offset":4516},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kerberos Cloud","position":{"start":{"line":62,"column":4,"offset":4521},"end":{"line":62,"column":18,"offset":4535},"indent":[]}}],"position":{"start":{"line":62,"column":1,"offset":4518},"end":{"line":62,"column":18,"offset":4535},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you've configured one of the previously mentioned architectures, you will have one or more Kerberos agents running, in the cloud or on-premise.","position":{"start":{"line":64,"column":1,"offset":4537},"end":{"line":64,"column":149,"offset":4685},"indent":[]}}],"position":{"start":{"line":64,"column":1,"offset":4537},"end":{"line":64,"column":149,"offset":4685},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Every Kerberos agent comes with a web interface, which makes it possible to review the activity for that specific agent; they don't have a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera / Kerberos agent.","position":{"start":{"line":66,"column":1,"offset":4687},"end":{"line":66,"column":286,"offset":4972},"indent":[]}}],"position":{"start":{"line":66,"column":1,"offset":4687},"end":{"line":66,"column":286,"offset":4972},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To simplify this process and resolve some other challenges, Kerberos Cloud was developed.","position":{"start":{"line":68,"column":1,"offset":4974},"end":{"line":68,"column":90,"offset":5063},"indent":[]}}],"position":{"start":{"line":68,"column":1,"offset":4974},"end":{"line":68,"column":90,"offset":5063},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://cloud.kerberos.io","children":[{"type":"text","value":"Kerberos Cloud","position":{"start":{"line":70,"column":4,"offset":5068},"end":{"line":70,"column":18,"offset":5082},"indent":[]}}],"position":{"start":{"line":70,"column":3,"offset":5067},"end":{"line":70,"column":46,"offset":5110},"indent":[]}},{"type":"text","value":" is a cloud solution which allows you to have a single overview of all the media recordings generated by your surveillance cameras. It's not a solution for processing your surveillance cameras in the cloud. For processing of your surveillance cameras, a Kerberos agent is used.","position":{"start":{"line":70,"column":46,"offset":5110},"end":{"line":70,"column":323,"offset":5387},"indent":[]}}],"position":{"start":{"line":70,"column":3,"offset":5067},"end":{"line":70,"column":323,"offset":5387},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":5065},"end":{"line":70,"column":323,"offset":5387},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A brief list of the key features of Kerberos Cloud are:","position":{"start":{"line":72,"column":1,"offset":5389},"end":{"line":72,"column":56,"offset":5444},"indent":[]}}],"position":{"start":{"line":72,"column":1,"offset":5389},"end":{"line":72,"column":56,"offset":5444},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Secured storage","position":{"start":{"line":74,"column":3,"offset":5448},"end":{"line":74,"column":18,"offset":5463},"indent":[]}}],"position":{"start":{"line":74,"column":3,"offset":5448},"end":{"line":74,"column":18,"offset":5463},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":5446},"end":{"line":74,"column":18,"offset":5463},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Consolidated overview","position":{"start":{"line":75,"column":3,"offset":5466},"end":{"line":75,"column":24,"offset":5487},"indent":[]}}],"position":{"start":{"line":75,"column":3,"offset":5466},"end":{"line":75,"column":24,"offset":5487},"indent":[]}}],"position":{"start":{"line":75,"column":1,"offset":5464},"end":{"line":75,"column":24,"offset":5487},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Advanced searching","position":{"start":{"line":76,"column":3,"offset":5490},"end":{"line":76,"column":21,"offset":5508},"indent":[]}}],"position":{"start":{"line":76,"column":3,"offset":5490},"end":{"line":76,"column":21,"offset":5508},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":5488},"end":{"line":76,"column":21,"offset":5508},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Machine learning","position":{"start":{"line":77,"column":3,"offset":5511},"end":{"line":77,"column":19,"offset":5527},"indent":[]}}],"position":{"start":{"line":77,"column":3,"offset":5511},"end":{"line":77,"column":19,"offset":5527},"indent":[]}}],"position":{"start":{"line":77,"column":1,"offset":5509},"end":{"line":77,"column":19,"offset":5527},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Alerts","position":{"start":{"line":78,"column":3,"offset":5530},"end":{"line":78,"column":9,"offset":5536},"indent":[]}}],"position":{"start":{"line":78,"column":3,"offset":5530},"end":{"line":78,"column":9,"offset":5536},"indent":[]}}],"position":{"start":{"line":78,"column":1,"offset":5528},"end":{"line":78,"column":9,"offset":5536},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Live streaming","position":{"start":{"line":79,"column":3,"offset":5539},"end":{"line":79,"column":17,"offset":5553},"indent":[]}}],"position":{"start":{"line":79,"column":3,"offset":5539},"end":{"line":79,"column":17,"offset":5553},"indent":[]}}],"position":{"start":{"line":79,"column":1,"offset":5537},"end":{"line":79,"column":17,"offset":5553},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Accounts","position":{"start":{"line":80,"column":3,"offset":5556},"end":{"line":80,"column":11,"offset":5564},"indent":[]}}],"position":{"start":{"line":80,"column":3,"offset":5556},"end":{"line":80,"column":11,"offset":5564},"indent":[]}}],"position":{"start":{"line":80,"column":1,"offset":5554},"end":{"line":80,"column":11,"offset":5564},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Logging","position":{"start":{"line":81,"column":3,"offset":5567},"end":{"line":81,"column":10,"offset":5574},"indent":[]}}],"position":{"start":{"line":81,"column":3,"offset":5567},"end":{"line":81,"column":10,"offset":5574},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":5565},"end":{"line":81,"column":10,"offset":5574},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":5446},"end":{"line":81,"column":10,"offset":5574},"indent":[1,1,1,1,1,1,1]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Checkout ","position":{"start":{"line":83,"column":3,"offset":5578},"end":{"line":83,"column":12,"offset":5587},"indent":[]}},{"type":"link","title":null,"url":"https://app-demo.kerberos.io","children":[{"type":"text","value":"the demo environment","position":{"start":{"line":83,"column":13,"offset":5588},"end":{"line":83,"column":33,"offset":5608},"indent":[]}}],"position":{"start":{"line":83,"column":12,"offset":5587},"end":{"line":83,"column":64,"offset":5639},"indent":[]}},{"type":"text","value":" to see and feel the Kerberos Cloud solution yourself.","position":{"start":{"line":83,"column":64,"offset":5639},"end":{"line":83,"column":118,"offset":5693},"indent":[]}}],"position":{"start":{"line":83,"column":3,"offset":5578},"end":{"line":83,"column":118,"offset":5693},"indent":[]}}],"position":{"start":{"line":83,"column":1,"offset":5576},"end":{"line":83,"column":118,"offset":5693},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Architecture","position":{"start":{"line":85,"column":5,"offset":5699},"end":{"line":85,"column":17,"offset":5711},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":5695},"end":{"line":85,"column":17,"offset":5711},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A simplified architecture is found below. In this architecture the Kerberos agents are installed on-premise (but this could also be in the cloud), next to the surveillance cameras. Once one of the agents recorded something it will send the recording to our AWS S3 bucket, using the credentials you've defined inside the agent.","position":{"start":{"line":87,"column":1,"offset":5713},"end":{"line":87,"column":327,"offset":6039},"indent":[]}}],"position":{"start":{"line":87,"column":1,"offset":5713},"end":{"line":87,"column":327,"offset":6039},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"As soon as the recording is succesfully received several engines will be executed, that will further process the recording and extract metadata from it (classification, origin of the surveillance camera, etc). A lot of processing is happening behind the scenes.","position":{"start":{"line":89,"column":1,"offset":6041},"end":{"line":89,"column":262,"offset":6302},"indent":[]}}],"position":{"start":{"line":89,"column":1,"offset":6041},"end":{"line":89,"column":262,"offset":6302},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By using a browser you can navigate to Kerberos Cloud, and review all the recordings made by the Kerberos agents on-premise. On top of that you will receive more context about the recordings, get notifications, view a livestream and much more. Read more about ","position":{"start":{"line":91,"column":1,"offset":6304},"end":{"line":91,"column":261,"offset":6564},"indent":[]}},{"type":"link","title":null,"url":"/cloud","children":[{"type":"text","value":"Kerberos Cloud here","position":{"start":{"line":91,"column":262,"offset":6565},"end":{"line":91,"column":281,"offset":6584},"indent":[]}}],"position":{"start":{"line":91,"column":261,"offset":6564},"end":{"line":91,"column":290,"offset":6593},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":91,"column":290,"offset":6593},"end":{"line":91,"column":291,"offset":6594},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":6304},"end":{"line":91,"column":291,"offset":6594},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-architecture.png","alt":"cloud","position":{"start":{"line":93,"column":1,"offset":6596},"end":{"line":93,"column":53,"offset":6648},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":6596},"end":{"line":93,"column":53,"offset":6648},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":96,"column":1,"offset":6651},"end":{"line":96,"column":31,"offset":6681},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":96,"column":31,"offset":6681}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Architectures`}

\n

{`In this section we will explain some usecases and best practices, which might help you to define the architecture that fits your needs.`}

\n
\n

{`Please read the `}{`introduction page`}{` first, before moving forward.`}

\n
\n

{`When starting with Kerberos you might ask yourself, how should I deploy these so called, Kerberos agents? Well, there are different options. You can install a Kerberos agent on a Raspberry Pi, VM, Server or even in a Kubernetes cluster. So what should you do, and when? Let's have a closer look at the different options.`}

\n

{`The first thing you need to consider is the environment, in which you want to deploy your Kerberos agents. Is it inside your house, your company or a public place? Another important factor is the number of surveillance cameras you would like to monitor, and if you have any high availability requirements.`}

\n

{`Agents on-premise`}

\n

{`The most common scenario is to install your Kerberos agents on-premise. This has a couple of benefits such as latency, bandwidth and a less complex security model. When installing a Kerberos agent on-premise, you also have different options.`}

\n

{`Kerberos Open Source (< 5 Kerberos agents)`}

\n

{`If you have a limited number of surveillance cameras you would like to monitor, and don't have any high availability requirements, the Kerberos Open Source agent is a good choice. For example, you can install the Kerberos Open Source agent on a Raspberry Pi, by using `}{`KiOS`}{`, `}{`Raspbian OS`}{` or compile it from source.`}

\n

{`On below architecture, a couple of Kerberos agents are installed on-premise (inside the local network). A Kerberos agent is installed for each surveillance camera, and each Kerberos agent runs on a seperate host (Raspberry Pi, VM, etc). The web interface of the Kerberos agents can be reached from the internal network, but cannot be accessed from the cloud.`}

\n

\"architecture

\n

{`Another option to install the Kerberos Open Source agent is to use Docker. Instead of having seperate hosts for each Kerberos agent, you will have a single host (Docker host) with multiple Docker containers. A Docker container is deployed for each surveillance camera, which contains the software to run the Kerberos agent.`}

\n

{`Running your Kerberos agents inside Docker containers, allows you to process multiple surveilllance cameras using only one host.`}

\n

\"architecture

\n

{`Kerberos Enterprise (> 5 Kerberos agents)`}

\n

{`More information coming soon.`}

\n

\"architecture

\n

{`Agents in the cloud`}

\n

{`Instead of processing your surveillance cameras on-premise you could also process them in the cloud. There are a couple advantages, for example, you don't have to manage your owner hardware, you can simply spin up a VM on one of the hyperscalers.`}

\n

{`When dealing with Kerberos agents in the cloud, the complexity starts with the security model. As your surveillance cameras are running somewhere on-premise, you will need to make them available to your Kerberos agents, which are running in the cloud. There are several ways to do that, such as port forwarding (not recommended) or setting up a site-to-site VPN (recommended).`}

\n

{`When setting up a VPN connection you will expose your surveillance cameras to your Kerberos agents. Once you've configured the Kerberos agents, data will flow through this secure tunnel, from on-premise to your cloud enviroment.`}

\n

{`Kerberos Open Source (< 5 Kerberos agents)`}

\n

{`If you have a limited number of surveillance cameras you would like to monitor, and don't have any high availability requirements, the Kerberos Open Source agent is a good choice. You can install the Kerberos Open Source agent on Docker. Instead of having seperate VM's for each Kerberos agent, you will have a single VM (Docker host) with multiple Docker containers. A Docker container is deployed for each surveillance camera, which contains the software to run the Kerberos agent.`}

\n

\"architecture

\n

{`Kerberos Enterprise (> 5 Kerberos agents)`}

\n

{`More information coming soon.`}

\n

\"architecture

\n

{`Kerberos Cloud`}

\n

{`Once you've configured one of the previously mentioned architectures, you will have one or more Kerberos agents running, in the cloud or on-premise.`}

\n

{`Every Kerberos agent comes with a web interface, which makes it possible to review the activity for that specific agent; they don't have a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera / Kerberos agent.`}

\n

{`To simplify this process and resolve some other challenges, Kerberos Cloud was developed.`}

\n
\n

{`Kerberos Cloud`}{` is a cloud solution which allows you to have a single overview of all the media recordings generated by your surveillance cameras. It's not a solution for processing your surveillance cameras in the cloud. For processing of your surveillance cameras, a Kerberos agent is used.`}

\n
\n

{`A brief list of the key features of Kerberos Cloud are:`}

\n
    \n
  • {`Secured storage`}
  • \n
  • {`Consolidated overview`}
  • \n
  • {`Advanced searching`}
  • \n
  • {`Machine learning`}
  • \n
  • {`Alerts`}
  • \n
  • {`Live streaming`}
  • \n
  • {`Accounts`}
  • \n
  • {`Logging`}
  • \n
\n
\n

{`Checkout `}{`the demo environment`}{` to see and feel the Kerberos Cloud solution yourself.`}

\n
\n

{`Architecture`}

\n

{`A simplified architecture is found below. In this architecture the Kerberos agents are installed on-premise (but this could also be in the cloud), next to the surveillance cameras. Once one of the agents recorded something it will send the recording to our AWS S3 bucket, using the credentials you've defined inside the agent.`}

\n

{`As soon as the recording is succesfully received several engines will be executed, that will further process the recording and extract metadata from it (classification, origin of the surveillance camera, etc). A lot of processing is happening behind the scenes.`}

\n

{`By using a browser you can navigate to Kerberos Cloud, and review all the recordings made by the Kerberos agents on-premise. On top of that you will receive more context about the recordings, get notifications, view a livestream and much more. Read more about `}{`Kerberos Cloud here`}{`.`}

\n

\"cloud\"

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file +{"expireTime":9007200838760428000,"key":"gatsby-plugin-mdx-entire-payload-cab813cedba0bc4c42a44e3b2613ca99-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Architectures","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":16,"offset":174},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":16,"offset":174},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"In this section we will explain some usecases and best practices, which might help you to define the architecture that fits your needs.","position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":136,"offset":311},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":176},"end":{"line":10,"column":136,"offset":311},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Please read the ","position":{"start":{"line":12,"column":3,"offset":315},"end":{"line":12,"column":19,"offset":331},"indent":[]}},{"type":"link","title":null,"url":"/","children":[{"type":"text","value":"introduction page","position":{"start":{"line":12,"column":20,"offset":332},"end":{"line":12,"column":37,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":19,"offset":331},"end":{"line":12,"column":41,"offset":353},"indent":[]}},{"type":"text","value":" first, before moving forward.","position":{"start":{"line":12,"column":41,"offset":353},"end":{"line":12,"column":71,"offset":383},"indent":[]}}],"position":{"start":{"line":12,"column":3,"offset":315},"end":{"line":12,"column":71,"offset":383},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":313},"end":{"line":12,"column":71,"offset":383},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When starting with Kerberos you might ask yourself, how should I deploy these so called, Kerberos agents? Well, there are different options. You can install a Kerberos agent on a Raspberry Pi, VM, Server or even in a Kubernetes cluster. So what should you do, and when? Let's have a closer look at the different options.","position":{"start":{"line":14,"column":1,"offset":385},"end":{"line":14,"column":321,"offset":705},"indent":[]}}],"position":{"start":{"line":14,"column":1,"offset":385},"end":{"line":14,"column":321,"offset":705},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The first thing you need to consider is the environment, in which you want to deploy your Kerberos agents. Is it inside your house, your company or a public place? Another important factor is the number of surveillance cameras you would like to monitor, and if you have any high availability requirements.","position":{"start":{"line":16,"column":1,"offset":707},"end":{"line":16,"column":306,"offset":1012},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":707},"end":{"line":16,"column":306,"offset":1012},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Agents on-premise","position":{"start":{"line":18,"column":4,"offset":1017},"end":{"line":18,"column":21,"offset":1034},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1014},"end":{"line":18,"column":21,"offset":1034},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"The most common scenario is to install your Kerberos agents on-premise. This has a couple of benefits such as latency, bandwidth and a less complex security model. When installing a Kerberos agent on-premise, you also have different options.","position":{"start":{"line":20,"column":1,"offset":1036},"end":{"line":20,"column":242,"offset":1277},"indent":[]}}],"position":{"start":{"line":20,"column":1,"offset":1036},"end":{"line":20,"column":242,"offset":1277},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Kerberos Open Source (< 5 Kerberos agents)","position":{"start":{"line":22,"column":5,"offset":1283},"end":{"line":22,"column":47,"offset":1325},"indent":[]}}],"position":{"start":{"line":22,"column":1,"offset":1279},"end":{"line":22,"column":47,"offset":1325},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you have a limited number of surveillance cameras you would like to monitor, and don't have any high availability requirements, the Kerberos Open Source agent is a good choice. For example, you can install the Kerberos Open Source agent on a Raspberry Pi, by using ","position":{"start":{"line":24,"column":1,"offset":1327},"end":{"line":24,"column":269,"offset":1595},"indent":[]}},{"type":"link","title":null,"url":"opensource/installation#kios","children":[{"type":"text","value":"KiOS","position":{"start":{"line":24,"column":270,"offset":1596},"end":{"line":24,"column":274,"offset":1600},"indent":[]}}],"position":{"start":{"line":24,"column":269,"offset":1595},"end":{"line":24,"column":305,"offset":1631},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":24,"column":305,"offset":1631},"end":{"line":24,"column":307,"offset":1633},"indent":[]}},{"type":"link","title":null,"url":"opensource/installation#raspbian","children":[{"type":"text","value":"Raspbian OS","position":{"start":{"line":24,"column":308,"offset":1634},"end":{"line":24,"column":319,"offset":1645},"indent":[]}}],"position":{"start":{"line":24,"column":307,"offset":1633},"end":{"line":24,"column":354,"offset":1680},"indent":[]}},{"type":"text","value":" or compile it from source.","position":{"start":{"line":24,"column":354,"offset":1680},"end":{"line":24,"column":381,"offset":1707},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":1327},"end":{"line":24,"column":381,"offset":1707},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"On below architecture, a couple of Kerberos agents are installed on-premise (inside the local network). A Kerberos agent is installed for each surveillance camera, and each Kerberos agent runs on a seperate host (Raspberry Pi, VM, etc). The web interface of the Kerberos agents can be reached from the internal network, but cannot be accessed from the cloud.","position":{"start":{"line":26,"column":1,"offset":1709},"end":{"line":26,"column":359,"offset":2067},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":1709},"end":{"line":26,"column":359,"offset":2067},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-agent-architecture-kios.png","alt":"architecture kios","position":{"start":{"line":28,"column":1,"offset":2069},"end":{"line":28,"column":76,"offset":2144},"indent":[]}}],"position":{"start":{"line":28,"column":1,"offset":2069},"end":{"line":28,"column":76,"offset":2144},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Another option to install the Kerberos Open Source agent is to use Docker. Instead of having seperate hosts for each Kerberos agent, you will have a single host (Docker host) with multiple Docker containers. A Docker container is deployed for each surveillance camera, which contains the software to run the Kerberos agent.","position":{"start":{"line":30,"column":1,"offset":2146},"end":{"line":30,"column":324,"offset":2469},"indent":[]}}],"position":{"start":{"line":30,"column":1,"offset":2146},"end":{"line":30,"column":324,"offset":2469},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Running your Kerberos agents inside Docker containers, allows you to process multiple surveilllance cameras using only one host.","position":{"start":{"line":32,"column":1,"offset":2471},"end":{"line":32,"column":129,"offset":2599},"indent":[]}}],"position":{"start":{"line":32,"column":1,"offset":2471},"end":{"line":32,"column":129,"offset":2599},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-agent-architecture-docker.png","alt":"architecture kios","position":{"start":{"line":34,"column":1,"offset":2601},"end":{"line":34,"column":78,"offset":2678},"indent":[]}}],"position":{"start":{"line":34,"column":1,"offset":2601},"end":{"line":34,"column":78,"offset":2678},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Kerberos Enterprise (> 5 Kerberos agents)","position":{"start":{"line":36,"column":5,"offset":2684},"end":{"line":36,"column":46,"offset":2725},"indent":[]}}],"position":{"start":{"line":36,"column":1,"offset":2680},"end":{"line":36,"column":46,"offset":2725},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"More information coming soon.","position":{"start":{"line":38,"column":1,"offset":2727},"end":{"line":38,"column":30,"offset":2756},"indent":[]}}],"position":{"start":{"line":38,"column":1,"offset":2727},"end":{"line":38,"column":30,"offset":2756},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-agent-architecture-kubernetes.png","alt":"architecture kubernetes","position":{"start":{"line":40,"column":1,"offset":2758},"end":{"line":40,"column":88,"offset":2845},"indent":[]}}],"position":{"start":{"line":40,"column":1,"offset":2758},"end":{"line":40,"column":88,"offset":2845},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Agents in the cloud","position":{"start":{"line":42,"column":4,"offset":2850},"end":{"line":42,"column":23,"offset":2869},"indent":[]}}],"position":{"start":{"line":42,"column":1,"offset":2847},"end":{"line":42,"column":23,"offset":2869},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Instead of processing your surveillance cameras on-premise you could also process them in the cloud. There are a couple advantages, for example, you don't have to manage your owner hardware, you can simply spin up a VM on one of the hyperscalers.","position":{"start":{"line":44,"column":1,"offset":2871},"end":{"line":44,"column":247,"offset":3117},"indent":[]}}],"position":{"start":{"line":44,"column":1,"offset":2871},"end":{"line":44,"column":247,"offset":3117},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When dealing with Kerberos agents in the cloud, the complexity starts with the security model. As your surveillance cameras are running somewhere on-premise, you will need to make them available to your Kerberos agents, which are running in the cloud. There are several ways to do that, such as port forwarding (not recommended) or setting up a site-to-site VPN (recommended).","position":{"start":{"line":46,"column":1,"offset":3119},"end":{"line":46,"column":377,"offset":3495},"indent":[]}}],"position":{"start":{"line":46,"column":1,"offset":3119},"end":{"line":46,"column":377,"offset":3495},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When setting up a VPN connection you will expose your surveillance cameras to your Kerberos agents. Once you've configured the Kerberos agents, data will flow through this secure tunnel, from on-premise to your cloud enviroment.","position":{"start":{"line":48,"column":1,"offset":3497},"end":{"line":48,"column":229,"offset":3725},"indent":[]}}],"position":{"start":{"line":48,"column":1,"offset":3497},"end":{"line":48,"column":229,"offset":3725},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Kerberos Open Source (< 5 Kerberos agents)","position":{"start":{"line":50,"column":5,"offset":3731},"end":{"line":50,"column":47,"offset":3773},"indent":[]}}],"position":{"start":{"line":50,"column":1,"offset":3727},"end":{"line":50,"column":47,"offset":3773},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If you have a limited number of surveillance cameras you would like to monitor, and don't have any high availability requirements, the Kerberos Open Source agent is a good choice. You can install the Kerberos Open Source agent on Docker. Instead of having seperate VM's for each Kerberos agent, you will have a single VM (Docker host) with multiple Docker containers. A Docker container is deployed for each surveillance camera, which contains the software to run the Kerberos agent.","position":{"start":{"line":52,"column":1,"offset":3775},"end":{"line":52,"column":484,"offset":4258},"indent":[]}}],"position":{"start":{"line":52,"column":1,"offset":3775},"end":{"line":52,"column":484,"offset":4258},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-agent-architecture-docker-cloud.png","alt":"architecture kios","position":{"start":{"line":54,"column":1,"offset":4260},"end":{"line":54,"column":84,"offset":4343},"indent":[]}}],"position":{"start":{"line":54,"column":1,"offset":4260},"end":{"line":54,"column":84,"offset":4343},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Kerberos Enterprise (> 5 Kerberos agents)","position":{"start":{"line":56,"column":5,"offset":4349},"end":{"line":56,"column":46,"offset":4390},"indent":[]}}],"position":{"start":{"line":56,"column":1,"offset":4345},"end":{"line":56,"column":46,"offset":4390},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"More information coming soon.","position":{"start":{"line":58,"column":1,"offset":4392},"end":{"line":58,"column":30,"offset":4421},"indent":[]}}],"position":{"start":{"line":58,"column":1,"offset":4392},"end":{"line":58,"column":30,"offset":4421},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-agent-architecture-kubernetes-cloud.png","alt":"architecture kubernetes","position":{"start":{"line":60,"column":1,"offset":4423},"end":{"line":60,"column":94,"offset":4516},"indent":[]}}],"position":{"start":{"line":60,"column":1,"offset":4423},"end":{"line":60,"column":94,"offset":4516},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kerberos Cloud","position":{"start":{"line":62,"column":4,"offset":4521},"end":{"line":62,"column":18,"offset":4535},"indent":[]}}],"position":{"start":{"line":62,"column":1,"offset":4518},"end":{"line":62,"column":18,"offset":4535},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Once you've configured one of the previously mentioned architectures, you will have one or more Kerberos agents running, in the cloud or on-premise.","position":{"start":{"line":64,"column":1,"offset":4537},"end":{"line":64,"column":149,"offset":4685},"indent":[]}}],"position":{"start":{"line":64,"column":1,"offset":4537},"end":{"line":64,"column":149,"offset":4685},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Every Kerberos agent comes with a web interface, which makes it possible to review the activity for that specific agent; they don't have a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera / Kerberos agent.","position":{"start":{"line":66,"column":1,"offset":4687},"end":{"line":66,"column":286,"offset":4972},"indent":[]}}],"position":{"start":{"line":66,"column":1,"offset":4687},"end":{"line":66,"column":286,"offset":4972},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"To simplify this process and resolve some other challenges, Kerberos Cloud was developed.","position":{"start":{"line":68,"column":1,"offset":4974},"end":{"line":68,"column":90,"offset":5063},"indent":[]}}],"position":{"start":{"line":68,"column":1,"offset":4974},"end":{"line":68,"column":90,"offset":5063},"indent":[]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://cloud.kerberos.io","children":[{"type":"text","value":"Kerberos Cloud","position":{"start":{"line":70,"column":4,"offset":5068},"end":{"line":70,"column":18,"offset":5082},"indent":[]}}],"position":{"start":{"line":70,"column":3,"offset":5067},"end":{"line":70,"column":46,"offset":5110},"indent":[]}},{"type":"text","value":" is a cloud solution which allows you to have a single overview of all the media recordings generated by your surveillance cameras. It's not a solution for processing your surveillance cameras in the cloud. For processing of your surveillance cameras, a Kerberos agent is used.","position":{"start":{"line":70,"column":46,"offset":5110},"end":{"line":70,"column":323,"offset":5387},"indent":[]}}],"position":{"start":{"line":70,"column":3,"offset":5067},"end":{"line":70,"column":323,"offset":5387},"indent":[]}}],"position":{"start":{"line":70,"column":1,"offset":5065},"end":{"line":70,"column":323,"offset":5387},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A brief list of the key features of Kerberos Cloud are:","position":{"start":{"line":72,"column":1,"offset":5389},"end":{"line":72,"column":56,"offset":5444},"indent":[]}}],"position":{"start":{"line":72,"column":1,"offset":5389},"end":{"line":72,"column":56,"offset":5444},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Secured storage","position":{"start":{"line":74,"column":3,"offset":5448},"end":{"line":74,"column":18,"offset":5463},"indent":[]}}],"position":{"start":{"line":74,"column":3,"offset":5448},"end":{"line":74,"column":18,"offset":5463},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":5446},"end":{"line":74,"column":18,"offset":5463},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Consolidated overview","position":{"start":{"line":75,"column":3,"offset":5466},"end":{"line":75,"column":24,"offset":5487},"indent":[]}}],"position":{"start":{"line":75,"column":3,"offset":5466},"end":{"line":75,"column":24,"offset":5487},"indent":[]}}],"position":{"start":{"line":75,"column":1,"offset":5464},"end":{"line":75,"column":24,"offset":5487},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Advanced searching","position":{"start":{"line":76,"column":3,"offset":5490},"end":{"line":76,"column":21,"offset":5508},"indent":[]}}],"position":{"start":{"line":76,"column":3,"offset":5490},"end":{"line":76,"column":21,"offset":5508},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":5488},"end":{"line":76,"column":21,"offset":5508},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Machine learning","position":{"start":{"line":77,"column":3,"offset":5511},"end":{"line":77,"column":19,"offset":5527},"indent":[]}}],"position":{"start":{"line":77,"column":3,"offset":5511},"end":{"line":77,"column":19,"offset":5527},"indent":[]}}],"position":{"start":{"line":77,"column":1,"offset":5509},"end":{"line":77,"column":19,"offset":5527},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Alerts","position":{"start":{"line":78,"column":3,"offset":5530},"end":{"line":78,"column":9,"offset":5536},"indent":[]}}],"position":{"start":{"line":78,"column":3,"offset":5530},"end":{"line":78,"column":9,"offset":5536},"indent":[]}}],"position":{"start":{"line":78,"column":1,"offset":5528},"end":{"line":78,"column":9,"offset":5536},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Live streaming","position":{"start":{"line":79,"column":3,"offset":5539},"end":{"line":79,"column":17,"offset":5553},"indent":[]}}],"position":{"start":{"line":79,"column":3,"offset":5539},"end":{"line":79,"column":17,"offset":5553},"indent":[]}}],"position":{"start":{"line":79,"column":1,"offset":5537},"end":{"line":79,"column":17,"offset":5553},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Accounts","position":{"start":{"line":80,"column":3,"offset":5556},"end":{"line":80,"column":11,"offset":5564},"indent":[]}}],"position":{"start":{"line":80,"column":3,"offset":5556},"end":{"line":80,"column":11,"offset":5564},"indent":[]}}],"position":{"start":{"line":80,"column":1,"offset":5554},"end":{"line":80,"column":11,"offset":5564},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Logging","position":{"start":{"line":81,"column":3,"offset":5567},"end":{"line":81,"column":10,"offset":5574},"indent":[]}}],"position":{"start":{"line":81,"column":3,"offset":5567},"end":{"line":81,"column":10,"offset":5574},"indent":[]}}],"position":{"start":{"line":81,"column":1,"offset":5565},"end":{"line":81,"column":10,"offset":5574},"indent":[]}}],"position":{"start":{"line":74,"column":1,"offset":5446},"end":{"line":81,"column":10,"offset":5574},"indent":[1,1,1,1,1,1,1]}},{"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"Checkout ","position":{"start":{"line":83,"column":3,"offset":5578},"end":{"line":83,"column":12,"offset":5587},"indent":[]}},{"type":"link","title":null,"url":"https://app-demo.kerberos.io","children":[{"type":"text","value":"the demo environment","position":{"start":{"line":83,"column":13,"offset":5588},"end":{"line":83,"column":33,"offset":5608},"indent":[]}}],"position":{"start":{"line":83,"column":12,"offset":5587},"end":{"line":83,"column":64,"offset":5639},"indent":[]}},{"type":"text","value":" to see and feel the Kerberos Cloud solution yourself.","position":{"start":{"line":83,"column":64,"offset":5639},"end":{"line":83,"column":118,"offset":5693},"indent":[]}}],"position":{"start":{"line":83,"column":3,"offset":5578},"end":{"line":83,"column":118,"offset":5693},"indent":[]}}],"position":{"start":{"line":83,"column":1,"offset":5576},"end":{"line":83,"column":118,"offset":5693},"indent":[]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Architecture","position":{"start":{"line":85,"column":5,"offset":5699},"end":{"line":85,"column":17,"offset":5711},"indent":[]}}],"position":{"start":{"line":85,"column":1,"offset":5695},"end":{"line":85,"column":17,"offset":5711},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"A simplified architecture is found below. In this architecture the Kerberos agents are installed on-premise (but this could also be in the cloud), next to the surveillance cameras. Once one of the agents recorded something it will send the recording to our AWS S3 bucket, using the credentials you've defined inside the agent.","position":{"start":{"line":87,"column":1,"offset":5713},"end":{"line":87,"column":327,"offset":6039},"indent":[]}}],"position":{"start":{"line":87,"column":1,"offset":5713},"end":{"line":87,"column":327,"offset":6039},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"As soon as the recording is succesfully received several engines will be executed, that will further process the recording and extract metadata from it (classification, origin of the surveillance camera, etc). A lot of processing is happening behind the scenes.","position":{"start":{"line":89,"column":1,"offset":6041},"end":{"line":89,"column":262,"offset":6302},"indent":[]}}],"position":{"start":{"line":89,"column":1,"offset":6041},"end":{"line":89,"column":262,"offset":6302},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"By using a browser you can navigate to Kerberos Cloud, and review all the recordings made by the Kerberos agents on-premise. On top of that you will receive more context about the recordings, get notifications, view a livestream and much more. Read more about ","position":{"start":{"line":91,"column":1,"offset":6304},"end":{"line":91,"column":261,"offset":6564},"indent":[]}},{"type":"link","title":null,"url":"/cloud","children":[{"type":"text","value":"Kerberos Cloud here","position":{"start":{"line":91,"column":262,"offset":6565},"end":{"line":91,"column":281,"offset":6584},"indent":[]}}],"position":{"start":{"line":91,"column":261,"offset":6564},"end":{"line":91,"column":290,"offset":6593},"indent":[]}},{"type":"text","value":".","position":{"start":{"line":91,"column":290,"offset":6593},"end":{"line":91,"column":291,"offset":6594},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":6304},"end":{"line":91,"column":291,"offset":6594},"indent":[]}},{"type":"paragraph","children":[{"type":"image","title":null,"url":"../public/images/kerberos-architecture.png","alt":"cloud","position":{"start":{"line":93,"column":1,"offset":6596},"end":{"line":93,"column":53,"offset":6648},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":6596},"end":{"line":93,"column":53,"offset":6648},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":96,"column":1,"offset":6651},"end":{"line":96,"column":31,"offset":6681},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":96,"column":31,"offset":6681}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Architectures`}

\n

{`In this section we will explain some usecases and best practices, which might help you to define the architecture that fits your needs.`}

\n
\n

{`Please read the `}{`introduction page`}{` first, before moving forward.`}

\n
\n

{`When starting with Kerberos you might ask yourself, how should I deploy these so called, Kerberos agents? Well, there are different options. You can install a Kerberos agent on a Raspberry Pi, VM, Server or even in a Kubernetes cluster. So what should you do, and when? Let's have a closer look at the different options.`}

\n

{`The first thing you need to consider is the environment, in which you want to deploy your Kerberos agents. Is it inside your house, your company or a public place? Another important factor is the number of surveillance cameras you would like to monitor, and if you have any high availability requirements.`}

\n

{`Agents on-premise`}

\n

{`The most common scenario is to install your Kerberos agents on-premise. This has a couple of benefits such as latency, bandwidth and a less complex security model. When installing a Kerberos agent on-premise, you also have different options.`}

\n

{`Kerberos Open Source (< 5 Kerberos agents)`}

\n

{`If you have a limited number of surveillance cameras you would like to monitor, and don't have any high availability requirements, the Kerberos Open Source agent is a good choice. For example, you can install the Kerberos Open Source agent on a Raspberry Pi, by using `}{`KiOS`}{`, `}{`Raspbian OS`}{` or compile it from source.`}

\n

{`On below architecture, a couple of Kerberos agents are installed on-premise (inside the local network). A Kerberos agent is installed for each surveillance camera, and each Kerberos agent runs on a seperate host (Raspberry Pi, VM, etc). The web interface of the Kerberos agents can be reached from the internal network, but cannot be accessed from the cloud.`}

\n

\"architecture

\n

{`Another option to install the Kerberos Open Source agent is to use Docker. Instead of having seperate hosts for each Kerberos agent, you will have a single host (Docker host) with multiple Docker containers. A Docker container is deployed for each surveillance camera, which contains the software to run the Kerberos agent.`}

\n

{`Running your Kerberos agents inside Docker containers, allows you to process multiple surveilllance cameras using only one host.`}

\n

\"architecture

\n

{`Kerberos Enterprise (> 5 Kerberos agents)`}

\n

{`More information coming soon.`}

\n

\"architecture

\n

{`Agents in the cloud`}

\n

{`Instead of processing your surveillance cameras on-premise you could also process them in the cloud. There are a couple advantages, for example, you don't have to manage your owner hardware, you can simply spin up a VM on one of the hyperscalers.`}

\n

{`When dealing with Kerberos agents in the cloud, the complexity starts with the security model. As your surveillance cameras are running somewhere on-premise, you will need to make them available to your Kerberos agents, which are running in the cloud. There are several ways to do that, such as port forwarding (not recommended) or setting up a site-to-site VPN (recommended).`}

\n

{`When setting up a VPN connection you will expose your surveillance cameras to your Kerberos agents. Once you've configured the Kerberos agents, data will flow through this secure tunnel, from on-premise to your cloud enviroment.`}

\n

{`Kerberos Open Source (< 5 Kerberos agents)`}

\n

{`If you have a limited number of surveillance cameras you would like to monitor, and don't have any high availability requirements, the Kerberos Open Source agent is a good choice. You can install the Kerberos Open Source agent on Docker. Instead of having seperate VM's for each Kerberos agent, you will have a single VM (Docker host) with multiple Docker containers. A Docker container is deployed for each surveillance camera, which contains the software to run the Kerberos agent.`}

\n

\"architecture

\n

{`Kerberos Enterprise (> 5 Kerberos agents)`}

\n

{`More information coming soon.`}

\n

\"architecture

\n

{`Kerberos Cloud`}

\n

{`Once you've configured one of the previously mentioned architectures, you will have one or more Kerberos agents running, in the cloud or on-premise.`}

\n

{`Every Kerberos agent comes with a web interface, which makes it possible to review the activity for that specific agent; they don't have a consolidated overview. This means that you will need to open multiple web interfaces, one for each connected surveillance camera / Kerberos agent.`}

\n

{`To simplify this process and resolve some other challenges, Kerberos Cloud was developed.`}

\n
\n

{`Kerberos Cloud`}{` is a cloud solution which allows you to have a single overview of all the media recordings generated by your surveillance cameras. It's not a solution for processing your surveillance cameras in the cloud. For processing of your surveillance cameras, a Kerberos agent is used.`}

\n
\n

{`A brief list of the key features of Kerberos Cloud are:`}

\n
    \n
  • {`Secured storage`}
  • \n
  • {`Consolidated overview`}
  • \n
  • {`Advanced searching`}
  • \n
  • {`Machine learning`}
  • \n
  • {`Alerts`}
  • \n
  • {`Live streaming`}
  • \n
  • {`Accounts`}
  • \n
  • {`Logging`}
  • \n
\n
\n

{`Checkout `}{`the demo environment`}{` to see and feel the Kerberos Cloud solution yourself.`}

\n
\n

{`Architecture`}

\n

{`A simplified architecture is found below. In this architecture the Kerberos agents are installed on-premise (but this could also be in the cloud), next to the surveillance cameras. Once one of the agents recorded something it will send the recording to our AWS S3 bucket, using the credentials you've defined inside the agent.`}

\n

{`As soon as the recording is succesfully received several engines will be executed, that will further process the recording and extract metadata from it (classification, origin of the surveillance camera, etc). A lot of processing is happening behind the scenes.`}

\n

{`By using a browser you can navigate to Kerberos Cloud, and review all the recordings made by the Kerberos agents on-premise. On top of that you will receive more context about the recordings, get notifications, view a livestream and much more. Read more about `}{`Kerberos Cloud here`}{`.`}

\n

\"cloud\"

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f3577968a9468b505f206c1054b04d0b.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f3577968a9468b505f206c1054b04d0b.json new file mode 100644 index 0000000..70ca91b --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f3577968a9468b505f206c1054b04d0b.json @@ -0,0 +1 @@ +{"expireTime":9007200838831110000,"key":"gatsby-plugin-mdx-entire-payload-d440bf14cc95177a046d9562b464ff1d-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"## Global Docker image parameters\n## Please, note that this will override the image parameters, including dependencies, configured to use the global value\n## Current available global Docker image parameters: imageRegistry and imagePullSecrets\n##\n# global:\n# imageRegistry: myRegistryName\n# imagePullSecrets:\n# - myRegistryKeySecretName\n# storageClass: myStorageClass\n\nimage:\n ## Bitnami MongoDB registry\n ##\n registry: docker.io\n ## Bitnami MongoDB image name\n ##\n repository: bitnami/mongodb\n ## Bitnami MongoDB image tag\n ## ref: https://hub.docker.com/r/bitnami/mongodb/tags/\n ##\n tag: 4.2.3-debian-10-r31\n ## Specify a imagePullPolicy\n ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n ##\n pullPolicy: IfNotPresent\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n\n ## Set to true if you would like to see extra information on logs\n ## It turns on Bitnami debugging in minideb-extras-base\n ## ref: https://github.com/bitnami/minideb-extras-base\n debug: false\n\n## String to partially override mongodb.fullname template (will maintain the release name)\n##\n# nameOverride:\n\n## String to fully override mongodb.fullname template\n##\n# fullnameOverride:\n\n# Add custom extra environment variables to all the MongoDB containers\n# extraEnvVars:\n\n## Init containers parameters:\n## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.\n##\nvolumePermissions:\n enabled: false\n image:\n registry: docker.io\n repository: bitnami/minideb\n tag: buster\n pullPolicy: Always\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n resources: {}\n\n## Enable authentication\n## ref: https://docs.mongodb.com/manual/tutorial/enable-authentication/\n#\nusePassword: true\n# existingSecret: name-of-existing-secret\n\n## MongoDB admin password\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#setting-the-root-password-on-first-run\n##\nmongodbRootPassword: 9832sfascvn31\n\n## MongoDB custom user and database\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#creating-a-user-and-database-on-first-run\n##\n# mongodbUsername: username\n# mongodbPassword: password\n# mongodbDatabase: database\n\n## Whether enable/disable IPv6 on MongoDB\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-ipv6\n##\nmongodbEnableIPv6: false\n\n## Whether enable/disable DirectoryPerDB on MongoDB\n## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-directoryperdb\n##\nmongodbDirectoryPerDB: false\n\n## MongoDB System Log configuration\n## ref: https://github.com/bitnami/bitnami-docker-mongodb#configuring-system-log-verbosity-level\n##\nmongodbSystemLogVerbosity: 0\nmongodbDisableSystemLog: false\n\n## MongoDB additional command line flags\n##\n## Can be used to specify command line flags, for example:\n##\n## mongodbExtraFlags:\n## - \"--wiredTigerCacheSizeGB=2\"\nmongodbExtraFlags: []\n\n## Pod Security Context\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/\n##\nsecurityContext:\n enabled: true\n fsGroup: 1001\n runAsUser: 1001\n\n## Kubernetes Cluster Domain\nclusterDomain: cluster.local\n\n## Kubernetes service type\nservice:\n ## Specify an explicit service name.\n # name: svc-mongo\n ## Provide any additional annotations which may be required.\n ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart\n annotations: {}\n type: ClusterIP\n # clusterIP: None\n port: 27017\n\n ## Specify the nodePort value for the LoadBalancer and NodePort service types.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport\n ##\n # nodePort:\n\n ## Specify the externalIP value ClusterIP service type.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips\n # externalIPs: []\n\n ## Specify the loadBalancerIP value for LoadBalancer service types.\n ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer\n ##\n # loadBalancerIP:\n\n ## Specify the loadBalancerSourceRanges value for LoadBalancer service types.\n ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service\n ##\n # loadBalancerSourceRanges: []\n\n## Use StatefulSet instead of Deployment when deploying standalone\nuseStatefulSet: false\n\n## Setting up replication\n## ref: https://github.com/bitnami/bitnami-docker-mongodb#setting-up-a-replication\n#\nreplicaSet:\n ## Whether to create a MongoDB replica set for high availability or not\n enabled: false\n useHostnames: true\n\n ## Name of the replica set\n ##\n name: rs0\n\n ## Key used for replica set authentication\n ##\n # key: key\n\n ## Number of replicas per each node type\n ##\n replicas:\n secondary: 0\n arbiter: 0\n\n ## Pod Disruption Budget\n ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/\n pdb:\n enabled: false\n minAvailable:\n secondary: 1\n arbiter: 1\n # maxUnavailable:\n # secondary: 1\n # arbiter: 1\n\n# Annotations to be added to the deployment or statefulsets\nannotations: {}\n\n# Additional labels to apply to the deployment or statefulsets\nlabels: {}\n\n# Annotations to be added to MongoDB pods\npodAnnotations: {}\n\n# Additional pod labels to apply\npodLabels: {}\n\n## Use an alternate scheduler, e.g. \"stork\".\n## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n##\n# schedulerName:\n\n## Configure resource requests and limits\n## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n##\nresources: {}\n# Define separate resources per arbiter, which are less then primary or secondary\n# used only when replica set is enabled\nresourcesArbiter: {}\n# limits:\n# cpu: 500m\n# memory: 512Mi\n# requests:\n# cpu: 100m\n# memory: 256Mi\n\n## Pod priority\n## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/\n# priorityClassName: \"\"\n\n## Node selector\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector\nnodeSelector: {}\n\n## Affinity\n## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\naffinity: {}\n# Define separate affinity for arbiter pod\naffinityArbiter: {}\n\n## Tolerations\n## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\ntolerations: []\n\n## Add sidecars to the pod\n##\n## For example:\n## sidecars:\n## - name: your-image-name\n## image: your-image\n## imagePullPolicy: Always\n## ports:\n## - name: portname\n## containerPort: 1234\nsidecars: []\n## Array to add extra volumes\n##\nextraVolumes: []\n## Array to add extra mounts (normally used with extraVolumes)\n##\nextraVolumeMounts: []\n\n## Add sidecars to the arbiter pod\n# used only when replica set is enabled\n##\n## For example:\n## sidecars:\n## - name: your-image-name\n## image: your-image\n## imagePullPolicy: Always\n## ports:\n## - name: portname\n## containerPort: 1234\nsidecarsArbiter: []\n## Array to add extra volumes to the arbiter\n# used only when replica set is enabled\n##\nextraVolumesArbiter: []\n## Array to add extra mounts (normally used with extraVolumes) to the arbiter\n# used only when replica set is enabled\n##\nextraVolumeMountsArbiter: []\n\n## updateStrategy for MongoDB Primary, Secondary and Arbitrer statefulsets\n## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies\nupdateStrategy:\n type: RollingUpdate\n\n## Enable persistence using Persistent Volume Claims\n## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/\n##\npersistence:\n enabled: true\n ## A manually managed Persistent Volume and Claim\n ## Requires persistence.enabled: true\n ## If defined, PVC must be created manually before volume will be bound\n ##\n # existingClaim:\n\n ## The path the volume will be mounted at, useful when using different\n ## MongoDB images.\n ##\n mountPath: /bitnami/mongodb\n\n ## The subdirectory of the volume to mount to, useful in dev environments\n ## and one PV for multiple services.\n ##\n subPath: \"\"\n\n ## mongodb data Persistent Volume Storage Class\n ## If defined, storageClassName: \n ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning\n ## If undefined (the default) or set to null, no storageClassName spec is\n ## set, choosing the default provisioner. (gp2 on AWS, standard on\n ## GKE, AWS & OpenStack)\n ##\n # storageClass: \"-\"\n accessModes:\n - ReadWriteOnce\n size: 8Gi\n annotations: {}\n\n## Configure the ingress resource that allows you to access the\n## MongoDB installation. Set up the URL\n## ref: http://kubernetes.io/docs/user-guide/ingress/\n##\ningress:\n ## Set to true to enable ingress record generation\n enabled: false\n\n ## Set this to true in order to add the corresponding annotations for cert-manager\n certManager: false\n\n ## Ingress annotations done as key:value pairs\n ## For a full list of possible ingress annotations, please see\n ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md\n ##\n ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: \"true\" will automatically be set\n ## If certManager is set to true, annotation kubernetes.io/tls-acme: \"true\" will automatically be set\n annotations:\n # kubernetes.io/ingress.class: nginx\n\n ## The list of hostnames to be covered with this ingress record.\n ## Most likely this will be just one host, but in the event more hosts are needed, this is an array\n hosts:\n - name: mongodb.local\n path: /\n\n ## The tls configuration for the ingress\n ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n tls:\n - hosts:\n - mongodb.local\n secretName: mongodb.local-tls\n\n secrets:\n ## If you're providing your own certificates, please use this to add the certificates as secrets\n ## key and certificate should start with -----BEGIN CERTIFICATE----- or\n ## -----BEGIN RSA PRIVATE KEY-----\n ##\n ## name should line up with a tlsSecret set further up\n ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set\n ##\n ## It is also possible to create and manage the certificates outside of this helm chart\n ## Please see README.md for more information\n # - name: airflow.local-tls\n # key:\n # certificate:\n\n## Configure the options for init containers to be run before the main app containers\n## are started. All init containers are run sequentially and must exit without errors\n## for the next one to be started.\n## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\n# extraInitContainers: |\n# - name: do-something\n# image: busybox\n# command: ['do', 'something']\n\n## Configure extra options for liveness and readiness probes\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)\nlivenessProbe:\n enabled: true\n initialDelaySeconds: 30\n periodSeconds: 10\n timeoutSeconds: 5\n failureThreshold: 6\n successThreshold: 1\nreadinessProbe:\n enabled: true\n initialDelaySeconds: 5\n periodSeconds: 10\n timeoutSeconds: 5\n failureThreshold: 6\n successThreshold: 1\n\n# Define custom config map with init scripts\ninitConfigMap: {}\n# name: \"init-config-map\"\n\n## Entries for the MongoDB config file. For documentation of all options, see:\n## http://docs.mongodb.org/manual/reference/configuration-options/\n##\nconfigmap:\n# # where and how to store data.\n# storage:\n# dbPath: /bitnami/mongodb/data/db\n# journal:\n# enabled: true\n# directoryPerDB: false\n# # where to write logging data.\n# systemLog:\n# destination: file\n# quiet: false\n# logAppend: true\n# logRotate: reopen\n# path: /opt/bitnami/mongodb/logs/mongodb.log\n# verbosity: 0\n# # network interfaces\n# net:\n# port: 27017\n# unixDomainSocket:\n# enabled: true\n# pathPrefix: /opt/bitnami/mongodb/tmp\n# ipv6: false\n# bindIpAll: true\n# # replica set options\n# #replication:\n# #replSetName: replicaset\n# #enableMajorityReadConcern: true\n# # process management options\n# processManagement:\n# fork: false\n# pidFilePath: /opt/bitnami/mongodb/tmp/mongodb.pid\n# # set parameter options\n# setParameter:\n# enableLocalhostAuthBypass: true\n# # security options\n# security:\n# authorization: disabled\n# #keyFile: /opt/bitnami/mongodb/conf/keyfile\n\n## Prometheus Exporter / Metrics\n##\nmetrics:\n enabled: true\n\n image:\n registry: docker.io\n repository: bitnami/mongodb-exporter\n tag: 0.10.0-debian-10-r27\n pullPolicy: IfNotPresent\n ## Optionally specify an array of imagePullSecrets.\n ## Secrets must be manually created in the namespace.\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n ##\n # pullSecrets:\n # - myRegistryKeySecretName\n\n ## String with extra arguments to the metrics exporter\n ## ref: https://github.com/percona/mongodb_exporter/blob/master/mongodb_exporter.go\n extraArgs: \"\"\n\n ## Metrics exporter resource requests and limits\n ## ref: http://kubernetes.io/docs/user-guide/compute-resources/\n ##\n # resources: {}\n\n ## Metrics exporter liveness and readiness probes\n ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)\n livenessProbe:\n enabled: true\n initialDelaySeconds: 15\n periodSeconds: 5\n timeoutSeconds: 5\n failureThreshold: 3\n successThreshold: 1\n readinessProbe:\n enabled: true\n initialDelaySeconds: 5\n periodSeconds: 5\n timeoutSeconds: 1\n failureThreshold: 3\n successThreshold: 1\n\n ## Metrics exporter pod Annotation\n podAnnotations:\n prometheus.io/scrape: \"true\"\n prometheus.io/port: \"9216\"\n\n ## Prometheus Service Monitor\n ## ref: https://github.com/coreos/prometheus-operator\n ## https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md\n serviceMonitor:\n ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry\n enabled: false\n\n ## Specify a namespace if needed\n # namespace: monitoring\n\n ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec\n additionalLabels: {}\n\n ## Specify Metric Relabellings to add to the scrape endpoint\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint\n # relabellings:\n\n alerting:\n ## Define individual alerting rules as required\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#rulegroup\n ## https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/\n rules: {}\n\n ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Prometheus Rules to work with\n ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec\n additionalLabels: {}","position":{"start":{"line":115,"column":1,"offset":3500},"end":{"line":620,"column":31,"offset":21023},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":622,"column":4,"offset":21028},"end":{"line":622,"column":11,"offset":21035},"indent":[]}}],"position":{"start":{"line":622,"column":1,"offset":21025},"end":{"line":622,"column":11,"offset":21035},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":624,"column":1,"offset":21037},"end":{"line":624,"column":74,"offset":21110},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":624,"column":76,"offset":21112},"end":{"line":624,"column":83,"offset":21119},"indent":[]}}],"position":{"start":{"line":624,"column":74,"offset":21110},"end":{"line":624,"column":85,"offset":21121},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":624,"column":85,"offset":21121},"end":{"line":627,"column":76,"offset":21502},"indent":[1,1,1]}}],"position":{"start":{"line":624,"column":1,"offset":21037},"end":{"line":627,"column":76,"offset":21502},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":629,"column":1,"offset":21504},"end":{"line":629,"column":47,"offset":21550},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":631,"column":1,"offset":21552},"end":{"line":631,"column":26,"offset":21577},"indent":[]}}],"position":{"start":{"line":631,"column":1,"offset":21552},"end":{"line":631,"column":26,"offset":21577},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: factory\nspec:\n replicas: 1\n selector:\n matchLabels:\n app: factory\n minReadySeconds: 10\n strategy:\n type: RollingUpdate\n rollingUpdate:\n maxUnavailable: 1\n maxSurge: 1\n template:\n metadata:\n labels:\n app: factory\n spec:\n containers:\n - name: machinery\n image: cedricvers/factory-buildx:1.0.5\n ports:\n - containerPort: 80\n - containerPort: 8081\n env:\n - name: MACHINERY_VERSION\n value: \"1.0.1\"\n - name: FACTORY_ENVIRONMENT\n value: \"kubernetes\"\n - name: FACTORY_PWD\n value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"\n - name: MONGODB_HOST\n value: \"mongodb\"\n - name: MONGODB_DATABASE_CREDENTIALS\n value: \"admin\"\n - name: MONGODB_USERNAME\n value: \"root\"\n - name: MONGODB_PASSWORD\n value: \"9832sfascvn31\"\n - name: MQTT_URL\n value: \"tcp://127.0.0.1:1883\"\n - name: MQTT_USERNAME\n value: \"\"\n - name: MQTT_PASSWORD\n value: \"\"\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: factory\n labels:\n app: factory\nspec:\n ports:\n - port: 80\n targetPort: 80\n name: frontend\n protocol: TCP\n - port: 8081\n name: backend\n targetPort: 8081\n protocol: TCP\n selector:\n app: factory\n---\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n name: factory\n annotations:\n kubernetes.io/ingress.class: traefik\nspec:\n rules:\n - host: factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 80\n - host: api.factory.domain.com\n http:\n paths:\n - path: /\n backend:\n serviceName: factory\n servicePort: 8081","position":{"start":{"line":633,"column":1,"offset":21579},"end":{"line":721,"column":32,"offset":23773},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Running","position":{"start":{"line":723,"column":3,"offset":23777},"end":{"line":723,"column":10,"offset":23784},"indent":[]}}],"position":{"start":{"line":723,"column":1,"offset":23775},"end":{"line":723,"column":10,"offset":23784},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":725,"column":1,"offset":23786},"end":{"line":725,"column":94,"offset":23879},"indent":[]}}],"position":{"start":{"line":725,"column":1,"offset":23786},"end":{"line":725,"column":94,"offset":23879},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":727,"column":5,"offset":23885},"end":{"line":727,"column":12,"offset":23892},"indent":[]}}],"position":{"start":{"line":727,"column":5,"offset":23885},"end":{"line":727,"column":12,"offset":23892},"indent":[]}}],"position":{"start":{"line":727,"column":1,"offset":23881},"end":{"line":727,"column":12,"offset":23892},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":728,"column":5,"offset":23897},"end":{"line":728,"column":12,"offset":23904},"indent":[]}}],"position":{"start":{"line":728,"column":5,"offset":23897},"end":{"line":728,"column":12,"offset":23904},"indent":[]}}],"position":{"start":{"line":728,"column":1,"offset":23893},"end":{"line":728,"column":12,"offset":23904},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":729,"column":5,"offset":23909},"end":{"line":729,"column":12,"offset":23916},"indent":[]}}],"position":{"start":{"line":729,"column":5,"offset":23909},"end":{"line":729,"column":12,"offset":23916},"indent":[]}}],"position":{"start":{"line":729,"column":1,"offset":23905},"end":{"line":729,"column":12,"offset":23916},"indent":[]}}],"position":{"start":{"line":727,"column":1,"offset":23881},"end":{"line":729,"column":12,"offset":23916},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":731,"column":1,"offset":23918},"end":{"line":731,"column":26,"offset":23943},"indent":[]}}],"position":{"start":{"line":731,"column":1,"offset":23918},"end":{"line":731,"column":26,"offset":23943},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":733,"column":1,"offset":23945},"end":{"line":737,"column":73,"offset":24257},"indent":[1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":740,"column":1,"offset":24260},"end":{"line":740,"column":31,"offset":24290},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":740,"column":31,"offset":24290}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`## Global Docker image parameters`}{`\n`}{`## Please, note that this will override the image parameters, including dependencies, configured to use the global value`}{`\n`}{`## Current available global Docker image parameters: imageRegistry and imagePullSecrets`}{`\n`}{`##`}{`\n`}{`# global:`}{`\n`}{`#   imageRegistry: myRegistryName`}{`\n`}{`#   imagePullSecrets:`}{`\n`}{`#     - myRegistryKeySecretName`}{`\n`}{`#   storageClass: myStorageClass`}{`\n`}{`\n`}{`image:`}{`\n`}{`  ## Bitnami MongoDB registry`}{`\n`}{`  ##`}{`\n`}{`  registry: docker.io`}{`\n`}{`  ## Bitnami MongoDB image name`}{`\n`}{`  ##`}{`\n`}{`  repository: bitnami/mongodb`}{`\n`}{`  ## Bitnami MongoDB image tag`}{`\n`}{`  ## ref: https://hub.docker.com/r/bitnami/mongodb/tags/`}{`\n`}{`  ##`}{`\n`}{`  tag: 4.2.3-debian-10-r31`}{`\n`}{`  ## Specify a imagePullPolicy`}{`\n`}{`  ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images`}{`\n`}{`  ##`}{`\n`}{`  pullPolicy: IfNotPresent`}{`\n`}{`  ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`  ## Secrets must be manually created in the namespace.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`  ##`}{`\n`}{`  # pullSecrets:`}{`\n`}{`  #   - myRegistryKeySecretName`}{`\n`}{`\n`}{`  ## Set to true if you would like to see extra information on logs`}{`\n`}{`  ## It turns on Bitnami debugging in minideb-extras-base`}{`\n`}{`  ## ref:  https://github.com/bitnami/minideb-extras-base`}{`\n`}{`  debug: false`}{`\n`}{`\n`}{`## String to partially override mongodb.fullname template (will maintain the release name)`}{`\n`}{`##`}{`\n`}{`# nameOverride:`}{`\n`}{`\n`}{`## String to fully override mongodb.fullname template`}{`\n`}{`##`}{`\n`}{`# fullnameOverride:`}{`\n`}{`\n`}{`# Add custom extra environment variables to all the MongoDB containers`}{`\n`}{`# extraEnvVars:`}{`\n`}{`\n`}{`## Init containers parameters:`}{`\n`}{`## volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.`}{`\n`}{`##`}{`\n`}{`volumePermissions:`}{`\n`}{`  enabled: false`}{`\n`}{`  image:`}{`\n`}{`    registry: docker.io`}{`\n`}{`    repository: bitnami/minideb`}{`\n`}{`    tag: buster`}{`\n`}{`    pullPolicy: Always`}{`\n`}{`    ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`    ## Secrets must be manually created in the namespace.`}{`\n`}{`    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`    ##`}{`\n`}{`    # pullSecrets:`}{`\n`}{`    #   - myRegistryKeySecretName`}{`\n`}{`  resources: {}`}{`\n`}{`\n`}{`## Enable authentication`}{`\n`}{`## ref: https://docs.mongodb.com/manual/tutorial/enable-authentication/`}{`\n`}{`#`}{`\n`}{`usePassword: true`}{`\n`}{`# existingSecret: name-of-existing-secret`}{`\n`}{`\n`}{`## MongoDB admin password`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#setting-the-root-password-on-first-run`}{`\n`}{`##`}{`\n`}{`mongodbRootPassword: 9832sfascvn31`}{`\n`}{`\n`}{`## MongoDB custom user and database`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#creating-a-user-and-database-on-first-run`}{`\n`}{`##`}{`\n`}{`# mongodbUsername: username`}{`\n`}{`# mongodbPassword: password`}{`\n`}{`# mongodbDatabase: database`}{`\n`}{`\n`}{`## Whether enable/disable IPv6 on MongoDB`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-ipv6`}{`\n`}{`##`}{`\n`}{`mongodbEnableIPv6: false`}{`\n`}{`\n`}{`## Whether enable/disable DirectoryPerDB on MongoDB`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb/blob/master/README.md#enabling/disabling-directoryperdb`}{`\n`}{`##`}{`\n`}{`mongodbDirectoryPerDB: false`}{`\n`}{`\n`}{`## MongoDB System Log configuration`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb#configuring-system-log-verbosity-level`}{`\n`}{`##`}{`\n`}{`mongodbSystemLogVerbosity: 0`}{`\n`}{`mongodbDisableSystemLog: false`}{`\n`}{`\n`}{`## MongoDB additional command line flags`}{`\n`}{`##`}{`\n`}{`## Can be used to specify command line flags, for example:`}{`\n`}{`##`}{`\n`}{`## mongodbExtraFlags:`}{`\n`}{`##  - \"--wiredTigerCacheSizeGB=2\"`}{`\n`}{`mongodbExtraFlags: []`}{`\n`}{`\n`}{`## Pod Security Context`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/`}{`\n`}{`##`}{`\n`}{`securityContext:`}{`\n`}{`  enabled: true`}{`\n`}{`  fsGroup: 1001`}{`\n`}{`  runAsUser: 1001`}{`\n`}{`\n`}{`## Kubernetes Cluster Domain`}{`\n`}{`clusterDomain: cluster.local`}{`\n`}{`\n`}{`## Kubernetes service type`}{`\n`}{`service:`}{`\n`}{`  ## Specify an explicit service name.`}{`\n`}{`  # name: svc-mongo`}{`\n`}{`  ## Provide any additional annotations which may be required.`}{`\n`}{`  ## The value is evaluated as a template, so, for example, the value can depend on .Release or .Chart`}{`\n`}{`  annotations: {}`}{`\n`}{`  type: ClusterIP`}{`\n`}{`  # clusterIP: None`}{`\n`}{`  port: 27017`}{`\n`}{`\n`}{`  ## Specify the nodePort value for the LoadBalancer and NodePort service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport`}{`\n`}{`  ##`}{`\n`}{`  # nodePort:`}{`\n`}{`\n`}{`  ## Specify the externalIP value ClusterIP service type.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips`}{`\n`}{`  # externalIPs: []`}{`\n`}{`\n`}{`  ## Specify the loadBalancerIP value for LoadBalancer service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer`}{`\n`}{`  ##`}{`\n`}{`  # loadBalancerIP:`}{`\n`}{`\n`}{`  ## Specify the loadBalancerSourceRanges value for LoadBalancer service types.`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service`}{`\n`}{`  ##`}{`\n`}{`  # loadBalancerSourceRanges: []`}{`\n`}{`\n`}{`## Use StatefulSet instead of Deployment when deploying standalone`}{`\n`}{`useStatefulSet: false`}{`\n`}{`\n`}{`## Setting up replication`}{`\n`}{`## ref: https://github.com/bitnami/bitnami-docker-mongodb#setting-up-a-replication`}{`\n`}{`#`}{`\n`}{`replicaSet:`}{`\n`}{`  ## Whether to create a MongoDB replica set for high availability or not`}{`\n`}{`  enabled: false`}{`\n`}{`  useHostnames: true`}{`\n`}{`\n`}{`  ## Name of the replica set`}{`\n`}{`  ##`}{`\n`}{`  name: rs0`}{`\n`}{`\n`}{`  ## Key used for replica set authentication`}{`\n`}{`  ##`}{`\n`}{`  # key: key`}{`\n`}{`\n`}{`  ## Number of replicas per each node type`}{`\n`}{`  ##`}{`\n`}{`  replicas:`}{`\n`}{`    secondary: 0`}{`\n`}{`    arbiter: 0`}{`\n`}{`\n`}{`  ## Pod Disruption Budget`}{`\n`}{`  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/`}{`\n`}{`  pdb:`}{`\n`}{`    enabled: false`}{`\n`}{`    minAvailable:`}{`\n`}{`      secondary: 1`}{`\n`}{`      arbiter: 1`}{`\n`}{`    # maxUnavailable:`}{`\n`}{`      # secondary: 1`}{`\n`}{`      # arbiter: 1`}{`\n`}{`\n`}{`# Annotations to be added to the deployment or statefulsets`}{`\n`}{`annotations: {}`}{`\n`}{`\n`}{`# Additional labels to apply to the deployment or statefulsets`}{`\n`}{`labels: {}`}{`\n`}{`\n`}{`# Annotations to be added to MongoDB pods`}{`\n`}{`podAnnotations: {}`}{`\n`}{`\n`}{`# Additional pod labels to apply`}{`\n`}{`podLabels: {}`}{`\n`}{`\n`}{`## Use an alternate scheduler, e.g. \"stork\".`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/`}{`\n`}{`##`}{`\n`}{`# schedulerName:`}{`\n`}{`\n`}{`## Configure resource requests and limits`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/compute-resources/`}{`\n`}{`##`}{`\n`}{`resources: {}`}{`\n`}{`# Define separate resources per arbiter, which are less then primary or secondary`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`resourcesArbiter: {}`}{`\n`}{`# limits:`}{`\n`}{`#   cpu: 500m`}{`\n`}{`#   memory: 512Mi`}{`\n`}{`# requests:`}{`\n`}{`#   cpu: 100m`}{`\n`}{`#   memory: 256Mi`}{`\n`}{`\n`}{`## Pod priority`}{`\n`}{`## https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/`}{`\n`}{`# priorityClassName: \"\"`}{`\n`}{`\n`}{`## Node selector`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector`}{`\n`}{`nodeSelector: {}`}{`\n`}{`\n`}{`## Affinity`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity`}{`\n`}{`affinity: {}`}{`\n`}{`# Define separate affinity for arbiter pod`}{`\n`}{`affinityArbiter: {}`}{`\n`}{`\n`}{`## Tolerations`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/`}{`\n`}{`tolerations: []`}{`\n`}{`\n`}{`## Add sidecars to the pod`}{`\n`}{`##`}{`\n`}{`## For example:`}{`\n`}{`## sidecars:`}{`\n`}{`##   - name: your-image-name`}{`\n`}{`##     image: your-image`}{`\n`}{`##     imagePullPolicy: Always`}{`\n`}{`##     ports:`}{`\n`}{`##       - name: portname`}{`\n`}{`##         containerPort: 1234`}{`\n`}{`sidecars: []`}{`\n`}{`## Array to add extra volumes`}{`\n`}{`##`}{`\n`}{`extraVolumes: []`}{`\n`}{`## Array to add extra mounts (normally used with extraVolumes)`}{`\n`}{`##`}{`\n`}{`extraVolumeMounts: []`}{`\n`}{`\n`}{`## Add sidecars to the arbiter pod`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`## For example:`}{`\n`}{`## sidecars:`}{`\n`}{`##   - name: your-image-name`}{`\n`}{`##     image: your-image`}{`\n`}{`##     imagePullPolicy: Always`}{`\n`}{`##     ports:`}{`\n`}{`##       - name: portname`}{`\n`}{`##         containerPort: 1234`}{`\n`}{`sidecarsArbiter: []`}{`\n`}{`## Array to add extra volumes to the arbiter`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`extraVolumesArbiter: []`}{`\n`}{`## Array to add extra mounts (normally used with extraVolumes) to the arbiter`}{`\n`}{`# used only when replica set is enabled`}{`\n`}{`##`}{`\n`}{`extraVolumeMountsArbiter: []`}{`\n`}{`\n`}{`## updateStrategy for MongoDB Primary, Secondary and Arbitrer statefulsets`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies`}{`\n`}{`updateStrategy:`}{`\n`}{`  type: RollingUpdate`}{`\n`}{`\n`}{`## Enable persistence using Persistent Volume Claims`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/`}{`\n`}{`##`}{`\n`}{`persistence:`}{`\n`}{`  enabled: true`}{`\n`}{`  ## A manually managed Persistent Volume and Claim`}{`\n`}{`  ## Requires persistence.enabled: true`}{`\n`}{`  ## If defined, PVC must be created manually before volume will be bound`}{`\n`}{`  ##`}{`\n`}{`  # existingClaim:`}{`\n`}{`\n`}{`  ## The path the volume will be mounted at, useful when using different`}{`\n`}{`  ## MongoDB images.`}{`\n`}{`  ##`}{`\n`}{`  mountPath: /bitnami/mongodb`}{`\n`}{`\n`}{`  ## The subdirectory of the volume to mount to, useful in dev environments`}{`\n`}{`  ## and one PV for multiple services.`}{`\n`}{`  ##`}{`\n`}{`  subPath: \"\"`}{`\n`}{`\n`}{`  ## mongodb data Persistent Volume Storage Class`}{`\n`}{`  ## If defined, storageClassName: `}{`\n`}{`  ## If set to \"-\", storageClassName: \"\", which disables dynamic provisioning`}{`\n`}{`  ## If undefined (the default) or set to null, no storageClassName spec is`}{`\n`}{`  ##   set, choosing the default provisioner.  (gp2 on AWS, standard on`}{`\n`}{`  ##   GKE, AWS & OpenStack)`}{`\n`}{`  ##`}{`\n`}{`  # storageClass: \"-\"`}{`\n`}{`  accessModes:`}{`\n`}{`    - ReadWriteOnce`}{`\n`}{`  size: 8Gi`}{`\n`}{`  annotations: {}`}{`\n`}{`\n`}{`## Configure the ingress resource that allows you to access the`}{`\n`}{`## MongoDB installation. Set up the URL`}{`\n`}{`## ref: http://kubernetes.io/docs/user-guide/ingress/`}{`\n`}{`##`}{`\n`}{`ingress:`}{`\n`}{`  ## Set to true to enable ingress record generation`}{`\n`}{`  enabled: false`}{`\n`}{`\n`}{`  ## Set this to true in order to add the corresponding annotations for cert-manager`}{`\n`}{`  certManager: false`}{`\n`}{`\n`}{`  ## Ingress annotations done as key:value pairs`}{`\n`}{`  ## For a full list of possible ingress annotations, please see`}{`\n`}{`  ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md`}{`\n`}{`  ##`}{`\n`}{`  ## If tls is set to true, annotation ingress.kubernetes.io/secure-backends: \"true\" will automatically be set`}{`\n`}{`  ## If certManager is set to true, annotation kubernetes.io/tls-acme: \"true\" will automatically be set`}{`\n`}{`  annotations:`}{`\n`}{`  #  kubernetes.io/ingress.class: nginx`}{`\n`}{`\n`}{`  ## The list of hostnames to be covered with this ingress record.`}{`\n`}{`  ## Most likely this will be just one host, but in the event more hosts are needed, this is an array`}{`\n`}{`  hosts:`}{`\n`}{`  - name: mongodb.local`}{`\n`}{`    path: /`}{`\n`}{`\n`}{`  ## The tls configuration for the ingress`}{`\n`}{`  ## see: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls`}{`\n`}{`  tls:`}{`\n`}{`  - hosts:`}{`\n`}{`      - mongodb.local`}{`\n`}{`    secretName: mongodb.local-tls`}{`\n`}{`\n`}{`  secrets:`}{`\n`}{`  ## If you're providing your own certificates, please use this to add the certificates as secrets`}{`\n`}{`  ## key and certificate should start with -----BEGIN CERTIFICATE----- or`}{`\n`}{`  ## -----BEGIN RSA PRIVATE KEY-----`}{`\n`}{`  ##`}{`\n`}{`  ## name should line up with a tlsSecret set further up`}{`\n`}{`  ## If you're using cert-manager, this is unneeded, as it will create the secret for you if it is not set`}{`\n`}{`  ##`}{`\n`}{`  ## It is also possible to create and manage the certificates outside of this helm chart`}{`\n`}{`  ## Please see README.md for more information`}{`\n`}{`  # - name: airflow.local-tls`}{`\n`}{`  #   key:`}{`\n`}{`  #   certificate:`}{`\n`}{`\n`}{`## Configure the options for init containers to be run before the main app containers`}{`\n`}{`## are started. All init containers are run sequentially and must exit without errors`}{`\n`}{`## for the next one to be started.`}{`\n`}{`## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/`}{`\n`}{`# extraInitContainers: |`}{`\n`}{`#   - name: do-something`}{`\n`}{`#     image: busybox`}{`\n`}{`#     command: ['do', 'something']`}{`\n`}{`\n`}{`## Configure extra options for liveness and readiness probes`}{`\n`}{`## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)`}{`\n`}{`livenessProbe:`}{`\n`}{`  enabled: true`}{`\n`}{`  initialDelaySeconds: 30`}{`\n`}{`  periodSeconds: 10`}{`\n`}{`  timeoutSeconds: 5`}{`\n`}{`  failureThreshold: 6`}{`\n`}{`  successThreshold: 1`}{`\n`}{`readinessProbe:`}{`\n`}{`  enabled: true`}{`\n`}{`  initialDelaySeconds: 5`}{`\n`}{`  periodSeconds: 10`}{`\n`}{`  timeoutSeconds: 5`}{`\n`}{`  failureThreshold: 6`}{`\n`}{`  successThreshold: 1`}{`\n`}{`\n`}{`# Define custom config map with init scripts`}{`\n`}{`initConfigMap: {}`}{`\n`}{`#  name: \"init-config-map\"`}{`\n`}{`\n`}{`## Entries for the MongoDB config file. For documentation of all options, see:`}{`\n`}{`##   http://docs.mongodb.org/manual/reference/configuration-options/`}{`\n`}{`##`}{`\n`}{`configmap:`}{`\n`}{`#  # where and how to store data.`}{`\n`}{`#  storage:`}{`\n`}{`#    dbPath: /bitnami/mongodb/data/db`}{`\n`}{`#    journal:`}{`\n`}{`#      enabled: true`}{`\n`}{`#    directoryPerDB: false`}{`\n`}{`#  # where to write logging data.`}{`\n`}{`#  systemLog:`}{`\n`}{`#    destination: file`}{`\n`}{`#    quiet: false`}{`\n`}{`#    logAppend: true`}{`\n`}{`#    logRotate: reopen`}{`\n`}{`#    path: /opt/bitnami/mongodb/logs/mongodb.log`}{`\n`}{`#    verbosity: 0`}{`\n`}{`#  # network interfaces`}{`\n`}{`#  net:`}{`\n`}{`#    port: 27017`}{`\n`}{`#    unixDomainSocket:`}{`\n`}{`#      enabled: true`}{`\n`}{`#      pathPrefix: /opt/bitnami/mongodb/tmp`}{`\n`}{`#    ipv6: false`}{`\n`}{`#    bindIpAll: true`}{`\n`}{`#  # replica set options`}{`\n`}{`#  #replication:`}{`\n`}{`#    #replSetName: replicaset`}{`\n`}{`#    #enableMajorityReadConcern: true`}{`\n`}{`#  # process management options`}{`\n`}{`#  processManagement:`}{`\n`}{`#     fork: false`}{`\n`}{`#     pidFilePath: /opt/bitnami/mongodb/tmp/mongodb.pid`}{`\n`}{`#  # set parameter options`}{`\n`}{`#  setParameter:`}{`\n`}{`#     enableLocalhostAuthBypass: true`}{`\n`}{`#  # security options`}{`\n`}{`#  security:`}{`\n`}{`#    authorization: disabled`}{`\n`}{`#    #keyFile: /opt/bitnami/mongodb/conf/keyfile`}{`\n`}{`\n`}{`## Prometheus Exporter / Metrics`}{`\n`}{`##`}{`\n`}{`metrics:`}{`\n`}{`  enabled: true`}{`\n`}{`\n`}{`  image:`}{`\n`}{`    registry: docker.io`}{`\n`}{`    repository: bitnami/mongodb-exporter`}{`\n`}{`    tag: 0.10.0-debian-10-r27`}{`\n`}{`    pullPolicy: IfNotPresent`}{`\n`}{`    ## Optionally specify an array of imagePullSecrets.`}{`\n`}{`    ## Secrets must be manually created in the namespace.`}{`\n`}{`    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/`}{`\n`}{`    ##`}{`\n`}{`    # pullSecrets:`}{`\n`}{`    #   - myRegistryKeySecretName`}{`\n`}{`\n`}{`  ## String with extra arguments to the metrics exporter`}{`\n`}{`  ## ref: https://github.com/percona/mongodb_exporter/blob/master/mongodb_exporter.go`}{`\n`}{`  extraArgs: \"\"`}{`\n`}{`\n`}{`  ## Metrics exporter resource requests and limits`}{`\n`}{`  ## ref: http://kubernetes.io/docs/user-guide/compute-resources/`}{`\n`}{`  ##`}{`\n`}{`  # resources: {}`}{`\n`}{`\n`}{`  ## Metrics exporter liveness and readiness probes`}{`\n`}{`  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes)`}{`\n`}{`  livenessProbe:`}{`\n`}{`    enabled: true`}{`\n`}{`    initialDelaySeconds: 15`}{`\n`}{`    periodSeconds: 5`}{`\n`}{`    timeoutSeconds: 5`}{`\n`}{`    failureThreshold: 3`}{`\n`}{`    successThreshold: 1`}{`\n`}{`  readinessProbe:`}{`\n`}{`    enabled: true`}{`\n`}{`    initialDelaySeconds: 5`}{`\n`}{`    periodSeconds: 5`}{`\n`}{`    timeoutSeconds: 1`}{`\n`}{`    failureThreshold: 3`}{`\n`}{`    successThreshold: 1`}{`\n`}{`\n`}{`  ## Metrics exporter pod Annotation`}{`\n`}{`  podAnnotations:`}{`\n`}{`    prometheus.io/scrape: \"true\"`}{`\n`}{`    prometheus.io/port: \"9216\"`}{`\n`}{`\n`}{`  ## Prometheus Service Monitor`}{`\n`}{`  ## ref: https://github.com/coreos/prometheus-operator`}{`\n`}{`  ##      https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md`}{`\n`}{`  serviceMonitor:`}{`\n`}{`    ## If the operator is installed in your cluster, set to true to create a Service Monitor Entry`}{`\n`}{`    enabled: false`}{`\n`}{`\n`}{`    ## Specify a namespace if needed`}{`\n`}{`    # namespace: monitoring`}{`\n`}{`\n`}{`    ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with`}{`\n`}{`    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec`}{`\n`}{`    additionalLabels: {}`}{`\n`}{`\n`}{`    ## Specify Metric Relabellings to add to the scrape endpoint`}{`\n`}{`    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint`}{`\n`}{`    # relabellings:`}{`\n`}{`\n`}{`    alerting:`}{`\n`}{`      ## Define individual alerting rules as required`}{`\n`}{`      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#rulegroup`}{`\n`}{`      ##      https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/`}{`\n`}{`      rules: {}`}{`\n`}{`\n`}{`      ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Prometheus Rules to work with`}{`\n`}{`      ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec`}{`\n`}{`      additionalLabels: {}`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`apiVersion: apps/v1`}{`\n`}{`kind: Deployment`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`spec:`}{`\n`}{`  replicas: 1`}{`\n`}{`  selector:`}{`\n`}{`    matchLabels:`}{`\n`}{`      app: factory`}{`\n`}{`  minReadySeconds: 10`}{`\n`}{`  strategy:`}{`\n`}{`    type: RollingUpdate`}{`\n`}{`    rollingUpdate:`}{`\n`}{`      maxUnavailable: 1`}{`\n`}{`      maxSurge: 1`}{`\n`}{`  template:`}{`\n`}{`    metadata:`}{`\n`}{`      labels:`}{`\n`}{`        app: factory`}{`\n`}{`    spec:`}{`\n`}{`      containers:`}{`\n`}{`      - name: machinery`}{`\n`}{`        image: cedricvers/factory-buildx:1.0.5`}{`\n`}{`        ports:`}{`\n`}{`          - containerPort: 80`}{`\n`}{`          - containerPort: 8081`}{`\n`}{`        env:`}{`\n`}{`        - name: MACHINERY_VERSION`}{`\n`}{`          value: \"1.0.1\"`}{`\n`}{`        - name: FACTORY_ENVIRONMENT`}{`\n`}{`          value: \"kubernetes\"`}{`\n`}{`        - name: FACTORY_PWD`}{`\n`}{`          value: \"/go/src/bitbucket.com/kerberos-io/factory/api\"`}{`\n`}{`        - name: MONGODB_HOST`}{`\n`}{`          value: \"mongodb\"`}{`\n`}{`        - name: MONGODB_DATABASE_CREDENTIALS`}{`\n`}{`          value: \"admin\"`}{`\n`}{`        - name: MONGODB_USERNAME`}{`\n`}{`          value: \"root\"`}{`\n`}{`        - name: MONGODB_PASSWORD`}{`\n`}{`          value: \"9832sfascvn31\"`}{`\n`}{`        - name: MQTT_URL`}{`\n`}{`          value: \"tcp://127.0.0.1:1883\"`}{`\n`}{`        - name: MQTT_USERNAME`}{`\n`}{`          value: \"\"`}{`\n`}{`        - name: MQTT_PASSWORD`}{`\n`}{`          value: \"\"`}{`\n`}{`---`}{`\n`}{`apiVersion: v1`}{`\n`}{`kind: Service`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  labels:`}{`\n`}{`    app: factory`}{`\n`}{`spec:`}{`\n`}{`  ports:`}{`\n`}{`  - port: 80`}{`\n`}{`    targetPort: 80`}{`\n`}{`    name: frontend`}{`\n`}{`    protocol: TCP`}{`\n`}{`  - port: 8081`}{`\n`}{`    name: backend`}{`\n`}{`    targetPort: 8081`}{`\n`}{`    protocol: TCP`}{`\n`}{`  selector:`}{`\n`}{`    app: factory`}{`\n`}{`---`}{`\n`}{`apiVersion: extensions/v1beta1`}{`\n`}{`kind: Ingress`}{`\n`}{`metadata:`}{`\n`}{`  name: factory`}{`\n`}{`  annotations:`}{`\n`}{`    kubernetes.io/ingress.class: traefik`}{`\n`}{`spec:`}{`\n`}{`  rules:`}{`\n`}{`  - host: factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 80`}{`\n`}{`  - host: api.factory.domain.com`}{`\n`}{`    http:`}{`\n`}{`      paths:`}{`\n`}{`      - path: /`}{`\n`}{`        backend:`}{`\n`}{`          serviceName: factory`}{`\n`}{`          servicePort: 8081`}
\n

{`Running`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f419d0eaf9e5eadbac69ab84df48c563.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f419d0eaf9e5eadbac69ab84df48c563.json new file mode 100644 index 0000000..cbf44da --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f419d0eaf9e5eadbac69ab84df48c563.json @@ -0,0 +1 @@ +{"expireTime":9007200838824192000,"key":"gatsby-plugin-mdx-entire-payload-e123917080698cc11384e8475d0b8e68-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":12,"column":209,"offset":443},"indent":[]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":209,"offset":443},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":14,"column":1,"offset":445},"end":{"line":14,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":16,"column":3,"offset":500},"end":{"line":16,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":16,"column":1,"offset":498},"end":{"line":16,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.","position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}}],"position":{"start":{"line":18,"column":1,"offset":514},"end":{"line":19,"column":29,"offset":727},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":21,"column":1,"offset":729},"end":{"line":21,"column":41,"offset":769},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}}],"position":{"start":{"line":24,"column":1,"offset":772},"end":{"line":24,"column":17,"offset":788},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":26,"column":1,"offset":790},"end":{"line":46,"column":42,"offset":1374},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":49,"column":4,"offset":1380},"end":{"line":49,"column":8,"offset":1384},"indent":[]}}],"position":{"start":{"line":49,"column":1,"offset":1377},"end":{"line":49,"column":8,"offset":1384},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1389},"end":{"line":51,"column":8,"offset":1393},"indent":[]}}],"position":{"start":{"line":51,"column":2,"offset":1387},"end":{"line":51,"column":10,"offset":1395},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":29,"offset":1414},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called ","position":{"start":{"line":51,"column":29,"offset":1414},"end":{"line":51,"column":172,"offset":1557},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":51,"column":174,"offset":1559},"end":{"line":51,"column":180,"offset":1565},"indent":[]}}],"position":{"start":{"line":51,"column":172,"offset":1557},"end":{"line":51,"column":182,"offset":1567},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure with configuration files.","position":{"start":{"line":51,"column":182,"offset":1567},"end":{"line":51,"column":254,"offset":1639},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1386},"end":{"line":51,"column":254,"offset":1639},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1641},"end":{"line":53,"column":73,"offset":1713},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":55,"column":1,"offset":1715},"end":{"line":61,"column":24,"offset":1820},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":63,"column":5,"offset":1826},"end":{"line":63,"column":18,"offset":1839},"indent":[]}}],"position":{"start":{"line":63,"column":1,"offset":1822},"end":{"line":63,"column":18,"offset":1839},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.","position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}}],"position":{"start":{"line":65,"column":1,"offset":1841},"end":{"line":65,"column":157,"offset":1997},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":67,"column":1,"offset":1999},"end":{"line":69,"column":39,"offset":2157},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}}],"position":{"start":{"line":71,"column":1,"offset":2159},"end":{"line":71,"column":31,"offset":2189},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":73,"column":1,"offset":2191},"end":{"line":84,"column":19,"offset":2492},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":86,"column":4,"offset":2497},"end":{"line":86,"column":11,"offset":2504},"indent":[]}}],"position":{"start":{"line":86,"column":1,"offset":2494},"end":{"line":86,"column":11,"offset":2504},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":88,"column":4,"offset":2509},"end":{"line":88,"column":11,"offset":2516},"indent":[]}}],"position":{"start":{"line":88,"column":2,"offset":2507},"end":{"line":88,"column":13,"offset":2518},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":44,"offset":2549},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.","position":{"start":{"line":88,"column":44,"offset":2549},"end":{"line":88,"column":204,"offset":2709},"indent":[]}}],"position":{"start":{"line":88,"column":1,"offset":2506},"end":{"line":88,"column":204,"offset":2709},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":90,"column":1,"offset":2711},"end":{"line":90,"column":72,"offset":2782},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":92,"column":1,"offset":2784},"end":{"line":92,"column":22,"offset":2805},"indent":[]}}],"position":{"start":{"line":92,"column":1,"offset":2784},"end":{"line":92,"column":22,"offset":2805},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":94,"column":1,"offset":2807},"end":{"line":99,"column":22,"offset":2931},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":100,"column":4,"offset":2935},"end":{"line":100,"column":11,"offset":2942},"indent":[]}}],"position":{"start":{"line":100,"column":1,"offset":2932},"end":{"line":100,"column":11,"offset":2942},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":102,"column":1,"offset":2944},"end":{"line":103,"column":117,"offset":3194},"indent":[1]}}],"position":{"start":{"line":102,"column":1,"offset":2944},"end":{"line":103,"column":117,"offset":3194},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":105,"column":1,"offset":3196},"end":{"line":105,"column":78,"offset":3273},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Kerberos factory","position":{"start":{"line":107,"column":4,"offset":3278},"end":{"line":107,"column":20,"offset":3294},"indent":[]}}],"position":{"start":{"line":107,"column":1,"offset":3275},"end":{"line":107,"column":20,"offset":3294},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":109,"column":1,"offset":3296},"end":{"line":109,"column":47,"offset":3342},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":112,"column":1,"offset":3345},"end":{"line":112,"column":31,"offset":3375},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":112,"column":31,"offset":3375}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`), cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before installing some configuration needs to happen. First thing we need to do is to configure RBAC, we need to do this to query specific endpoints from the Kubernetes API. By default\nthese endpoints are blocked.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up solutions more easily. Instead of writing yaml files yourself, you use so called `}{`Charts`}{` (libraries), that you can reuse and configure with configuration files.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate helm (Tiller) into your cluster. Tiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to expose your Kubernetes deployments more easily. Kerberos uses Traefik to expose it's APIs more easily.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to have monitored. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{`Kerberos factory`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f846a15305c2134d10a4d56ed3fc27b4.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f846a15305c2134d10a4d56ed3fc27b4.json new file mode 100644 index 0000000..ad0f399 --- /dev/null +++ b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f846a15305c2134d10a4d56ed3fc27b4.json @@ -0,0 +1 @@ +{"expireTime":9007200838835892000,"key":"gatsby-plugin-mdx-entire-payload-eabf17f5a4a17f852385d6e0cfaa64a4-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"import","value":"import ReplaceVersion from \"../components/ReplaceVersion\";","position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":59,"offset":217},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Introduction","position":{"start":{"line":10,"column":3,"offset":221},"end":{"line":10,"column":15,"offset":233},"indent":[]}}],"position":{"start":{"line":10,"column":1,"offset":219},"end":{"line":10,"column":15,"offset":233},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (","position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":12,"column":88,"offset":322},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"AWS","position":{"start":{"line":12,"column":90,"offset":324},"end":{"line":12,"column":93,"offset":327},"indent":[]}}],"position":{"start":{"line":12,"column":88,"offset":322},"end":{"line":12,"column":95,"offset":329},"indent":[]}},{"type":"text","value":", ","position":{"start":{"line":12,"column":95,"offset":329},"end":{"line":12,"column":97,"offset":331},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"GCP","position":{"start":{"line":12,"column":99,"offset":333},"end":{"line":12,"column":102,"offset":336},"indent":[]}}],"position":{"start":{"line":12,"column":97,"offset":331},"end":{"line":12,"column":104,"offset":338},"indent":[]}},{"type":"text","value":" or ","position":{"start":{"line":12,"column":104,"offset":338},"end":{"line":12,"column":108,"offset":342},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Azure","position":{"start":{"line":12,"column":110,"offset":344},"end":{"line":12,"column":115,"offset":349},"indent":[]}}],"position":{"start":{"line":12,"column":108,"offset":342},"end":{"line":12,"column":117,"offset":351},"indent":[]}},{"type":"text","value":"),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.","position":{"start":{"line":12,"column":117,"offset":351},"end":{"line":13,"column":90,"offset":443},"indent":[1]}}],"position":{"start":{"line":12,"column":1,"offset":235},"end":{"line":13,"column":90,"offset":443},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"TODO write tutorial or create link to tutorial.","position":{"start":{"line":15,"column":1,"offset":445},"end":{"line":15,"column":52,"offset":496},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Installation","position":{"start":{"line":17,"column":3,"offset":500},"end":{"line":17,"column":15,"offset":512},"indent":[]}}],"position":{"start":{"line":17,"column":1,"offset":498},"end":{"line":17,"column":15,"offset":512},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.","position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}}],"position":{"start":{"line":19,"column":1,"offset":514},"end":{"line":21,"column":17,"offset":825},"indent":[1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create -f ./clusterrole.yaml","position":{"start":{"line":23,"column":1,"offset":827},"end":{"line":23,"column":41,"offset":867},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"clusterrole.yaml","position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}}],"position":{"start":{"line":26,"column":1,"offset":870},"end":{"line":26,"column":17,"offset":886},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nrules:\n- apiGroups: [\"\", \"apps\"]\n resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]\n verbs: [\"get\", \"list\", \"create\", \"delete\"]\n---\nkind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: pods-list\nsubjects:\n- kind: ServiceAccount\n name: default\n namespace: default\nroleRef:\n kind: ClusterRole\n name: pods-list\n apiGroup: rbac.authorization.k8s.io","position":{"start":{"line":28,"column":1,"offset":888},"end":{"line":48,"column":42,"offset":1472},"indent":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Helm","position":{"start":{"line":51,"column":4,"offset":1478},"end":{"line":51,"column":8,"offset":1482},"indent":[]}}],"position":{"start":{"line":51,"column":1,"offset":1475},"end":{"line":51,"column":8,"offset":1482},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://helm.sh/","children":[{"type":"strong","children":[{"type":"text","value":"Helm","position":{"start":{"line":53,"column":4,"offset":1487},"end":{"line":53,"column":8,"offset":1491},"indent":[]}}],"position":{"start":{"line":53,"column":2,"offset":1485},"end":{"line":53,"column":10,"offset":1493},"indent":[]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":53,"column":29,"offset":1512},"indent":[]}},{"type":"text","value":" is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called ","position":{"start":{"line":53,"column":29,"offset":1512},"end":{"line":54,"column":75,"offset":1717},"indent":[1]}},{"type":"strong","children":[{"type":"text","value":"Charts","position":{"start":{"line":54,"column":77,"offset":1719},"end":{"line":54,"column":83,"offset":1725},"indent":[]}}],"position":{"start":{"line":54,"column":75,"offset":1717},"end":{"line":54,"column":85,"offset":1727},"indent":[]}},{"type":"text","value":" (libraries), that you can reuse and configure the,\nwith the appropriate settings.","position":{"start":{"line":54,"column":85,"offset":1727},"end":{"line":55,"column":31,"offset":1809},"indent":[1]}}],"position":{"start":{"line":53,"column":1,"offset":1484},"end":{"line":55,"column":31,"offset":1809},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"Use one of the preferred OS package managers to install the Helm client:","position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}}],"position":{"start":{"line":57,"column":1,"offset":1811},"end":{"line":57,"column":73,"offset":1883},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"brew install helm\n\nchoco install kubernetes-helm\n\nscoop install helm\n\ngofish install helm","position":{"start":{"line":59,"column":1,"offset":1885},"end":{"line":65,"column":24,"offset":1990},"indent":[1,1,1,1,1,1]}},{"type":"heading","depth":3,"children":[{"type":"text","value":"Initiate helm","position":{"start":{"line":67,"column":5,"offset":1996},"end":{"line":67,"column":18,"offset":2009},"indent":[]}}],"position":{"start":{"line":67,"column":1,"offset":1992},"end":{"line":67,"column":18,"offset":2009},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.","position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}}],"position":{"start":{"line":69,"column":1,"offset":2011},"end":{"line":70,"column":55,"offset":2193},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl create serviceaccount tiller --namespace kube-system\nkubectl create -f ./tiller-clusterrolebinding.yaml\nhelm init --service-account tiller","position":{"start":{"line":72,"column":1,"offset":2195},"end":{"line":74,"column":39,"offset":2353},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"tiller-clusterrolebinding.yaml","position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}}],"position":{"start":{"line":76,"column":1,"offset":2355},"end":{"line":76,"column":31,"offset":2385},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"kind: ClusterRoleBinding\napiVersion: rbac.authorization.k8s.io/v1beta1\nmetadata:\n name: tiller-clusterrolebinding\nsubjects:\n- kind: ServiceAccount\n name: tiller\n namespace: kube-system\nroleRef:\n kind: ClusterRole\n name: cluster-admin\n apiGroup: \"\"","position":{"start":{"line":78,"column":1,"offset":2387},"end":{"line":89,"column":19,"offset":2688},"indent":[1,1,1,1,1,1,1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Traefik","position":{"start":{"line":91,"column":4,"offset":2693},"end":{"line":91,"column":11,"offset":2700},"indent":[]}}],"position":{"start":{"line":91,"column":1,"offset":2690},"end":{"line":91,"column":11,"offset":2700},"indent":[]}},{"type":"paragraph","children":[{"type":"link","title":null,"url":"https://containo.us/traefik/","children":[{"type":"strong","children":[{"type":"text","value":"Traefik","position":{"start":{"line":93,"column":4,"offset":2705},"end":{"line":93,"column":11,"offset":2712},"indent":[]}}],"position":{"start":{"line":93,"column":2,"offset":2703},"end":{"line":93,"column":13,"offset":2714},"indent":[]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":93,"column":44,"offset":2745},"indent":[]}},{"type":"text","value":" is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.","position":{"start":{"line":93,"column":44,"offset":2745},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}}],"position":{"start":{"line":93,"column":1,"offset":2702},"end":{"line":94,"column":115,"offset":2917},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name traefik -f ./traefik/values.yaml stable/traefik","position":{"start":{"line":96,"column":1,"offset":2919},"end":{"line":96,"column":72,"offset":2990},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./traefik/values.yaml","position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}}],"position":{"start":{"line":98,"column":1,"offset":2992},"end":{"line":98,"column":22,"offset":3013},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"dashboard:\n enabled: true\n domain: your.domain.com\n serviceType: NodePort\nrbac:\n enabled: true","position":{"start":{"line":100,"column":1,"offset":3015},"end":{"line":105,"column":22,"offset":3139},"indent":[1,1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"MongoDB","position":{"start":{"line":106,"column":4,"offset":3143},"end":{"line":106,"column":11,"offset":3150},"indent":[]}}],"position":{"start":{"line":106,"column":1,"offset":3140},"end":{"line":106,"column":11,"offset":3150},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.","position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}}],"position":{"start":{"line":108,"column":1,"offset":3152},"end":{"line":109,"column":117,"offset":3395},"indent":[1]}},{"type":"code","lang":null,"meta":null,"value":"helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml","position":{"start":{"line":111,"column":1,"offset":3397},"end":{"line":111,"column":78,"offset":3474},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":" ./mongodb/values.yaml","position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}}],"position":{"start":{"line":113,"column":1,"offset":3476},"end":{"line":113,"column":23,"offset":3498},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"...","position":{"start":{"line":115,"column":1,"offset":3500},"end":{"line":115,"column":8,"offset":3507},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Factory","position":{"start":{"line":117,"column":4,"offset":3512},"end":{"line":117,"column":11,"offset":3519},"indent":[]}}],"position":{"start":{"line":117,"column":1,"offset":3509},"end":{"line":117,"column":11,"offset":3519},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Enterprise is managed through ann application which we call the ","position":{"start":{"line":119,"column":1,"offset":3521},"end":{"line":119,"column":74,"offset":3594},"indent":[]}},{"type":"strong","children":[{"type":"text","value":"Factory","position":{"start":{"line":119,"column":76,"offset":3596},"end":{"line":119,"column":83,"offset":3603},"indent":[]}}],"position":{"start":{"line":119,"column":74,"offset":3594},"end":{"line":119,"column":85,"offset":3605},"indent":[]}},{"type":"text","value":". The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.","position":{"start":{"line":119,"column":85,"offset":3605},"end":{"line":122,"column":76,"offset":3986},"indent":[1,1,1]}}],"position":{"start":{"line":119,"column":1,"offset":3521},"end":{"line":122,"column":76,"offset":3986},"indent":[1,1,1]}},{"type":"code","lang":null,"meta":null,"value":"kubectl apply -f ./factory/kubernetes.yaml","position":{"start":{"line":124,"column":1,"offset":3988},"end":{"line":124,"column":47,"offset":4034},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"./factory/kubernetes.yaml","position":{"start":{"line":126,"column":1,"offset":4036},"end":{"line":126,"column":26,"offset":4061},"indent":[]}}],"position":{"start":{"line":126,"column":1,"offset":4036},"end":{"line":126,"column":26,"offset":4061},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"... link to yaml ...","position":{"start":{"line":128,"column":1,"offset":4063},"end":{"line":128,"column":25,"offset":4087},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Test out configuration","position":{"start":{"line":130,"column":3,"offset":4091},"end":{"line":130,"column":25,"offset":4113},"indent":[]}}],"position":{"start":{"line":130,"column":1,"offset":4089},"end":{"line":130,"column":25,"offset":4113},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"If everything worked out as expected, you should now have following services in your cluster:","position":{"start":{"line":132,"column":1,"offset":4115},"end":{"line":132,"column":94,"offset":4208},"indent":[]}}],"position":{"start":{"line":132,"column":1,"offset":4115},"end":{"line":132,"column":94,"offset":4208},"indent":[]}},{"type":"list","ordered":false,"start":null,"spread":false,"children":[{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"MongoDB","position":{"start":{"line":134,"column":5,"offset":4214},"end":{"line":134,"column":12,"offset":4221},"indent":[]}}],"position":{"start":{"line":134,"column":5,"offset":4214},"end":{"line":134,"column":12,"offset":4221},"indent":[]}}],"position":{"start":{"line":134,"column":1,"offset":4210},"end":{"line":134,"column":12,"offset":4221},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Traefik","position":{"start":{"line":135,"column":5,"offset":4226},"end":{"line":135,"column":12,"offset":4233},"indent":[]}}],"position":{"start":{"line":135,"column":5,"offset":4226},"end":{"line":135,"column":12,"offset":4233},"indent":[]}}],"position":{"start":{"line":135,"column":1,"offset":4222},"end":{"line":135,"column":12,"offset":4233},"indent":[]}},{"type":"listItem","spread":false,"checked":null,"children":[{"type":"paragraph","children":[{"type":"text","value":"Factory","position":{"start":{"line":136,"column":5,"offset":4238},"end":{"line":136,"column":12,"offset":4245},"indent":[]}}],"position":{"start":{"line":136,"column":5,"offset":4238},"end":{"line":136,"column":12,"offset":4245},"indent":[]}}],"position":{"start":{"line":136,"column":1,"offset":4234},"end":{"line":136,"column":12,"offset":4245},"indent":[]}}],"position":{"start":{"line":134,"column":1,"offset":4210},"end":{"line":136,"column":12,"offset":4245},"indent":[1,1]}},{"type":"paragraph","children":[{"type":"text","value":"It should look like this.","position":{"start":{"line":138,"column":1,"offset":4247},"end":{"line":138,"column":26,"offset":4272},"indent":[]}}],"position":{"start":{"line":138,"column":1,"offset":4247},"end":{"line":138,"column":26,"offset":4272},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get pods\nNAME READY STATUS RESTARTS AGE\nfactory-6f5c877d7c-hf77p 1/1 Running 0 2d11h\nmongodb-55566dc65c-xgmns 2/2 Running 0 4d13h\ntraefik-7d566ccc47-mwslb 1/1 Running 0 4d12h","position":{"start":{"line":140,"column":1,"offset":4274},"end":{"line":144,"column":73,"offset":4586},"indent":[1,1,1,1]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"DNS configuration","position":{"start":{"line":146,"column":4,"offset":4591},"end":{"line":146,"column":21,"offset":4608},"indent":[]}}],"position":{"start":{"line":146,"column":1,"offset":4588},"end":{"line":146,"column":21,"offset":4608},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS.","position":{"start":{"line":148,"column":1,"offset":4610},"end":{"line":148,"column":108,"offset":4717},"indent":[]}}],"position":{"start":{"line":148,"column":1,"offset":4610},"end":{"line":148,"column":108,"offset":4717},"indent":[]}},{"type":"code","lang":null,"meta":null,"value":"$ kubectl get svc\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nfactory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h\nkubernetes ClusterIP 10.0.0.1 443/TCP 4d15h\nmachinery-mall-svc NodePort 10.0.11.252 8080:32220/TCP 4d2h\nmongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h\ntraefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h\ntraefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h","position":{"start":{"line":150,"column":1,"offset":4719},"end":{"line":157,"column":105,"offset":5472},"indent":[1,1,1,1,1,1,1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":160,"column":1,"offset":5475},"end":{"line":160,"column":31,"offset":5505},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":160,"column":31,"offset":5505}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nimport ReplaceVersion from \"../components/ReplaceVersion\";\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n\n

{`Introduction`}

\n

{`Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (`}{`AWS`}{`, `}{`GCP`}{` or `}{`Azure`}{`),\ncloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network.`}

\n
{`TODO write tutorial or create link to tutorial.`}
\n

{`Installation`}

\n

{`Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control),\nwe need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need\nto unblock them.`}

\n
{`kubectl create -f ./clusterrole.yaml`}
\n

{`clusterrole.yaml`}

\n
{`kind: ClusterRole`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`rules:`}{`\n`}{`- apiGroups: [\"\", \"apps\"]`}{`\n`}{`  resources: [\"pods\", \"pods/log\", \"deployments\", \"services\", \"endpoints\", \"nodes\"]`}{`\n`}{`  verbs: [\"get\", \"list\", \"create\", \"delete\"]`}{`\n`}{`---`}{`\n`}{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1`}{`\n`}{`metadata:`}{`\n`}{`  name: pods-list`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: default`}{`\n`}{`  namespace: default`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: pods-list`}{`\n`}{`  apiGroup: rbac.authorization.k8s.io`}
\n

{`Helm`}

\n

{`Helm`}{` is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc).\nInstead of writing yaml files for every service we need, we use so called `}{`Charts`}{` (libraries), that you can reuse and configure the,\nwith the appropriate settings.`}

\n

{`Use one of the preferred OS package managers to install the Helm client:`}

\n
{`brew install helm`}{`\n`}{`\n`}{`choco install kubernetes-helm`}{`\n`}{`\n`}{`scoop install helm`}{`\n`}{`\n`}{`gofish install helm`}
\n

{`Initiate helm`}

\n

{`When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster.\nTiller is what they call the server component of Helm.`}

\n
{`kubectl create serviceaccount tiller --namespace kube-system`}{`\n`}{`kubectl create -f ./tiller-clusterrolebinding.yaml`}{`\n`}{`helm init --service-account tiller`}
\n

{`tiller-clusterrolebinding.yaml`}

\n
{`kind: ClusterRoleBinding`}{`\n`}{`apiVersion: rbac.authorization.k8s.io/v1beta1`}{`\n`}{`metadata:`}{`\n`}{`  name: tiller-clusterrolebinding`}{`\n`}{`subjects:`}{`\n`}{`- kind: ServiceAccount`}{`\n`}{`  name: tiller`}{`\n`}{`  namespace: kube-system`}{`\n`}{`roleRef:`}{`\n`}{`  kind: ClusterRole`}{`\n`}{`  name: cluster-admin`}{`\n`}{`  apiGroup: \"\"`}
\n

{`Traefik`}

\n

{`Traefik`}{` is a reverse proxy and load balancer which allows you to\nexpose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow.`}

\n
{`helm install --name traefik -f ./traefik/values.yaml stable/traefik`}
\n

{`./traefik/values.yaml`}

\n
{`dashboard:`}{`\n`}{`  enabled: true`}{`\n`}{`  domain: your.domain.com`}{`\n`}{`  serviceType: NodePort`}{`\n`}{`rbac:`}{`\n`}{`    enabled: true`}
\n

{`MongoDB`}

\n

{`Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files\nare stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster.`}

\n
{`helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml`}
\n

{` ./mongodb/values.yaml`}

\n
{`...`}
\n

{`Factory`}

\n

{`Kerberos Enterprise is managed through ann application which we call the `}{`Factory`}{`. The Factory is responsible for initiating\nthe deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery.\nThe Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory\nis the central portal for managing Kerberos Enterprise inside your cluster.`}

\n
{`kubectl apply -f ./factory/kubernetes.yaml`}
\n

{`./factory/kubernetes.yaml`}

\n
{`... link to yaml ...`}
\n

{`Test out configuration`}

\n

{`If everything worked out as expected, you should now have following services in your cluster:`}

\n
    \n
  • {`MongoDB`}
  • \n
  • {`Traefik`}
  • \n
  • {`Factory`}
  • \n
\n

{`It should look like this.`}

\n
{`$ kubectl get pods`}{`\n`}{`NAME                              READY   STATUS    RESTARTS   AGE`}{`\n`}{`factory-6f5c877d7c-hf77p          1/1     Running   0          2d11h`}{`\n`}{`mongodb-55566dc65c-xgmns          2/2     Running   0          4d13h`}{`\n`}{`traefik-7d566ccc47-mwslb          1/1     Running   0          4d12h`}
\n

{`DNS configuration`}

\n

{`When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure DNS.`}

\n
{`$ kubectl get svc`}{`\n`}{`NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE`}{`\n`}{`factory              ClusterIP      10.0.10.175             80/TCP,8081/TCP              4d13h`}{`\n`}{`kubernetes           ClusterIP      10.0.0.1                443/TCP                      4d15h`}{`\n`}{`machinery-mall-svc   NodePort       10.0.11.252             8080:32220/TCP               4d2h`}{`\n`}{`mongodb              ClusterIP      10.0.1.0                27017/TCP,9216/TCP           4d14h`}{`\n`}{`traefik              LoadBalancer   10.0.10.97    34.66.138.141   443:31683/TCP,80:32053/TCP   4d14h`}{`\n`}{`traefik-dashboard    NodePort       10.0.14.209             80:32044/TCP                 4d14h`}
\n\n \n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f874626292f8147d044d10c42e8fb31f.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f874626292f8147d044d10c42e8fb31f.json deleted file mode 100644 index 8b4ab97..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f874626292f8147d044d10c42e8fb31f.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838523959000,"key":"gatsby-plugin-mdx-entire-payload-9ddd721c9131b3c3ea682b3fad72b82c-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limiations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":77,"offset":407},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":77,"offset":407},"indent":[1]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":14,"column":1,"offset":410},"end":{"line":14,"column":31,"offset":440},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":14,"column":31,"offset":440}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limiations, and so has the Open Source version of Kerberos.`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f8d7763d7b4ed12169917268a01a4f88.json b/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f8d7763d7b4ed12169917268a01a4f88.json deleted file mode 100644 index ffe2e4d..0000000 --- a/.docz/.cache/caches/gatsby-plugin-mdx/diskstore-f8d7763d7b4ed12169917268a01a4f88.json +++ /dev/null @@ -1 +0,0 @@ -{"expireTime":9007200838681888000,"key":"gatsby-plugin-mdx-entire-payload-204a3792d937c9317df0485c07228b90-","val":{"mdast":{"type":"root","children":[{"type":"import","value":"import DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"","position":{"start":{"line":3,"column":1,"offset":2},"end":{"line":3,"column":125,"offset":126},"indent":[]}},{"type":"export","default":true,"value":"export default DefaultLayout","position":{"start":{"line":5,"column":1,"offset":128},"end":{"line":5,"column":29,"offset":156},"indent":[]}},{"type":"heading","depth":1,"children":[{"type":"text","value":"Enterprise","position":{"start":{"line":8,"column":3,"offset":161},"end":{"line":8,"column":13,"offset":171},"indent":[]}}],"position":{"start":{"line":8,"column":1,"offset":159},"end":{"line":8,"column":13,"offset":171},"indent":[]}},{"type":"paragraph","children":[{"type":"text","value":"Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.","position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}}],"position":{"start":{"line":10,"column":1,"offset":173},"end":{"line":11,"column":78,"offset":408},"indent":[1]}},{"type":"paragraph","children":[{"type":"text","value":"Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.","position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}}],"position":{"start":{"line":13,"column":1,"offset":410},"end":{"line":14,"column":239,"offset":837},"indent":[1]}},{"type":"jsx","value":"
","position":{"start":{"line":16,"column":1,"offset":839},"end":{"line":16,"column":186,"offset":1024},"indent":[]}},{"type":"heading","depth":2,"children":[{"type":"text","value":"Orchestration","position":{"start":{"line":18,"column":4,"offset":1029},"end":{"line":18,"column":17,"offset":1042},"indent":[]}}],"position":{"start":{"line":18,"column":1,"offset":1026},"end":{"line":18,"column":17,"offset":1042},"indent":[]}},{"type":"export","value":"export const _frontmatter = {}","position":{"start":{"line":21,"column":1,"offset":1045},"end":{"line":21,"column":31,"offset":1075},"indent":[]}}],"position":{"start":{"line":1,"column":1,"offset":0},"end":{"line":21,"column":31,"offset":1075}}},"scopeImports":[],"scopeIdentifiers":[],"rawMDXOutput":"/* @jsx mdx */\nimport { mdx } from '@mdx-js/react';\n/* @jsx mdx */\nimport DefaultLayout from \"/Users/i353408/Vagrant/www/repos/documentation/node_modules/gatsby-theme-docz/src/base/Layout.js\"\nexport const _frontmatter = {};\nconst makeShortcode = name => function MDXDefaultShortcode(props) {\n console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\")\n return
\n};\n\nconst layoutProps = {\n _frontmatter\n};\nconst MDXLayout = DefaultLayout\nexport default function MDXContent({\n components,\n ...props\n}) {\n return \n\n\n

{`Enterprise`}

\n

{`Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every\nsolution has its limitations, and so has the Open Source version of Kerberos.`}

\n

{`Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships\nas a docker image, it has no high availability or fail-over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for managing a large scale of surveillance cameras, and makes sure they keep running.`}

\n
\n

{`Orchestration`}

\n\n
;\n}\n\n;\nMDXContent.isMDXComponent = true;"}} \ No newline at end of file diff --git a/.docz/.cache/redux.state b/.docz/.cache/redux.state index 9ec43bd9554efccd991cc12beccf674fa3493a67..eeea2c7ac53ac5b16739e2e1ba24ae936d3eebc2 100644 GIT binary patch delta 23947 zcmeHvd3YSfooLr+)NPL}`I6-e+vTy4C0R4>p6==CQNXr*fdjT>O9W)D^ii#8Jn9}# zw=BdpcCud%mgEb}LM4#hn7sEw9=qW(%LG1R>@1sX2qBQo1=%Gy8#W6s2Ulzs5_n%# zch6zV4`*Ng+E4w@bXWcAS5?2eepNO1{^jxmudI6D@krzifLAW%;)h>~d}M29TGEio z3sOQ=%v2&RD?&okGD3n+%bAQMNEs!|m-lSD`s@H-d|}DqliOBAE^^{gTOC93*cRJE z#X`|?Q9L?^>~Xbe8xx^Mh<_`GMmEp z-slLDQ*&Y6SHyfh6@UFpX^~BwmR^PvNPYuNn zzP13Y$OxvSnQ}U#X?!-TNrsV4@hF=y6fG+mS{dBDy!=_N^{{aN*8ntmNl6(Q*^n~4 zl95zRH$+1cWL{4zNX+tdhD#oNJrWF~{OTj`E*6LROn*AlFAB-Dl-d)ISVlZLWO)d` zwv+3`v+rT&E$4YnkmPJi;&n|^m8_x*X+`EU*;Gc)3gz8jFPD!z-g|iVqt7=%#Z-)J zn$O5c%nBNhM9s{YLdM9*SwT|uY*~GIMS1l%7M52X8!6*&+|pJ*fK;k199dK?lK3Pq zW$-=&ESM`Mght3an!%Ft=N@Y<|IZ`O_5SLuzfzN}6C2~)m}iZl?e30y7ah3TFVP!H z%3pe-cQC}{cd#ekOk2elrT7$|;7{vnPrR8TIU_)M@EtOiS>^RduOy^^l40n`P|TDl zr%V;8f|}7YX(6krhGwd!LaESvY&qCae(veZ$~PSQWEmb|Tjc(f*q;`Y*>tun99i0u z?H84PDU}ozfl>i~Zxfiw`XKnD^T49=>>se@8@~C%nzw%>9e!|DJprD-=8n&Ng_eW_ z2ujKa|DlVJQy3QN@n5+GES?eej&Irm7Ka@P?O;)P&XZ%5$@e^Ytckwd_D>J_FZR>V zG~uUTXIsmc|8V)?(Pw`}i(x7)iL#`KO4>-7vVgJzpHT#X*AybmDVdU>^2685ANs{= zeB&m-wWWrIRDW9N=apnu;;AGw6s4+?&``|deHViE@@HObDew64SIhVPTW=ZuWYL=U zfBDk4e%(Nk$UlZ9Aw`0cvi_5)4v1sgf3bAMeC?ET7d-=7WIFw$W{%K3J zX@Kc0@A_f);V1s(*FN!n^wP$tPrUCwzU=V8%P2~LpMB+O|7GO2k!ZPa;$(T`&5^@L zPd*mG4@JPq^61Hta_L|BN-7Gz8aaI3J1|n;@ut%LAG71JLJ@i1XXb>(6f!9bxNsp@fUlYfR+g`NN-nql z{`NKZeBov8w+&oT7CwE;ZyMw@C@FvM_wh>ueQfM)YR&{BOv(b$=u;JzVh9J8DIfc8 z@8LV&0|5W;CNOgNt@n>a@U6Fl&U+5F1AtF(V5B_wyoB$+i=9`29pK(b3&7*c!3cKJK*AdyVB7GsbHHr;tv=9JxqB}7Mg%v- z!K%u;E5TT_@@6mS1NgSpV5D+wADGvK%Uz(ea!VIr0bbDuM({Js!3O*{uYs0|+zq}F zsocC4OhhX;E1(PDjx-pl%iGq6KN%7Ce*B=Crm+1DJc!9nwoW} zALu+A(D)2JXXT9|vIjuCQ`S;~%F9N=&=fwARx~Z43KB}BkSV44jG<*Cnt;DQ0J@>9 z${NxXA)_cMl+|Qa*Nu!U$%?ECf~*=uSeN6YaWEHO!GpH)Q$LL1$OtzN|9lRJMV^_D zZ{@))_=?$FD{da)e5$praEtm{6ow2KjBxYumJZO-{@4|b@|{j*Q&hfv&m!>slH8wG zl48{d)fFjK%Olno6CczbC_|m)!Z)u6o6Gqhwcwx310Tkp-3%^?zH!Hk>+r5iL3`e7{(y%17OVyGV%_@4iz=0ikGO%CGDk*93M)iZ8LOp83K9|gJ3jL@-P!bHj zGsVOze-ObE0B#_ZzpUbMn0vIN{vscVLsc>r}`x!$@7`eLx}w; zzF){DGa27Q_;#oclG-8SAn=hbfWy(v;AGG2V?)J8LuCCw;OzoR$?smZPeyOFru)B&%s&6itNmEN`YY(=@eo zHl@jup=HxbjdjhPTdh1QAN%2aeARNW5dUf`*aNoVUDtB!aN7#7WZ{wqRYYs^en^ft zbbzJcEquia&_n!w>kN?upFGvOr9lWJC3!)vg*;UdqHr__;)wG}iYff*^n;K&aX1n& zz%BT$RbXky(o-1j!{c=wU>Sbp0#J?e_zck`NlNl5CDh?me>&BlN+o5!W@}RokX6>t z2*|0_?Ch(ZV54tm-#+=&Iy|=*w3l4&Uw_&d|7lNr|HbDU6uer}!0l(6{x;BRNffe5Dw8q{P1j|j zh6uw!um`_%5%@y+j^}*pw)%ET>`y64SuU$@cT{7wlt|2`%x9~Q3+F0r3O%*{V$8k&wPi&%eRA> zm3MZK@Z}T3U{B?`LGVfhgY&_A_|g%u2hZ#W5`Jbqh~aOn1F_1Xb>O~8z6@3V-0{Ew+U{B?xVKCHGd0qwQ z0`NJ!auAGEF4MuDrV4u{=mg+4T148HKl;0s<@K*NS6;Y^pm@jxT>$)*-y)R*S2y9u z+d*e#`|V)&60E!e&a3?Fe!zBt&*MY)gAY}f{TMvbQn__6_*px+lNRCFyKEai^d)v? z<%t8}n)b>+9|wrT-`N&95C8o#?wrc!UIAA?{IN%x&Z~6CB6qLHmx|Hz@aMDKy2_>x zN7TFUU*PC@m6u+QeEC@%%{8A_Ir2!;jhAEhb#|nD-m|Uv`PbPGMGkae`(5_-sFNS} z@O^KvmoM0i+=AsH=;aVJRo#PLPWAAC7eU7|%Z09|YIy`z+khrgz40P~MN7~1L4;#( zva2NI7LabK`TQibOgQO`L)99Co&#N7%_C@e$yjVSr+QFBmOTnx)iU}ha{Tx+patLb zCcAE);UL#u?FCIHP(F{p`zG6q-+u-ys%-xwds&oo5iB@{i+8-uE-NL*kf-M1n5yS2 z8@WBnSZs%5AQxJ;YZ-`)q6qc;xa*-J)Kwdrs+EUM5$Z+N&Go^H#x+#5k%wG3VdV*; zy$HHwYJ>(Cp`wP0j!Qd)#c|sv19$9zKvsSyGN4WSqpdXr4OGZGlgJ?R&LK7L>y~zPaFa>O1fivmOYMK=puD2k6brDnT*9YPQskJpEMx@ zEI1RWND!+=I1tZim~$bgPXCcht9c^vyb zXx){Bms(!Vr$voYp5x@*D&Alg4ZTt!8ATqn?4U0Ld8(Cn@xHg&6?ph&Fc<$3aIJVY z;1-|X2eok`Yp95zT13!xJeaq}ERSaHTsT2%yqx7$S!q?-fpjFYv;wy#!oTbtIsY2BOFz5k-_wNT4fv~+GU)eDyEDg7)7=5{X2N>{0Z?-9coG``%#BEroG%i~z(| zg|)=iAvYFVwQ3aC_;?aW}O8bw>FDC$HM0 zaA@;I$yhHObX?ccti0t-Quk0YjKDRGA=`7IV!NH33KGSPD5YvP z_Fmt{9(kl`4*t|EZhlL9UE=3Ak2I}W5TEAJpPNTi2d{c9Soh5cMZL0XI4W)ef9FTJ zM{%@m)6NgdI*_D8prB_1TE6?Gh3Ci5GXFtk%2x9Z5f|G-w#Vp?=5}mU zn&x4no$bJP@LXHvi~Ax!cY75jYl@~R@LF0{Gnz_P<2tV>Swl-_B&{ZS_xY0d(#w(A zzU0lXlf1TnkMuTuP;dX>;_LS`%?t7+twCxeIc8jY{Y-rMPS91kdS3Kx2p;fzdi%@l zg34FL=z|dNUIRKSZ@dtl_ZjezPwfr4X8kiw`b%$B?)iQ5D*)fNlAVX|n9nZ3kDX|q zg9lGEFULPv$}YjXPd2wVUCG>7x#wi_@fG+S0&-0^8^=4MY$yI=7u!vmZ6#&x7_MgL ztWPsKV=_D=G9sff0wXXw!!w9UF)2o66vkjw#$ZH-XEKb+n2f}jjKWB?PGmIv;3D?i zx_;&?W^cf43;b>`#wL0DF=X5E16?eOf8EXY;o%d_OYnvdvu$`o54!~0^Vtsk>!oZ5 z{@hZwkCbiYatvbf%osjClU>t%A^E`S4eU|^5nW(09%C^o<1vUyFjdgY*fk5cF*Z|Q z4gG4`xYc8djLIO!WGrScMcq2wP;~IU=EW^zjKkQ>DB~~&KHkGF#LvFh+|jzdTDqCp zNC9V>jLPVY$2j=d5_WCVRz}6@73`|HWLPfaF$up=RPc|*ZeLZY%>u^v9Ngdw# zv!)gJ)urqr&R}fDt%Gc*y*6)Vb}&PD*Uy@kQ7}9>k7Z{Q>@JgFJUX`oK3-;567WTM zYl3ZWahXZlJz~c2+^EkRUj^_LB0EUfzmaIfZ2Z2+&R#DwS;}aUK@88BjKFAA03=3X zvW&{48H33(3ZpS5qcI8fBqBQo1w`MWfGlp|u( zf&WlomlN@Xc&o#9`s2ILVc~j%Ni%6iW+Xa*EF&`pqtgKrE)to{Fg%q`i9w7?B~}PH ztTE}jq0ufv$)r7A=#S+-hwZ=*-^zC5*LJZ{{5Sj9BHnQ`JIsZwRb6&%>(-FdOp%$y zb4B+2%Atkq^B?P%^^BC_(?~S5R4OBAyet@MHY+JgT9(9=5s!M41r%pDJNk8->x|1+ zX5oP^v0att?__(TP>_+P%91Gyl7JK=ohJM1DJdnJf+m?r!|U&1mqi|)TN(HgySnKt z!5^7Ry6CAq`(<|L*>>^upv@=mVKb4l?B_AR&C0ZH@}j5-g3hBvQi5c!O1N~R*I zil{mGQ5;=LOlf>u?HC8$f`T8^Ha^3&@~EJCx%gCjKQBJS#=s7emEPd*5@ipwZCR43 zOjLJ?P{OJ^JrbXhLn?`5+<}-AkGlEs(fBMYIBtRu9%dKCYDZ7-`+v)>z@ItHt}NwH zek|T>pn{j%7L7OWSM%d29=#Cd$F6S*@w8gDzg{67=G>vcFkD|?&DN&dto-EiikG_P3I*gtEP>tqM4eKQPap& zMdaXHd${G1_APkVOtyVybI}?15TkeDqx0EC)Q+wr$7!Ja0eI?UxN*}2|Gb-96mF{g z;8Au-TStTB;&&fqAFe#`7<+N^S z<_(SX(_AI&iEx!%^`>(UBG4A1by!NN;jLQ5+*;mdM#Xkkz8b{gK!n5r5si4h| zf5Pr)J?P}`9kU^*El&KA@nvb{5%rf6$Cc|ns4 zk-tvjKMqHi;lF&Bh1mFfbnu*-&xyr`JhkYNHGSZ>@bS0V6)hz3OS00Ajqtv^!O{}! z?(H48bf~wt5BBz6uxYTjmm~msdk3x?FQVSwp1v4OhQdP8*>4%B=)&&J)~H32>^pU& z+I?_{Wb-G~$v%=V?IEpe309Ixpec7}!meglZRAZj#l6W`48mauhj(t?2`7qlpJAM& zzttcik4P#uZ`pfkemba1l4ME!LC#ogBQl*Lf-dqrk_QVa@ETH0;<+_$*yRdt=lSgo)>LLRM zer1zWBGEv;r!O{v{9L-{K!fDjE!zLSagsst^CFfGk!=(li)3QVqBC}Cf_-3cTM}+0 z2^Uix&(qYni|X2tBsty6Mh2NRBwdyeGGd+s$8B0eP>xZOL%4TbL%NrTx=-SS36pDs zJ&~f5N6ATbEFX)-PA`I_v1J?maFf4Ep{XwN>7wF(OGos*N_kR2_in0q_oJdl zagHL7)RM80U!QK|%|LnNp`ZcDU-5ul6|z*QB;JcQ>@E&_Cd=d@o>T4 zh9U}E@@)YOc@4*ikwB_zGRk(fE@G#Vh&R$gPgDND#si|axh}g7b zj2IlG()}=EsR(MKB#qi}jqNJJoVx zPW(Mnx?=G`+>-7%g(^&~?Wki~Ztj!{lJ0I;*TiC%<`DHAtM?NxLRWlb7d40Khe_#6 zcPfdcbIGPMc_S;R5+x0tQn#9~(Vt)#w(@yY47t@q@SnOloQwrP7TIr9sm-0FJfs+i zRFNHIXRP4Z$o5FOoAgz)u%&tv8wjE5DbsM9^!ZvD;Ye1Mv9$pK9j+R2xCkM3 zOJy-Q8xmH3?^R~+}F3kX%i8B;C0pGK2O|0Ah8 zzOKMfzlJ9Zs2`F8AA?RY2qQFA4-vytP!sT`H&mksON48h=&%4;fr}(*)sxwK#VRCSR2CIQv zpyr7hENbBD8c~yH>(ut0ZkwnS63&!D+Zb{t$n1m+2tN}EpF1!a7M;R~GnGRKlSvYE z*X==8kHKuQ@f9c7nI+2&{4z1nMQ4082UXi{*rS}tS$d94o47%0LVJ6I3{r0|rA)ZT zNzZa1x8T^WMa~xyPamYjNDM{ncfI^uw!8H-0uf5Pr@#evd;-C$JAmD;HD={idSu4K z$DRcpr5-xC>LzD0Hk_*sjkXMyLeyDT{jq-rhIpZZL3}b@^@La~KUsS%VSc(2$7ieGi^s7nG*-WmH~5mqNCV zCw^u4+zzRiPfj)ro1$Jq<>)?N}UStJ}HW9_U? zoE$(Rs{&fQV_^FhQeFR)>OUady=7qY2!wEGcwqRFAyT({%h2$^?qTviaKRReCm>-$ zHq*M2$ru?ukux)yLJgI$R-hldgY#k#^0ms8AqY8&Xw0!oBq^Inr_-`*=yF<5Tst~u zyLG^8Q)k8`8G`6z3Jh{0W29wS*L5kA7@KhOS`E<|h7`7h@G)Njy3Y-%Z#&a;3|QX{MutYje3XVr$p5vOgv#9}*1 zq=WY3r*4hT>Iow+5>YwDB3VaKb5c9FOBTk4?c%l{MHiJ^8zYp zG^KW?Vd^TE^k z;OTrY$(~H-gQxSs;i7pu9~>;Yrt`sP%==E~gQxSsup?S@Nm-)|tsEv|ed z%Ka}k^2U7n&#IN5FW@#bN8Sp)RpWel3H2;iu?dFzb|J>JazJCwfv7$zS z;L=LteH^@Pi0dI^n1!EcQYF@)2$#thw`SRLMZZkCa6fdR? zQ4muolMy78L1{rU(xRBk$Qm#CtbM0u;#%<0L9P|gS-{0AH_hSBZ;t$7er4rS?mwfE z_X4xH4ss?NIneH#OiSP%U?U%+Un}vqySRn53*I=gn(Om#es5gOEyCX1P0)^oTepo>_;rFecfw})7w`3+aRZ|UY1Xa6jhy4ve*eg_<`zdm-JfBmrW z(ichujeNH1Z5J~ZqcezJ6Gn{xFWGuCDJ2LF4yFxK|fPKI?NX(*G82 z^SCaU7E{@@sp={6mpf`olT1N2M4eBiHAOK^qcZGqe`vz(*KrTy!E3qWp-oW_aNXfM z{a?@*4sfxV)ytmvHwU;?_`nT;__DtE;v*9rtO<2*gHShe3k7M}C^rTdYMgph?mlBNkEB&759C7==(#TkJBQrMC0Z4D8UFi9X2iOOQR zl#0MZkGKuN0vrSdV{w5=5F9`$1q20A7z9U07QqA&6r3>C=_Zh=nX3GrU;Ul$+_T<$ zPIoUj+i(3dnVXs@>MOu;4NTw0uc=9QXIq9O>b$NL@B%LvNVd%u7^1EfSV4`mSe@56 zTX#zDoz}I3na9%`uil$Q#rmR0R@B&4bE?X!?MD5+lL=Xt$f~k#YPxBgmTF0?!HS|P z+OnVqEx~X$C1*6wpR%wUJl?oq`AMqrcv;YO6MN^BcHqFgnhw07esl*uw&?B-{I91b zc3|%LF=3qRzUl7CS4uk6TN);H;2+lAa*_CUGGvKCLDG0rQaC{u6q`3yQ5OVW=X6ao z48>`9G1FP%iEEtm&PMR^s%i6zAPBlD8J5XQnk?wHY3c^AiGn0Ko0I!A1~#`+ku;ov z%~ek(Yx(Tb4t&VaS3lh`gj} zW>95i({`3^b@2LR$ZH(4?Ms)}v=p5WT9Tpa5-;n5sdKzw2$F8-Mv#+5r}d*OC)k|o z7`p<_(dK94Z%={coW#S)`2Hwx$8_YSi1_I!=zWV|Ij3pIFL`5n@7cRLwsx4$Q(jY6 zZjY`WvuWAR2xE3)oRjb8b&8{i*g6uD@;k>a^+mPY`Oq-2P z2DjtC;-*Evz~P}RNJ-!ec=djcFA{|!QSoyUE-QyL=dtY`w_3!DegUWVfHbFNdz|yZ z2cPBh-AA&`%dM1prf;!KOyco0$QQ?BTV2QHI z^Sa6E94DBT)AEtmx$=3db6|g-v;Sm_Th#n2FFA>a{{SK$lA&jab(S1`({W$ObEbch zmfvb_T$0tP(58gls|KC9z0kY1jXn4A<$2B}4robu&FPOZgo0?`@nrvcmCZyq#IndwPewk;i4(&^snfD1Mpe+uMb4 z@zB?a|5?TcfEV)nteLoW|K(6?ZjM9U<~T$c)G6@&k5EeT)OJKdNt5^{-^C!Vu3{7o0q6a{vyJ_Kd6Obf z$3P#zp$r5_TPz%+NJ&o^1h^&^0^~?CB)iDG3@8M=k`OwP34L66u@3sJ8|neT`eX<= zOTQFx+Fnl&@-+kNDLnKxWRpwXfd=fE4uN%J6TwB!r9mFxnoJ0g@^t9tBE5XDj3&kT zA^PY52w-_S48_6%h$RUH&_rQDOH?*FkOK_htU(YUg}KnfMLsEnS{fJM0oho82ee|D z1OaTz1kt(C(u2g_1xF|{T!b8eheI>|0B#6?h&#_RNu-+$n<>2i0ceBzb{*LefGZT9 zE`|VA40z`-$f2@-hYcPWkfjNdu1f}|D6A$LhGMduCGetYX`;zVR_IX`;_+cnKz*JP z4)n1?kHW!m&>go92R7;3zMbBdhxcTUc#+9Pd}zb?MOL`EWxFw9hEqc; zHZvlzLdQ7bvJucW&~BJgzqZq+o%!D62y^pkwKKSNB;K5-9}lJu!?hYKsm!eVbw=0uLOS=Lq+DQL^8t{J+dnxeql zwyFg~eal3)1nz-FxN8ao@K6b?Oxi+qYE~2{NlxP4bUauJ?rx$K8ajn#vA7CSv7|S| zx&)35jbMM=S_&B?emo>W{@SmYS?^xCecV3Z;aj+}<@Vk5#V75%3GbT#Iar9D+ANt6}f&VdzSp>8{D zi6I~U2(|~WJ1~UIyb6Ev!b{|IDs|#6cr|?L*Gbf$UxC-d&fiv}y5p!v+&$6%C=*BM z%T(2;cq)||g6oUu1l+li$s<4Pb`5`!tlJpXr!TAy`?zr+YOj|Z9YW_1$CrMhhLAfJ z(DB2`o*$#+=WyO`*AUG8)ian>J>t%Nj{cpwb{}~y+H)4LE!WeBq{MknWZ|lno-|T2 z%=6`zZ$STXTx}or##c?*TvI1udCXVwm8Pu~Wq;;QXfUAqg zm!yP33?vKod&YJ(#L|e3a@eC#U5v9lVzcWT&$h0{SrM`M=6g?dSL3`Gv1vZ%$#-`# zx0k{;SkmelfTxx*spR=qPd85&tzQmXZ~4^|o!Ui{S0hPQB`{;+x@hxy#3nbB>DJX| ztcuvI^fFCdeGseLZE{IdHuDHYoe2MNB9jL&(LgPZ#^Uu%8d;FbJOtFqu&(`U1t)lE z$vM6=4qx!ngQ-gixbQfn;=w`mqb|F;8pjpT55h={_tE{L^$N>dUFn^vS7Y%J=!MTT zLk##48o`IN{q&vP%c{KHdQ>-n3amP(_2aO-VF3R#Gj| zRCznd3bG*In%AQ#IH!m%3T?D_Y%v%&CX_L;_}F2O7gr3Teg8Loc}JmV5T%r9c2g}W z?SHMw{2-GaMO}(WgKL@TQPky#l&UkuQPh=)w4{;9J+^z#^bY? zek8h?In7Xyhm|CLFLS;Z^+Z^ricVnWDJI9O%bKE!w#|j^RkCbDGk8_w4OI;4s;05T zI>r3v!k*tTr}4w@nSbE)Z<+VV`ZLT{!1ZUCp}1f*6N5jWVM;?N7Rd!>1RCd 5 Kerberos agents)\"},{\"slug\":\"agents-in-the-cloud\",\"depth\":2,\"value\":\"Agents in the cloud\"},{\"slug\":\"kerberos-open-source--5-kerberos-agents-1\",\"depth\":3,\"value\":\"Kerberos Open Source (< 5 Kerberos agents)\"},{\"slug\":\"kerberos-enterprise--5-kerberos-agents-1\",\"depth\":3,\"value\":\"Kerberos Enterprise (> 5 Kerberos agents)\"},{\"slug\":\"kerberos-cloud\",\"depth\":2,\"value\":\"Kerberos Cloud\"},{\"slug\":\"architecture\",\"depth\":3,\"value\":\"Architecture\"}]}},{\"key\":\"src/index.mdx\",\"value\":{\"name\":\"Introduction\",\"route\":\"/\",\"id\":\"6576455a124f9aaefd860597f03a8fe4\",\"filepath\":\"src/index.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/index.mdx\",\"link\":\"\",\"slug\":\"src-index\",\"menu\":\"\",\"headings\":[{\"slug\":\"kerberosio\",\"depth\":1,\"value\":\"Kerberos.io\"},{\"slug\":\"the-name-kerberosio\",\"depth\":2,\"value\":\"The name: Kerberos.io\"},{\"slug\":\"why-kerberos\",\"depth\":2,\"value\":\"Why Kerberos\"},{\"slug\":\"what-is-kerberos\",\"depth\":2,\"value\":\"What is Kerberos\"},{\"slug\":\"the-kerberos-agent\",\"depth\":2,\"value\":\"The Kerberos agent\"},{\"slug\":\"how-does-it-work\",\"depth\":2,\"value\":\"How does it work\"},{\"slug\":\"open-source-vs-enterprise\",\"depth\":2,\"value\":\"Open Source vs Enterprise\"},{\"slug\":\"cloud\",\"depth\":2,\"value\":\"Cloud\"}]}},{\"key\":\"src/cloud/index.mdx\",\"value\":{\"name\":\"Cloud\",\"route\":\"/cloud\",\"id\":\"082761d36d79f69c41234676c7b77e13\",\"filepath\":\"src/cloud/index.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/cloud/index.mdx\",\"link\":\"\",\"slug\":\"src-cloud-index\",\"menu\":\"\",\"headings\":[{\"slug\":\"cloud\",\"depth\":1,\"value\":\"Cloud\"},{\"slug\":\"architecture\",\"depth\":2,\"value\":\"Architecture\"},{\"slug\":\"public-or-private-cloud-bring-your-own-cloud\",\"depth\":3,\"value\":\"Public or Private cloud (Bring Your Own Cloud)\"},{\"slug\":\"secured-storage\",\"depth\":2,\"value\":\"Secured storage\"},{\"slug\":\"consolidated-overview\",\"depth\":2,\"value\":\"Consolidated overview\"},{\"slug\":\"security\",\"depth\":3,\"value\":\"Security\"},{\"slug\":\"advanced-searching\",\"depth\":2,\"value\":\"Advanced searching\"},{\"slug\":\"machine-learning\",\"depth\":2,\"value\":\"Machine learning\"},{\"slug\":\"alerts\",\"depth\":2,\"value\":\"Alerts\"},{\"slug\":\"notifications\",\"depth\":3,\"value\":\"Notifications\"},{\"slug\":\"channels\",\"depth\":3,\"value\":\"Channels\"},{\"slug\":\"live-streaming\",\"depth\":2,\"value\":\"Live streaming\"},{\"slug\":\"accounts\",\"depth\":2,\"value\":\"Accounts\"},{\"slug\":\"logging\",\"depth\":2,\"value\":\"Logging\"}]}},{\"key\":\"src/enterprise/index.mdx\",\"value\":{\"name\":\"Introduction\",\"menu\":\"Enterprise\",\"route\":\"/enterprise/introduction\",\"id\":\"8f8fd9e742255635cf471c3030fa24ac\",\"filepath\":\"src/enterprise/index.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/enterprise/index.mdx\",\"link\":\"\",\"slug\":\"src-enterprise-index\",\"headings\":[{\"slug\":\"enterprise\",\"depth\":1,\"value\":\"Enterprise\"},{\"slug\":\"kubernetes\",\"depth\":2,\"value\":\"Kubernetes\"},{\"slug\":\"cloud-or-on-premise\",\"depth\":2,\"value\":\"Cloud or on premise\"},{\"slug\":\"licensing\",\"depth\":2,\"value\":\"Licensing\"}]}},{\"key\":\"src/enterprise/license.mdx\",\"value\":{\"name\":\"License\",\"menu\":\"Enterprise\",\"route\":\"/enterprise/license\",\"id\":\"692a3e0f1bc0489a5d98bfb87a5efa3e\",\"filepath\":\"src/enterprise/license.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/enterprise/license.mdx\",\"link\":\"\",\"slug\":\"src-enterprise-license\",\"headings\":[{\"slug\":\"cc-by-nc-sa-40\",\"depth\":1,\"value\":\"CC BY-NC-SA 4.0\"},{\"slug\":\"summary\",\"depth\":2,\"value\":\"Summary\"},{\"slug\":\"the-license\",\"depth\":2,\"value\":\"The license\"},{\"slug\":\"section-1--definitions\",\"depth\":3,\"value\":\"Section 1 – Definitions.\"},{\"slug\":\"section-2--scope\",\"depth\":3,\"value\":\"Section 2 – Scope.\"},{\"slug\":\"section-3--license-conditions\",\"depth\":3,\"value\":\"Section 3 – License Conditions.\"},{\"slug\":\"section-4--sui-generis-database-rights\",\"depth\":3,\"value\":\"Section 4 – Sui Generis Database Rights.\"},{\"slug\":\"section-5--disclaimer-of-warranties-and-limitation-of-liability\",\"depth\":3,\"value\":\"Section 5 – Disclaimer of Warranties and Limitation of Liability.\"},{\"slug\":\"section-6--term-and-termination\",\"depth\":3,\"value\":\"Section 6 – Term and Termination.\"},{\"slug\":\"section-7--other-terms-and-conditions\",\"depth\":3,\"value\":\"Section 7 – Other Terms and Conditions.\"},{\"slug\":\"section-8--interpretation\",\"depth\":3,\"value\":\"Section 8 – Interpretation.\"}]}},{\"key\":\"src/enterprise/releases.mdx\",\"value\":{\"name\":\"Releases\",\"menu\":\"Enterprise\",\"route\":\"/enterprise/releases\",\"id\":\"d55649896dc1baed370ad4ea221aefb5\",\"filepath\":\"src/enterprise/releases.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/enterprise/releases.mdx\",\"link\":\"\",\"slug\":\"src-enterprise-releases\",\"headings\":[{\"slug\":\"release-notes\",\"depth\":1,\"value\":\"Release notes\"},{\"slug\":\"280\",\"depth\":3,\"value\":\"2.8.0\"},{\"slug\":\"web\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"kios\",\"depth\":4,\"value\":\"KiOS\"},{\"slug\":\"272\",\"depth\":3,\"value\":\"2.7.2\"},{\"slug\":\"machinery\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"271\",\"depth\":3,\"value\":\"2.7.1\"},{\"slug\":\"machinery-1\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"kios-1\",\"depth\":4,\"value\":\"KiOS\"},{\"slug\":\"270\",\"depth\":3,\"value\":\"2.7.0\"},{\"slug\":\"web-1\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-2\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"docker\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"kios-2\",\"depth\":4,\"value\":\"KiOS\"},{\"slug\":\"261\",\"depth\":3,\"value\":\"2.6.1\"},{\"slug\":\"web-2\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-3\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"260\",\"depth\":3,\"value\":\"2.6.0\"},{\"slug\":\"web-3\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-4\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"docker-1\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"250\",\"depth\":3,\"value\":\"2.5.0\"},{\"slug\":\"web-4\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-5\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"242\",\"depth\":3,\"value\":\"2.4.2\"},{\"slug\":\"web-5\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-6\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"241\",\"depth\":3,\"value\":\"2.4.1\"},{\"slug\":\"web-6\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"240\",\"depth\":3,\"value\":\"2.4.0\"},{\"slug\":\"ecosystem\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"web-7\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"docker-2\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"machinery-7\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"231\",\"depth\":3,\"value\":\"2.3.1\"},{\"slug\":\"machinery-8\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"230\",\"depth\":3,\"value\":\"2.3.0\"},{\"slug\":\"ecosystem-1\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"221\",\"depth\":3,\"value\":\"2.2.1\"},{\"slug\":\"ecosystem-2\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"web-8\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-9\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"220\",\"depth\":3,\"value\":\"2.2.0\"},{\"slug\":\"ecosystem-3\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"web-9\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-10\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"210\",\"depth\":3,\"value\":\"2.1.0\"},{\"slug\":\"web-10\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-11\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"ecosystem-4\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"200\",\"depth\":3,\"value\":\"2.0.0\"},{\"slug\":\"web-11\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-12\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"docker-3\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"ecosystem-5\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"110\",\"depth\":3,\"value\":\"1.1.0\"},{\"slug\":\"web-12\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-13\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"cloud\",\"depth\":4,\"value\":\"Cloud\"},{\"slug\":\"103\",\"depth\":3,\"value\":\"1.0.3\"},{\"slug\":\"web-13\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-14\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"cloud-1\",\"depth\":4,\"value\":\"Cloud\"},{\"slug\":\"102\",\"depth\":3,\"value\":\"1.0.2\"},{\"slug\":\"web-14\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-15\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"101\",\"depth\":3,\"value\":\"1.0.1\"},{\"slug\":\"web-15\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-16\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"100\",\"depth\":3,\"value\":\"1.0.0\"},{\"slug\":\"first-commit-of-kerberosio\",\"depth\":4,\"value\":\"First commit of Kerberos.io\"}]}},{\"key\":\"src/open-source/contribute.mdx\",\"value\":{\"name\":\"Contribute\",\"menu\":\"Open Source\",\"route\":\"/opensource/contribute\",\"id\":\"111290db815f0c1a551a7742fd821f6f\",\"filepath\":\"src/open-source/contribute.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/contribute.mdx\",\"link\":\"\",\"slug\":\"src-open-source-contribute\",\"headings\":[{\"slug\":\"contribute\",\"depth\":1,\"value\":\"Contribute\"},{\"slug\":\"machinery\",\"depth\":2,\"value\":\"Machinery\"},{\"slug\":\"prerequisites\",\"depth\":3,\"value\":\"Prerequisites\"},{\"slug\":\"installation\",\"depth\":3,\"value\":\"Installation\"},{\"slug\":\"testing\",\"depth\":3,\"value\":\"Testing\"},{\"slug\":\"adding-a-new-class\",\"depth\":3,\"value\":\"Adding a new class\"},{\"slug\":\"create-the-header-file\",\"depth\":4,\"value\":\"Create the header file\"},{\"slug\":\"create-the-source-file\",\"depth\":4,\"value\":\"Create the source file\"},{\"slug\":\"modify-the-cmakeliststxt-file\",\"depth\":4,\"value\":\"Modify the CMakeLists.txt file\"},{\"slug\":\"create-a-new-entry-in-the-config-file\",\"depth\":4,\"value\":\"Create a new entry in the config file\"},{\"slug\":\"compile\",\"depth\":3,\"value\":\"Compile\"},{\"slug\":\"web\",\"depth\":2,\"value\":\"Web\"},{\"slug\":\"prerequisites-1\",\"depth\":3,\"value\":\"Prerequisites\"},{\"slug\":\"installation-1\",\"depth\":3,\"value\":\"Installation\"}]}},{\"key\":\"src/open-source/index.mdx\",\"value\":{\"name\":\"First things first\",\"menu\":\"Open Source\",\"route\":\"/opensource/introduction\",\"id\":\"e182a675cff01d9e46eba94b9b98f68a\",\"filepath\":\"src/open-source/index.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/index.mdx\",\"link\":\"\",\"slug\":\"src-open-source-index\",\"headings\":[{\"slug\":\"first-things-first\",\"depth\":1,\"value\":\"First things first\"},{\"slug\":\"license\",\"depth\":2,\"value\":\"License\"},{\"slug\":\"when-using-the-open-source-version\",\"depth\":2,\"value\":\"When using the Open Source version\"},{\"slug\":\"how-to-install\",\"depth\":2,\"value\":\"How to install\"}]}},{\"key\":\"src/open-source/installation.mdx\",\"value\":{\"name\":\"Installation\",\"menu\":\"Open Source\",\"route\":\"/opensource/installation\",\"id\":\"9e9908538be367cca76a80425244646f\",\"filepath\":\"src/open-source/installation.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/installation.mdx\",\"link\":\"\",\"slug\":\"src-open-source-installation\",\"headings\":[{\"slug\":\"installation\",\"depth\":1,\"value\":\"Installation\"},{\"slug\":\"kios\",\"depth\":2,\"value\":\"KiOS\"},{\"slug\":\"github\",\"depth\":3,\"value\":\"Github\"},{\"slug\":\"kerberos-installer\",\"depth\":3,\"value\":\"Kerberos installer\"},{\"slug\":\"etcher\",\"depth\":3,\"value\":\"Etcher\"},{\"slug\":\"connecting-to-wifi\",\"depth\":4,\"value\":\"Connecting to WiFi\"},{\"slug\":\"setup-a-static-ip-address\",\"depth\":4,\"value\":\"Setup a static IP-address\"},{\"slug\":\"power-on-the-raspberry-pi\",\"depth\":3,\"value\":\"Power on the Raspberry Pi\"},{\"slug\":\"access-the-raspberry-pi\",\"depth\":3,\"value\":\"Access the Raspberry Pi\"},{\"slug\":\"raspbian\",\"depth\":2,\"value\":\"Raspbian\"},{\"slug\":\"update-os\",\"depth\":3,\"value\":\"Update OS\"},{\"slug\":\"machinery\",\"depth\":3,\"value\":\"Machinery\"},{\"slug\":\"web\",\"depth\":3,\"value\":\"Web\"},{\"slug\":\"auto-removal\",\"depth\":3,\"value\":\"Auto removal\"},{\"slug\":\"docker\",\"depth\":2,\"value\":\"Docker\"},{\"slug\":\"prerequisites\",\"depth\":3,\"value\":\"Prerequisites\"},{\"slug\":\"github-1\",\"depth\":3,\"value\":\"Github\"},{\"slug\":\"download-docker-image\",\"depth\":3,\"value\":\"Download docker image\"},{\"slug\":\"volumes\",\"depth\":3,\"value\":\"Volumes\"},{\"slug\":\"generic\",\"depth\":2,\"value\":\"Generic\"},{\"slug\":\"machinery-1\",\"depth\":3,\"value\":\"Machinery\"},{\"slug\":\"web-1\",\"depth\":3,\"value\":\"Web\"},{\"slug\":\"auto-removal-1\",\"depth\":3,\"value\":\"Auto removal\"}]}},{\"key\":\"src/open-source/license.mdx\",\"value\":{\"name\":\"License\",\"menu\":\"Open Source\",\"route\":\"/opensource/license\",\"id\":\"b41faa434ffd47abb4b845cb083fff55\",\"filepath\":\"src/open-source/license.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/license.mdx\",\"link\":\"\",\"slug\":\"src-open-source-license\",\"headings\":[{\"slug\":\"cc-by-nc-sa-40\",\"depth\":1,\"value\":\"CC BY-NC-SA 4.0\"},{\"slug\":\"summary\",\"depth\":2,\"value\":\"Summary\"},{\"slug\":\"the-license\",\"depth\":2,\"value\":\"The license\"},{\"slug\":\"section-1--definitions\",\"depth\":3,\"value\":\"Section 1 – Definitions.\"},{\"slug\":\"section-2--scope\",\"depth\":3,\"value\":\"Section 2 – Scope.\"},{\"slug\":\"section-3--license-conditions\",\"depth\":3,\"value\":\"Section 3 – License Conditions.\"},{\"slug\":\"section-4--sui-generis-database-rights\",\"depth\":3,\"value\":\"Section 4 – Sui Generis Database Rights.\"},{\"slug\":\"section-5--disclaimer-of-warranties-and-limitation-of-liability\",\"depth\":3,\"value\":\"Section 5 – Disclaimer of Warranties and Limitation of Liability.\"},{\"slug\":\"section-6--term-and-termination\",\"depth\":3,\"value\":\"Section 6 – Term and Termination.\"},{\"slug\":\"section-7--other-terms-and-conditions\",\"depth\":3,\"value\":\"Section 7 – Other Terms and Conditions.\"},{\"slug\":\"section-8--interpretation\",\"depth\":3,\"value\":\"Section 8 – Interpretation.\"}]}},{\"key\":\"src/open-source/machinery.mdx\",\"value\":{\"name\":\"Machinery\",\"menu\":\"Open Source\",\"route\":\"/opensource/machinery\",\"id\":\"8b5e104d90b9ec673d88bf43d6bf99f2\",\"filepath\":\"src/open-source/machinery.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/machinery.mdx\",\"link\":\"\",\"slug\":\"src-open-source-machinery\",\"headings\":[{\"slug\":\"machinery\",\"depth\":1,\"value\":\"Machinery\"},{\"slug\":\"project-structure\",\"depth\":2,\"value\":\"Project structure\"},{\"slug\":\"capture\",\"depth\":2,\"value\":\"Capture\"},{\"slug\":\"usb-camera\",\"depth\":3,\"value\":\"USB camera\"},{\"slug\":\"parameters\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"framewidth-and--height\",\"depth\":5,\"value\":\"Framewidth and -height\"},{\"slug\":\"device-number\",\"depth\":5,\"value\":\"Device number\"},{\"slug\":\"delay\",\"depth\":5,\"value\":\"Delay\"},{\"slug\":\"angle\",\"depth\":5,\"value\":\"Angle\"},{\"slug\":\"raspberry-pi-camera-module\",\"depth\":3,\"value\":\"Raspberry Pi Camera Module\"},{\"slug\":\"parameters-1\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"framewidth-and--height-1\",\"depth\":5,\"value\":\"Framewidth and -height\"},{\"slug\":\"delay-1\",\"depth\":5,\"value\":\"Delay\"},{\"slug\":\"angle-1\",\"depth\":5,\"value\":\"Angle\"},{\"slug\":\"framerate\",\"depth\":5,\"value\":\"Framerate\"},{\"slug\":\"sharpness-saturation-contrast-brightness\",\"depth\":5,\"value\":\"Sharpness, saturation, contrast, brightness\"},{\"slug\":\"ip-camera\",\"depth\":3,\"value\":\"IP camera\"},{\"slug\":\"parameters-2\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"url\",\"depth\":5,\"value\":\"URL\"},{\"slug\":\"framewidth-and--height-2\",\"depth\":5,\"value\":\"Framewidth and -height\"},{\"slug\":\"delay-2\",\"depth\":5,\"value\":\"Delay\"},{\"slug\":\"angle-2\",\"depth\":5,\"value\":\"Angle\"},{\"slug\":\"condition\",\"depth\":2,\"value\":\"Condition\"},{\"slug\":\"enabled\",\"depth\":3,\"value\":\"Enabled\"},{\"slug\":\"parameters-3\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"active\",\"depth\":5,\"value\":\"Active\"},{\"slug\":\"delay-3\",\"depth\":5,\"value\":\"Delay\"},{\"slug\":\"time\",\"depth\":3,\"value\":\"Time\"},{\"slug\":\"parameters-4\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"times\",\"depth\":5,\"value\":\"Times\"},{\"slug\":\"delay-4\",\"depth\":5,\"value\":\"Delay\"},{\"slug\":\"algorithm\",\"depth\":2,\"value\":\"Algorithm\"},{\"slug\":\"differential-images\",\"depth\":3,\"value\":\"Differential images\"},{\"slug\":\"parameters-5\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"erode\",\"depth\":5,\"value\":\"Erode\"},{\"slug\":\"threshold\",\"depth\":5,\"value\":\"Threshold\"},{\"slug\":\"expositor\",\"depth\":2,\"value\":\"Expositor\"},{\"slug\":\"rectangle\",\"depth\":3,\"value\":\"Rectangle\"},{\"slug\":\"parameters-6\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"region\",\"depth\":5,\"value\":\"Region\"},{\"slug\":\"hull\",\"depth\":3,\"value\":\"Hull\"},{\"slug\":\"parameters-7\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"region-1\",\"depth\":5,\"value\":\"Region\"},{\"slug\":\"heuristic\",\"depth\":2,\"value\":\"Heuristic\"},{\"slug\":\"sequence\",\"depth\":3,\"value\":\"Sequence\"},{\"slug\":\"parameters-8\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"minimum-changes\",\"depth\":5,\"value\":\"Minimum changes\"},{\"slug\":\"minimum-durations\",\"depth\":5,\"value\":\"Minimum durations\"},{\"slug\":\"no-motion-delay-time\",\"depth\":5,\"value\":\"No motion delay time\"},{\"slug\":\"output\",\"depth\":2,\"value\":\"Output\"},{\"slug\":\"disk\",\"depth\":3,\"value\":\"Disk\"},{\"slug\":\"parameters-9\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"file-format\",\"depth\":5,\"value\":\"File format\"},{\"slug\":\"directory\",\"depth\":5,\"value\":\"Directory\"},{\"slug\":\"mark-with-timestamp\",\"depth\":5,\"value\":\"Mark with timestamp\"},{\"slug\":\"timestamp-color\",\"depth\":5,\"value\":\"Timestamp color\"},{\"slug\":\"privacy\",\"depth\":5,\"value\":\"Privacy\"},{\"slug\":\"throttler\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"video\",\"depth\":3,\"value\":\"Video\"},{\"slug\":\"parameters-10\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"fps\",\"depth\":5,\"value\":\"FPS\"},{\"slug\":\"record-after\",\"depth\":5,\"value\":\"Record after\"},{\"slug\":\"extensions\",\"depth\":5,\"value\":\"Extensions\"},{\"slug\":\"codec\",\"depth\":5,\"value\":\"Codec\"},{\"slug\":\"file-format-1\",\"depth\":5,\"value\":\"File format\"},{\"slug\":\"directory-1\",\"depth\":5,\"value\":\"Directory\"},{\"slug\":\"hardware-directory\",\"depth\":5,\"value\":\"Hardware directory\"},{\"slug\":\"enable-hardware-encoding\",\"depth\":5,\"value\":\"Enable Hardware encoding\"},{\"slug\":\"mark-with-timestamp-1\",\"depth\":5,\"value\":\"Mark with timestamp\"},{\"slug\":\"timestamp-color-1\",\"depth\":5,\"value\":\"Timestamp color\"},{\"slug\":\"privacy-1\",\"depth\":5,\"value\":\"Privacy\"},{\"slug\":\"video-privacy\",\"depth\":5,\"value\":\"Video privacy\"},{\"slug\":\"throttler-1\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"tcpip-client\",\"depth\":3,\"value\":\"TCP/IP client\"},{\"slug\":\"parameters-11\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"server\",\"depth\":5,\"value\":\"Server\"},{\"slug\":\"port\",\"depth\":5,\"value\":\"Port\"},{\"slug\":\"message\",\"depth\":5,\"value\":\"Message\"},{\"slug\":\"throttler-2\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"gpio\",\"depth\":3,\"value\":\"GPIO\"},{\"slug\":\"parameters-12\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"pin\",\"depth\":5,\"value\":\"Pin\"},{\"slug\":\"periods\",\"depth\":5,\"value\":\"Periods\"},{\"slug\":\"period-time\",\"depth\":5,\"value\":\"Period time\"},{\"slug\":\"throttler-3\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"webhook\",\"depth\":3,\"value\":\"Webhook\"},{\"slug\":\"parameters-13\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"url-1\",\"depth\":5,\"value\":\"Url\"},{\"slug\":\"throttler-4\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"output-1\",\"depth\":5,\"value\":\"Output\"},{\"slug\":\"script\",\"depth\":3,\"value\":\"Script\"},{\"slug\":\"parameters-14\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"path\",\"depth\":5,\"value\":\"Path\"},{\"slug\":\"throttler-5\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"example\",\"depth\":5,\"value\":\"Example\"},{\"slug\":\"mqtt\",\"depth\":3,\"value\":\"MQTT\"},{\"slug\":\"parameters-15\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"secure\",\"depth\":5,\"value\":\"Secure\"},{\"slug\":\"verifycn\",\"depth\":5,\"value\":\"Verifycn\"},{\"slug\":\"server-1\",\"depth\":5,\"value\":\"Server\"},{\"slug\":\"port-1\",\"depth\":5,\"value\":\"Port\"},{\"slug\":\"topic\",\"depth\":5,\"value\":\"Topic\"},{\"slug\":\"username\",\"depth\":5,\"value\":\"Username\"},{\"slug\":\"password\",\"depth\":5,\"value\":\"Password\"},{\"slug\":\"throttler-6\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"output-2\",\"depth\":5,\"value\":\"Output\"},{\"slug\":\"example-1\",\"depth\":5,\"value\":\"Example\"},{\"slug\":\"streaming\",\"depth\":2,\"value\":\"Streaming\"},{\"slug\":\"parameters-16\",\"depth\":3,\"value\":\"Parameters\"},{\"slug\":\"enabled-1\",\"depth\":4,\"value\":\"Enabled\"},{\"slug\":\"stream-port\",\"depth\":4,\"value\":\"Stream Port\"},{\"slug\":\"quality\",\"depth\":4,\"value\":\"Quality\"},{\"slug\":\"usernamepassword\",\"depth\":4,\"value\":\"Username/password\"}]}},{\"key\":\"src/open-source/releases.mdx\",\"value\":{\"name\":\"Releases\",\"menu\":\"Open Source\",\"route\":\"/opensource/releases\",\"id\":\"0513012dd89890d93de77c3aa4597e7f\",\"filepath\":\"src/open-source/releases.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/releases.mdx\",\"link\":\"\",\"slug\":\"src-open-source-releases\",\"headings\":[{\"slug\":\"release-notes\",\"depth\":1,\"value\":\"Release notes\"},{\"slug\":\"280\",\"depth\":3,\"value\":\"2.8.0\"},{\"slug\":\"web\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"kios\",\"depth\":4,\"value\":\"KiOS\"},{\"slug\":\"272\",\"depth\":3,\"value\":\"2.7.2\"},{\"slug\":\"machinery\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"271\",\"depth\":3,\"value\":\"2.7.1\"},{\"slug\":\"machinery-1\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"kios-1\",\"depth\":4,\"value\":\"KiOS\"},{\"slug\":\"270\",\"depth\":3,\"value\":\"2.7.0\"},{\"slug\":\"web-1\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-2\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"docker\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"kios-2\",\"depth\":4,\"value\":\"KiOS\"},{\"slug\":\"261\",\"depth\":3,\"value\":\"2.6.1\"},{\"slug\":\"web-2\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-3\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"260\",\"depth\":3,\"value\":\"2.6.0\"},{\"slug\":\"web-3\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-4\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"docker-1\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"250\",\"depth\":3,\"value\":\"2.5.0\"},{\"slug\":\"web-4\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-5\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"242\",\"depth\":3,\"value\":\"2.4.2\"},{\"slug\":\"web-5\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-6\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"241\",\"depth\":3,\"value\":\"2.4.1\"},{\"slug\":\"web-6\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"240\",\"depth\":3,\"value\":\"2.4.0\"},{\"slug\":\"ecosystem\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"web-7\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"docker-2\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"machinery-7\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"231\",\"depth\":3,\"value\":\"2.3.1\"},{\"slug\":\"machinery-8\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"230\",\"depth\":3,\"value\":\"2.3.0\"},{\"slug\":\"ecosystem-1\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"221\",\"depth\":3,\"value\":\"2.2.1\"},{\"slug\":\"ecosystem-2\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"web-8\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-9\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"220\",\"depth\":3,\"value\":\"2.2.0\"},{\"slug\":\"ecosystem-3\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"web-9\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-10\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"210\",\"depth\":3,\"value\":\"2.1.0\"},{\"slug\":\"web-10\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-11\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"ecosystem-4\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"200\",\"depth\":3,\"value\":\"2.0.0\"},{\"slug\":\"web-11\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-12\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"docker-3\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"ecosystem-5\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"110\",\"depth\":3,\"value\":\"1.1.0\"},{\"slug\":\"web-12\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-13\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"cloud\",\"depth\":4,\"value\":\"Cloud\"},{\"slug\":\"103\",\"depth\":3,\"value\":\"1.0.3\"},{\"slug\":\"web-13\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-14\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"cloud-1\",\"depth\":4,\"value\":\"Cloud\"},{\"slug\":\"102\",\"depth\":3,\"value\":\"1.0.2\"},{\"slug\":\"web-14\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-15\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"101\",\"depth\":3,\"value\":\"1.0.1\"},{\"slug\":\"web-15\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-16\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"100\",\"depth\":3,\"value\":\"1.0.0\"},{\"slug\":\"first-commit-of-kerberosio\",\"depth\":4,\"value\":\"First commit of Kerberos.io\"}]}},{\"key\":\"src/open-source/upgrade.mdx\",\"value\":{\"name\":\"Upgrade\",\"menu\":\"Open Source\",\"route\":\"/opensource/upgrade\",\"id\":\"bdff501afe4f3c7e6fc0f2ef0f365d5d\",\"filepath\":\"src/open-source/upgrade.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/upgrade.mdx\",\"link\":\"\",\"slug\":\"src-open-source-upgrade\",\"headings\":[{\"slug\":\"upgrade\",\"depth\":1,\"value\":\"Upgrade\"},{\"slug\":\"kios\",\"depth\":2,\"value\":\"KiOS\"},{\"slug\":\"raspbian\",\"depth\":2,\"value\":\"Raspbian\"},{\"slug\":\"docker\",\"depth\":2,\"value\":\"Docker\"}]}},{\"key\":\"src/open-source/web.mdx\",\"value\":{\"name\":\"Web\",\"menu\":\"Open Source\",\"route\":\"/opensource/web\",\"id\":\"302e6588cf7f47fc4110356883b1761b\",\"filepath\":\"src/open-source/web.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/web.mdx\",\"link\":\"\",\"slug\":\"src-open-source-web\",\"headings\":[{\"slug\":\"web-interface\",\"depth\":1,\"value\":\"Web interface\"},{\"slug\":\"overview\",\"depth\":2,\"value\":\"Overview\"},{\"slug\":\"dashboard\",\"depth\":3,\"value\":\"Dashboard\"},{\"slug\":\"overview-1\",\"depth\":3,\"value\":\"Overview\"},{\"slug\":\"settings\",\"depth\":3,\"value\":\"Settings\"},{\"slug\":\"system\",\"depth\":3,\"value\":\"System\"},{\"slug\":\"project-structure\",\"depth\":2,\"value\":\"Project structure\"},{\"slug\":\"back-end\",\"depth\":3,\"value\":\"Back-end\"},{\"slug\":\"front-end\",\"depth\":3,\"value\":\"Front-end\"},{\"slug\":\"api\",\"depth\":2,\"value\":\"API\"},{\"slug\":\"authentication\",\"depth\":3,\"value\":\"Authentication\"},{\"slug\":\"endpoints\",\"depth\":3,\"value\":\"Endpoints\"},{\"slug\":\"version-1\",\"depth\":3,\"value\":\"Version 1\"}]}}],\"props\":[{\"key\":\"src/components/Link.jsx\",\"value\":[{\"description\":\"\",\"displayName\":\"Link\",\"methods\":[],\"actualName\":\"Link\"}]},{\"key\":\"src/gatsby-theme-docz/components/Header/index.js\",\"value\":[{\"description\":\"\",\"displayName\":\"Header\",\"methods\":[],\"actualName\":\"Header\"}]},{\"key\":\"src/gatsby-theme-docz/components/Logo/index.js\",\"value\":[{\"description\":\"\",\"displayName\":\"Logo\",\"methods\":[],\"actualName\":\"Logo\"}]}]}"}}} \ No newline at end of file +{"data":{"doczDb":{"id":"ace00e2b-9c46-5e24-a19a-5ed242ca9c64","db":"{\"config\":{\"title\":\"Kerberos.io\",\"description\":\"My awesome app using docz\",\"menu\":[\"Introduction\",\"Architectures\",{\"name\":\"Open Source\",\"menu\":[\"First things first\",\"Releases\",\"Upgrade\",\"Installation\",\"Contribute\",\"License\",\"Machinery\",\"Web\"]},{\"name\":\"Enterprise\",\"menu\":[\"Introduction\",\"Installation\",\"License\"]},\"Cloud\"],\"version\":\"2.0.0-rc.41\",\"repository\":\"https://github.com/kerberos-io\",\"native\":false,\"themeConfig\":{\"colors\":{\"primary\":\"#943733\",\"secondary\":\"#9e9e9e\",\"h5\":{\"color\":\"#943733\"},\"header\":{\"bg\":\"#943733\"},\"sidebar\":{\"bg\":\"#f9f9f9\",\"navLinkActive\":\"#943733\"},\"modes\":{\"dark\":{\"primary\":\"#9e9e9e\",\"secondary\":\"#943733\",\"header\":{\"bg\":\"#943733\"},\"sidebar\":{\"navLinkActive\":\"#fff\"}}}}},\"separator\":\"-\",\"gatsbyRemarkPlugins\":[{\"resolve\":\"gatsby-remark-vscode\"},{\"resolve\":\"gatsby-remark-grid-tables\"}]},\"entries\":[{\"key\":\"src/architectures.mdx\",\"value\":{\"name\":\"Architectures\",\"route\":\"/architectures\",\"id\":\"bb781d264051ead449d715317c32b263\",\"filepath\":\"src/architectures.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/architectures.mdx\",\"link\":\"\",\"slug\":\"src-architectures\",\"menu\":\"\",\"headings\":[{\"slug\":\"architectures\",\"depth\":1,\"value\":\"Architectures\"},{\"slug\":\"agents-on-premise\",\"depth\":2,\"value\":\"Agents on-premise\"},{\"slug\":\"kerberos-open-source--5-kerberos-agents\",\"depth\":3,\"value\":\"Kerberos Open Source (< 5 Kerberos agents)\"},{\"slug\":\"kerberos-enterprise--5-kerberos-agents\",\"depth\":3,\"value\":\"Kerberos Enterprise (> 5 Kerberos agents)\"},{\"slug\":\"agents-in-the-cloud\",\"depth\":2,\"value\":\"Agents in the cloud\"},{\"slug\":\"kerberos-open-source--5-kerberos-agents-1\",\"depth\":3,\"value\":\"Kerberos Open Source (< 5 Kerberos agents)\"},{\"slug\":\"kerberos-enterprise--5-kerberos-agents-1\",\"depth\":3,\"value\":\"Kerberos Enterprise (> 5 Kerberos agents)\"},{\"slug\":\"kerberos-cloud\",\"depth\":2,\"value\":\"Kerberos Cloud\"},{\"slug\":\"architecture\",\"depth\":3,\"value\":\"Architecture\"}]}},{\"key\":\"src/index.mdx\",\"value\":{\"name\":\"Introduction\",\"route\":\"/\",\"id\":\"6576455a124f9aaefd860597f03a8fe4\",\"filepath\":\"src/index.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/index.mdx\",\"link\":\"\",\"slug\":\"src-index\",\"menu\":\"\",\"headings\":[{\"slug\":\"kerberosio\",\"depth\":1,\"value\":\"Kerberos.io\"},{\"slug\":\"the-name-kerberosio\",\"depth\":2,\"value\":\"The name: Kerberos.io\"},{\"slug\":\"why-kerberos\",\"depth\":2,\"value\":\"Why Kerberos\"},{\"slug\":\"what-is-kerberos\",\"depth\":2,\"value\":\"What is Kerberos\"},{\"slug\":\"the-kerberos-agent\",\"depth\":2,\"value\":\"The Kerberos agent\"},{\"slug\":\"how-does-it-work\",\"depth\":2,\"value\":\"How does it work\"},{\"slug\":\"open-source-vs-enterprise\",\"depth\":2,\"value\":\"Open Source vs Enterprise\"},{\"slug\":\"cloud\",\"depth\":2,\"value\":\"Cloud\"}]}},{\"key\":\"src/cloud/index.mdx\",\"value\":{\"name\":\"Cloud\",\"route\":\"/cloud\",\"id\":\"082761d36d79f69c41234676c7b77e13\",\"filepath\":\"src/cloud/index.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/cloud/index.mdx\",\"link\":\"\",\"slug\":\"src-cloud-index\",\"menu\":\"\",\"headings\":[{\"slug\":\"cloud\",\"depth\":1,\"value\":\"Cloud\"},{\"slug\":\"architecture\",\"depth\":2,\"value\":\"Architecture\"},{\"slug\":\"public-or-private-cloud-bring-your-own-cloud\",\"depth\":3,\"value\":\"Public or Private cloud (Bring Your Own Cloud)\"},{\"slug\":\"secured-storage\",\"depth\":2,\"value\":\"Secured storage\"},{\"slug\":\"consolidated-overview\",\"depth\":2,\"value\":\"Consolidated overview\"},{\"slug\":\"security\",\"depth\":3,\"value\":\"Security\"},{\"slug\":\"advanced-searching\",\"depth\":2,\"value\":\"Advanced searching\"},{\"slug\":\"machine-learning\",\"depth\":2,\"value\":\"Machine learning\"},{\"slug\":\"alerts\",\"depth\":2,\"value\":\"Alerts\"},{\"slug\":\"notifications\",\"depth\":3,\"value\":\"Notifications\"},{\"slug\":\"channels\",\"depth\":3,\"value\":\"Channels\"},{\"slug\":\"live-streaming\",\"depth\":2,\"value\":\"Live streaming\"},{\"slug\":\"accounts\",\"depth\":2,\"value\":\"Accounts\"},{\"slug\":\"logging\",\"depth\":2,\"value\":\"Logging\"}]}},{\"key\":\"src/enterprise/index.mdx\",\"value\":{\"name\":\"Introduction\",\"menu\":\"Enterprise\",\"route\":\"/enterprise/introduction\",\"id\":\"8f8fd9e742255635cf471c3030fa24ac\",\"filepath\":\"src/enterprise/index.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/enterprise/index.mdx\",\"link\":\"\",\"slug\":\"src-enterprise-index\",\"headings\":[{\"slug\":\"enterprise\",\"depth\":1,\"value\":\"Enterprise\"},{\"slug\":\"kubernetes\",\"depth\":2,\"value\":\"Kubernetes\"},{\"slug\":\"cloud-or-on-premise\",\"depth\":2,\"value\":\"Cloud or on premise\"},{\"slug\":\"licensing\",\"depth\":2,\"value\":\"Licensing\"}]}},{\"key\":\"src/enterprise/installation.mdx\",\"value\":{\"name\":\"Installation\",\"menu\":\"Enterprise\",\"route\":\"/enterprise/installation\",\"id\":\"5cf033b11c0e22a8dad307af4f84a83b\",\"filepath\":\"src/enterprise/installation.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/enterprise/installation.mdx\",\"link\":\"\",\"slug\":\"src-enterprise-installation\",\"headings\":[{\"slug\":\"introduction\",\"depth\":1,\"value\":\"Introduction\"},{\"slug\":\"installation\",\"depth\":1,\"value\":\"Installation\"},{\"slug\":\"helm\",\"depth\":2,\"value\":\"Helm\"},{\"slug\":\"initiate-helm\",\"depth\":3,\"value\":\"Initiate helm\"},{\"slug\":\"traefik\",\"depth\":2,\"value\":\"Traefik\"},{\"slug\":\"mongodb\",\"depth\":2,\"value\":\"MongoDB\"},{\"slug\":\"factory\",\"depth\":2,\"value\":\"Factory\"},{\"slug\":\"test-out-configuration\",\"depth\":1,\"value\":\"Test out configuration\"},{\"slug\":\"dns-configuration\",\"depth\":2,\"value\":\"DNS configuration\"},{\"slug\":\"access-the-system\",\"depth\":2,\"value\":\"Access the system\"}]}},{\"key\":\"src/enterprise/license.mdx\",\"value\":{\"name\":\"License\",\"menu\":\"Enterprise\",\"route\":\"/enterprise/license\",\"id\":\"692a3e0f1bc0489a5d98bfb87a5efa3e\",\"filepath\":\"src/enterprise/license.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/enterprise/license.mdx\",\"link\":\"\",\"slug\":\"src-enterprise-license\",\"headings\":[{\"slug\":\"cc-by-nc-sa-40\",\"depth\":1,\"value\":\"CC BY-NC-SA 4.0\"},{\"slug\":\"summary\",\"depth\":2,\"value\":\"Summary\"},{\"slug\":\"the-license\",\"depth\":2,\"value\":\"The license\"},{\"slug\":\"section-1--definitions\",\"depth\":3,\"value\":\"Section 1 – Definitions.\"},{\"slug\":\"section-2--scope\",\"depth\":3,\"value\":\"Section 2 – Scope.\"},{\"slug\":\"section-3--license-conditions\",\"depth\":3,\"value\":\"Section 3 – License Conditions.\"},{\"slug\":\"section-4--sui-generis-database-rights\",\"depth\":3,\"value\":\"Section 4 – Sui Generis Database Rights.\"},{\"slug\":\"section-5--disclaimer-of-warranties-and-limitation-of-liability\",\"depth\":3,\"value\":\"Section 5 – Disclaimer of Warranties and Limitation of Liability.\"},{\"slug\":\"section-6--term-and-termination\",\"depth\":3,\"value\":\"Section 6 – Term and Termination.\"},{\"slug\":\"section-7--other-terms-and-conditions\",\"depth\":3,\"value\":\"Section 7 – Other Terms and Conditions.\"},{\"slug\":\"section-8--interpretation\",\"depth\":3,\"value\":\"Section 8 – Interpretation.\"}]}},{\"key\":\"src/enterprise/releases.mdx\",\"value\":{\"name\":\"Releases\",\"menu\":\"Enterprise\",\"route\":\"/enterprise/releases\",\"id\":\"d55649896dc1baed370ad4ea221aefb5\",\"filepath\":\"src/enterprise/releases.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/enterprise/releases.mdx\",\"link\":\"\",\"slug\":\"src-enterprise-releases\",\"headings\":[{\"slug\":\"release-notes\",\"depth\":1,\"value\":\"Release notes\"},{\"slug\":\"100\",\"depth\":3,\"value\":\"1.0.0\"},{\"slug\":\"factory\",\"depth\":4,\"value\":\"Factory\"}]}},{\"key\":\"src/open-source/contribute.mdx\",\"value\":{\"name\":\"Contribute\",\"menu\":\"Open Source\",\"route\":\"/opensource/contribute\",\"id\":\"111290db815f0c1a551a7742fd821f6f\",\"filepath\":\"src/open-source/contribute.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/contribute.mdx\",\"link\":\"\",\"slug\":\"src-open-source-contribute\",\"headings\":[{\"slug\":\"contribute\",\"depth\":1,\"value\":\"Contribute\"},{\"slug\":\"machinery\",\"depth\":2,\"value\":\"Machinery\"},{\"slug\":\"prerequisites\",\"depth\":3,\"value\":\"Prerequisites\"},{\"slug\":\"installation\",\"depth\":3,\"value\":\"Installation\"},{\"slug\":\"testing\",\"depth\":3,\"value\":\"Testing\"},{\"slug\":\"adding-a-new-class\",\"depth\":3,\"value\":\"Adding a new class\"},{\"slug\":\"create-the-header-file\",\"depth\":4,\"value\":\"Create the header file\"},{\"slug\":\"create-the-source-file\",\"depth\":4,\"value\":\"Create the source file\"},{\"slug\":\"modify-the-cmakeliststxt-file\",\"depth\":4,\"value\":\"Modify the CMakeLists.txt file\"},{\"slug\":\"create-a-new-entry-in-the-config-file\",\"depth\":4,\"value\":\"Create a new entry in the config file\"},{\"slug\":\"compile\",\"depth\":3,\"value\":\"Compile\"},{\"slug\":\"web\",\"depth\":2,\"value\":\"Web\"},{\"slug\":\"prerequisites-1\",\"depth\":3,\"value\":\"Prerequisites\"},{\"slug\":\"installation-1\",\"depth\":3,\"value\":\"Installation\"}]}},{\"key\":\"src/open-source/index.mdx\",\"value\":{\"name\":\"First things first\",\"menu\":\"Open Source\",\"route\":\"/opensource/introduction\",\"id\":\"e182a675cff01d9e46eba94b9b98f68a\",\"filepath\":\"src/open-source/index.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/index.mdx\",\"link\":\"\",\"slug\":\"src-open-source-index\",\"headings\":[{\"slug\":\"first-things-first\",\"depth\":1,\"value\":\"First things first\"},{\"slug\":\"license\",\"depth\":2,\"value\":\"License\"},{\"slug\":\"when-using-the-open-source-version\",\"depth\":2,\"value\":\"When using the Open Source version\"},{\"slug\":\"how-to-install\",\"depth\":2,\"value\":\"How to install\"}]}},{\"key\":\"src/open-source/installation.mdx\",\"value\":{\"name\":\"Installation\",\"menu\":\"Open Source\",\"route\":\"/opensource/installation\",\"id\":\"9e9908538be367cca76a80425244646f\",\"filepath\":\"src/open-source/installation.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/installation.mdx\",\"link\":\"\",\"slug\":\"src-open-source-installation\",\"headings\":[{\"slug\":\"installation\",\"depth\":1,\"value\":\"Installation\"},{\"slug\":\"kios\",\"depth\":2,\"value\":\"KiOS\"},{\"slug\":\"github\",\"depth\":3,\"value\":\"Github\"},{\"slug\":\"kerberos-installer\",\"depth\":3,\"value\":\"Kerberos installer\"},{\"slug\":\"etcher\",\"depth\":3,\"value\":\"Etcher\"},{\"slug\":\"connecting-to-wifi\",\"depth\":4,\"value\":\"Connecting to WiFi\"},{\"slug\":\"setup-a-static-ip-address\",\"depth\":4,\"value\":\"Setup a static IP-address\"},{\"slug\":\"power-on-the-raspberry-pi\",\"depth\":3,\"value\":\"Power on the Raspberry Pi\"},{\"slug\":\"access-the-raspberry-pi\",\"depth\":3,\"value\":\"Access the Raspberry Pi\"},{\"slug\":\"raspbian\",\"depth\":2,\"value\":\"Raspbian\"},{\"slug\":\"update-os\",\"depth\":3,\"value\":\"Update OS\"},{\"slug\":\"machinery\",\"depth\":3,\"value\":\"Machinery\"},{\"slug\":\"web\",\"depth\":3,\"value\":\"Web\"},{\"slug\":\"auto-removal\",\"depth\":3,\"value\":\"Auto removal\"},{\"slug\":\"docker\",\"depth\":2,\"value\":\"Docker\"},{\"slug\":\"prerequisites\",\"depth\":3,\"value\":\"Prerequisites\"},{\"slug\":\"github-1\",\"depth\":3,\"value\":\"Github\"},{\"slug\":\"download-docker-image\",\"depth\":3,\"value\":\"Download docker image\"},{\"slug\":\"volumes\",\"depth\":3,\"value\":\"Volumes\"},{\"slug\":\"generic\",\"depth\":2,\"value\":\"Generic\"},{\"slug\":\"machinery-1\",\"depth\":3,\"value\":\"Machinery\"},{\"slug\":\"web-1\",\"depth\":3,\"value\":\"Web\"},{\"slug\":\"auto-removal-1\",\"depth\":3,\"value\":\"Auto removal\"}]}},{\"key\":\"src/open-source/license.mdx\",\"value\":{\"name\":\"License\",\"menu\":\"Open Source\",\"route\":\"/opensource/license\",\"id\":\"b41faa434ffd47abb4b845cb083fff55\",\"filepath\":\"src/open-source/license.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/license.mdx\",\"link\":\"\",\"slug\":\"src-open-source-license\",\"headings\":[{\"slug\":\"cc-by-nc-sa-40\",\"depth\":1,\"value\":\"CC BY-NC-SA 4.0\"},{\"slug\":\"summary\",\"depth\":2,\"value\":\"Summary\"},{\"slug\":\"the-license\",\"depth\":2,\"value\":\"The license\"},{\"slug\":\"section-1--definitions\",\"depth\":3,\"value\":\"Section 1 – Definitions.\"},{\"slug\":\"section-2--scope\",\"depth\":3,\"value\":\"Section 2 – Scope.\"},{\"slug\":\"section-3--license-conditions\",\"depth\":3,\"value\":\"Section 3 – License Conditions.\"},{\"slug\":\"section-4--sui-generis-database-rights\",\"depth\":3,\"value\":\"Section 4 – Sui Generis Database Rights.\"},{\"slug\":\"section-5--disclaimer-of-warranties-and-limitation-of-liability\",\"depth\":3,\"value\":\"Section 5 – Disclaimer of Warranties and Limitation of Liability.\"},{\"slug\":\"section-6--term-and-termination\",\"depth\":3,\"value\":\"Section 6 – Term and Termination.\"},{\"slug\":\"section-7--other-terms-and-conditions\",\"depth\":3,\"value\":\"Section 7 – Other Terms and Conditions.\"},{\"slug\":\"section-8--interpretation\",\"depth\":3,\"value\":\"Section 8 – Interpretation.\"}]}},{\"key\":\"src/open-source/machinery.mdx\",\"value\":{\"name\":\"Machinery\",\"menu\":\"Open Source\",\"route\":\"/opensource/machinery\",\"id\":\"8b5e104d90b9ec673d88bf43d6bf99f2\",\"filepath\":\"src/open-source/machinery.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/machinery.mdx\",\"link\":\"\",\"slug\":\"src-open-source-machinery\",\"headings\":[{\"slug\":\"machinery\",\"depth\":1,\"value\":\"Machinery\"},{\"slug\":\"project-structure\",\"depth\":2,\"value\":\"Project structure\"},{\"slug\":\"capture\",\"depth\":2,\"value\":\"Capture\"},{\"slug\":\"usb-camera\",\"depth\":3,\"value\":\"USB camera\"},{\"slug\":\"parameters\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"framewidth-and--height\",\"depth\":5,\"value\":\"Framewidth and -height\"},{\"slug\":\"device-number\",\"depth\":5,\"value\":\"Device number\"},{\"slug\":\"delay\",\"depth\":5,\"value\":\"Delay\"},{\"slug\":\"angle\",\"depth\":5,\"value\":\"Angle\"},{\"slug\":\"raspberry-pi-camera-module\",\"depth\":3,\"value\":\"Raspberry Pi Camera Module\"},{\"slug\":\"parameters-1\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"framewidth-and--height-1\",\"depth\":5,\"value\":\"Framewidth and -height\"},{\"slug\":\"delay-1\",\"depth\":5,\"value\":\"Delay\"},{\"slug\":\"angle-1\",\"depth\":5,\"value\":\"Angle\"},{\"slug\":\"framerate\",\"depth\":5,\"value\":\"Framerate\"},{\"slug\":\"sharpness-saturation-contrast-brightness\",\"depth\":5,\"value\":\"Sharpness, saturation, contrast, brightness\"},{\"slug\":\"ip-camera\",\"depth\":3,\"value\":\"IP camera\"},{\"slug\":\"parameters-2\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"url\",\"depth\":5,\"value\":\"URL\"},{\"slug\":\"framewidth-and--height-2\",\"depth\":5,\"value\":\"Framewidth and -height\"},{\"slug\":\"delay-2\",\"depth\":5,\"value\":\"Delay\"},{\"slug\":\"angle-2\",\"depth\":5,\"value\":\"Angle\"},{\"slug\":\"condition\",\"depth\":2,\"value\":\"Condition\"},{\"slug\":\"enabled\",\"depth\":3,\"value\":\"Enabled\"},{\"slug\":\"parameters-3\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"active\",\"depth\":5,\"value\":\"Active\"},{\"slug\":\"delay-3\",\"depth\":5,\"value\":\"Delay\"},{\"slug\":\"time\",\"depth\":3,\"value\":\"Time\"},{\"slug\":\"parameters-4\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"times\",\"depth\":5,\"value\":\"Times\"},{\"slug\":\"delay-4\",\"depth\":5,\"value\":\"Delay\"},{\"slug\":\"algorithm\",\"depth\":2,\"value\":\"Algorithm\"},{\"slug\":\"differential-images\",\"depth\":3,\"value\":\"Differential images\"},{\"slug\":\"parameters-5\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"erode\",\"depth\":5,\"value\":\"Erode\"},{\"slug\":\"threshold\",\"depth\":5,\"value\":\"Threshold\"},{\"slug\":\"expositor\",\"depth\":2,\"value\":\"Expositor\"},{\"slug\":\"rectangle\",\"depth\":3,\"value\":\"Rectangle\"},{\"slug\":\"parameters-6\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"region\",\"depth\":5,\"value\":\"Region\"},{\"slug\":\"hull\",\"depth\":3,\"value\":\"Hull\"},{\"slug\":\"parameters-7\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"region-1\",\"depth\":5,\"value\":\"Region\"},{\"slug\":\"heuristic\",\"depth\":2,\"value\":\"Heuristic\"},{\"slug\":\"sequence\",\"depth\":3,\"value\":\"Sequence\"},{\"slug\":\"parameters-8\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"minimum-changes\",\"depth\":5,\"value\":\"Minimum changes\"},{\"slug\":\"minimum-durations\",\"depth\":5,\"value\":\"Minimum durations\"},{\"slug\":\"no-motion-delay-time\",\"depth\":5,\"value\":\"No motion delay time\"},{\"slug\":\"output\",\"depth\":2,\"value\":\"Output\"},{\"slug\":\"disk\",\"depth\":3,\"value\":\"Disk\"},{\"slug\":\"parameters-9\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"file-format\",\"depth\":5,\"value\":\"File format\"},{\"slug\":\"directory\",\"depth\":5,\"value\":\"Directory\"},{\"slug\":\"mark-with-timestamp\",\"depth\":5,\"value\":\"Mark with timestamp\"},{\"slug\":\"timestamp-color\",\"depth\":5,\"value\":\"Timestamp color\"},{\"slug\":\"privacy\",\"depth\":5,\"value\":\"Privacy\"},{\"slug\":\"throttler\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"video\",\"depth\":3,\"value\":\"Video\"},{\"slug\":\"parameters-10\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"fps\",\"depth\":5,\"value\":\"FPS\"},{\"slug\":\"record-after\",\"depth\":5,\"value\":\"Record after\"},{\"slug\":\"extensions\",\"depth\":5,\"value\":\"Extensions\"},{\"slug\":\"codec\",\"depth\":5,\"value\":\"Codec\"},{\"slug\":\"file-format-1\",\"depth\":5,\"value\":\"File format\"},{\"slug\":\"directory-1\",\"depth\":5,\"value\":\"Directory\"},{\"slug\":\"hardware-directory\",\"depth\":5,\"value\":\"Hardware directory\"},{\"slug\":\"enable-hardware-encoding\",\"depth\":5,\"value\":\"Enable Hardware encoding\"},{\"slug\":\"mark-with-timestamp-1\",\"depth\":5,\"value\":\"Mark with timestamp\"},{\"slug\":\"timestamp-color-1\",\"depth\":5,\"value\":\"Timestamp color\"},{\"slug\":\"privacy-1\",\"depth\":5,\"value\":\"Privacy\"},{\"slug\":\"video-privacy\",\"depth\":5,\"value\":\"Video privacy\"},{\"slug\":\"throttler-1\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"tcpip-client\",\"depth\":3,\"value\":\"TCP/IP client\"},{\"slug\":\"parameters-11\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"server\",\"depth\":5,\"value\":\"Server\"},{\"slug\":\"port\",\"depth\":5,\"value\":\"Port\"},{\"slug\":\"message\",\"depth\":5,\"value\":\"Message\"},{\"slug\":\"throttler-2\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"gpio\",\"depth\":3,\"value\":\"GPIO\"},{\"slug\":\"parameters-12\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"pin\",\"depth\":5,\"value\":\"Pin\"},{\"slug\":\"periods\",\"depth\":5,\"value\":\"Periods\"},{\"slug\":\"period-time\",\"depth\":5,\"value\":\"Period time\"},{\"slug\":\"throttler-3\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"webhook\",\"depth\":3,\"value\":\"Webhook\"},{\"slug\":\"parameters-13\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"url-1\",\"depth\":5,\"value\":\"Url\"},{\"slug\":\"throttler-4\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"output-1\",\"depth\":5,\"value\":\"Output\"},{\"slug\":\"script\",\"depth\":3,\"value\":\"Script\"},{\"slug\":\"parameters-14\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"path\",\"depth\":5,\"value\":\"Path\"},{\"slug\":\"throttler-5\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"example\",\"depth\":5,\"value\":\"Example\"},{\"slug\":\"mqtt\",\"depth\":3,\"value\":\"MQTT\"},{\"slug\":\"parameters-15\",\"depth\":4,\"value\":\"Parameters\"},{\"slug\":\"secure\",\"depth\":5,\"value\":\"Secure\"},{\"slug\":\"verifycn\",\"depth\":5,\"value\":\"Verifycn\"},{\"slug\":\"server-1\",\"depth\":5,\"value\":\"Server\"},{\"slug\":\"port-1\",\"depth\":5,\"value\":\"Port\"},{\"slug\":\"topic\",\"depth\":5,\"value\":\"Topic\"},{\"slug\":\"username\",\"depth\":5,\"value\":\"Username\"},{\"slug\":\"password\",\"depth\":5,\"value\":\"Password\"},{\"slug\":\"throttler-6\",\"depth\":5,\"value\":\"Throttler\"},{\"slug\":\"output-2\",\"depth\":5,\"value\":\"Output\"},{\"slug\":\"example-1\",\"depth\":5,\"value\":\"Example\"},{\"slug\":\"streaming\",\"depth\":2,\"value\":\"Streaming\"},{\"slug\":\"parameters-16\",\"depth\":3,\"value\":\"Parameters\"},{\"slug\":\"enabled-1\",\"depth\":4,\"value\":\"Enabled\"},{\"slug\":\"stream-port\",\"depth\":4,\"value\":\"Stream Port\"},{\"slug\":\"quality\",\"depth\":4,\"value\":\"Quality\"},{\"slug\":\"usernamepassword\",\"depth\":4,\"value\":\"Username/password\"}]}},{\"key\":\"src/open-source/releases.mdx\",\"value\":{\"name\":\"Releases\",\"menu\":\"Open Source\",\"route\":\"/opensource/releases\",\"id\":\"0513012dd89890d93de77c3aa4597e7f\",\"filepath\":\"src/open-source/releases.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/releases.mdx\",\"link\":\"\",\"slug\":\"src-open-source-releases\",\"headings\":[{\"slug\":\"release-notes\",\"depth\":1,\"value\":\"Release notes\"},{\"slug\":\"280\",\"depth\":3,\"value\":\"2.8.0\"},{\"slug\":\"web\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"kios\",\"depth\":4,\"value\":\"KiOS\"},{\"slug\":\"272\",\"depth\":3,\"value\":\"2.7.2\"},{\"slug\":\"machinery\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"271\",\"depth\":3,\"value\":\"2.7.1\"},{\"slug\":\"machinery-1\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"kios-1\",\"depth\":4,\"value\":\"KiOS\"},{\"slug\":\"270\",\"depth\":3,\"value\":\"2.7.0\"},{\"slug\":\"web-1\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-2\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"docker\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"kios-2\",\"depth\":4,\"value\":\"KiOS\"},{\"slug\":\"261\",\"depth\":3,\"value\":\"2.6.1\"},{\"slug\":\"web-2\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-3\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"260\",\"depth\":3,\"value\":\"2.6.0\"},{\"slug\":\"web-3\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-4\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"docker-1\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"250\",\"depth\":3,\"value\":\"2.5.0\"},{\"slug\":\"web-4\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-5\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"242\",\"depth\":3,\"value\":\"2.4.2\"},{\"slug\":\"web-5\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-6\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"241\",\"depth\":3,\"value\":\"2.4.1\"},{\"slug\":\"web-6\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"240\",\"depth\":3,\"value\":\"2.4.0\"},{\"slug\":\"ecosystem\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"web-7\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"docker-2\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"machinery-7\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"231\",\"depth\":3,\"value\":\"2.3.1\"},{\"slug\":\"machinery-8\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"230\",\"depth\":3,\"value\":\"2.3.0\"},{\"slug\":\"ecosystem-1\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"221\",\"depth\":3,\"value\":\"2.2.1\"},{\"slug\":\"ecosystem-2\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"web-8\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-9\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"220\",\"depth\":3,\"value\":\"2.2.0\"},{\"slug\":\"ecosystem-3\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"web-9\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-10\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"210\",\"depth\":3,\"value\":\"2.1.0\"},{\"slug\":\"web-10\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-11\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"ecosystem-4\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"200\",\"depth\":3,\"value\":\"2.0.0\"},{\"slug\":\"web-11\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-12\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"docker-3\",\"depth\":4,\"value\":\"Docker\"},{\"slug\":\"ecosystem-5\",\"depth\":4,\"value\":\"Ecosystem\"},{\"slug\":\"110\",\"depth\":3,\"value\":\"1.1.0\"},{\"slug\":\"web-12\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-13\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"cloud\",\"depth\":4,\"value\":\"Cloud\"},{\"slug\":\"103\",\"depth\":3,\"value\":\"1.0.3\"},{\"slug\":\"web-13\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-14\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"cloud-1\",\"depth\":4,\"value\":\"Cloud\"},{\"slug\":\"102\",\"depth\":3,\"value\":\"1.0.2\"},{\"slug\":\"web-14\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-15\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"101\",\"depth\":3,\"value\":\"1.0.1\"},{\"slug\":\"web-15\",\"depth\":4,\"value\":\"Web\"},{\"slug\":\"machinery-16\",\"depth\":4,\"value\":\"Machinery\"},{\"slug\":\"100\",\"depth\":3,\"value\":\"1.0.0\"},{\"slug\":\"first-commit-of-kerberosio\",\"depth\":4,\"value\":\"First commit of Kerberos.io\"}]}},{\"key\":\"src/open-source/upgrade.mdx\",\"value\":{\"name\":\"Upgrade\",\"menu\":\"Open Source\",\"route\":\"/opensource/upgrade\",\"id\":\"bdff501afe4f3c7e6fc0f2ef0f365d5d\",\"filepath\":\"src/open-source/upgrade.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/upgrade.mdx\",\"link\":\"\",\"slug\":\"src-open-source-upgrade\",\"headings\":[{\"slug\":\"upgrade\",\"depth\":1,\"value\":\"Upgrade\"},{\"slug\":\"kios\",\"depth\":2,\"value\":\"KiOS\"},{\"slug\":\"raspbian\",\"depth\":2,\"value\":\"Raspbian\"},{\"slug\":\"docker\",\"depth\":2,\"value\":\"Docker\"}]}},{\"key\":\"src/open-source/web.mdx\",\"value\":{\"name\":\"Web\",\"menu\":\"Open Source\",\"route\":\"/opensource/web\",\"id\":\"302e6588cf7f47fc4110356883b1761b\",\"filepath\":\"src/open-source/web.mdx\",\"fullpath\":\"/Users/i353408/Vagrant/www/repos/documentation/src/open-source/web.mdx\",\"link\":\"\",\"slug\":\"src-open-source-web\",\"headings\":[{\"slug\":\"web-interface\",\"depth\":1,\"value\":\"Web interface\"},{\"slug\":\"overview\",\"depth\":2,\"value\":\"Overview\"},{\"slug\":\"dashboard\",\"depth\":3,\"value\":\"Dashboard\"},{\"slug\":\"overview-1\",\"depth\":3,\"value\":\"Overview\"},{\"slug\":\"settings\",\"depth\":3,\"value\":\"Settings\"},{\"slug\":\"system\",\"depth\":3,\"value\":\"System\"},{\"slug\":\"project-structure\",\"depth\":2,\"value\":\"Project structure\"},{\"slug\":\"back-end\",\"depth\":3,\"value\":\"Back-end\"},{\"slug\":\"front-end\",\"depth\":3,\"value\":\"Front-end\"},{\"slug\":\"api\",\"depth\":2,\"value\":\"API\"},{\"slug\":\"authentication\",\"depth\":3,\"value\":\"Authentication\"},{\"slug\":\"endpoints\",\"depth\":3,\"value\":\"Endpoints\"},{\"slug\":\"version-1\",\"depth\":3,\"value\":\"Version 1\"}]}}],\"props\":[{\"key\":\"src/components/Link.jsx\",\"value\":[{\"description\":\"\",\"displayName\":\"Link\",\"methods\":[],\"actualName\":\"Link\"}]},{\"key\":\"src/gatsby-theme-docz/components/Header/index.js\",\"value\":[{\"description\":\"\",\"displayName\":\"Header\",\"methods\":[],\"actualName\":\"Header\"}]},{\"key\":\"src/gatsby-theme-docz/components/Logo/index.js\",\"value\":[{\"description\":\"\",\"displayName\":\"Logo\",\"methods\":[],\"actualName\":\"Logo\"}]}]}"}}} \ No newline at end of file diff --git a/doczrc.js b/doczrc.js index d7084d4..9ca4c58 100644 --- a/doczrc.js +++ b/doczrc.js @@ -3,7 +3,7 @@ export default { 'Introduction', 'Architectures', { name: 'Open Source', menu: ['First things first', 'Releases', 'Upgrade', 'Installation', 'Contribute', 'License', 'Machinery', 'Web'] }, - 'Enterprise', + { name: 'Enterprise', menu: ['Introduction', 'Installation', 'License'] }, 'Cloud' ], repository: "https://github.com/kerberos-io", diff --git a/public/images/factory/kerberos-factory-loginpage.png b/public/images/factory/kerberos-factory-loginpage.png new file mode 100644 index 0000000000000000000000000000000000000000..0c2a41e85c6a7368f5c339a28e910f1626bdc741 GIT binary patch literal 1654137 zcmeFYc{o)4|35xbsU%88iLn$ZOqM9yR4PQKsE}pKl9VyYzRgi8S+YbSF)fxvWY3b( zZ6{>OHr3b%gJH(ZnC+bJHFe+j`~Cg>uIu;T@A_WX_xj8O=Q!u}d~Nf3J(tJxoahTy zrea(6Zh^sIV&-P2tzoducVMuM?>B9P!C;u-hR-nARtrxPlMCi1Ch`~VVsChQxx-*) z(a&r}>}=Y1XE|7#-@LcUZ1d-6#ZBuIcbtlqm%l9WEOGsgb8(wbHg}g6-oGt%@#E_P z#h9WEi4`u0SQl#ShF$JXYQq%i?713 zZLstfa%Y*)H_ZKzE3f5cXtTc}hMf+jmUk@k2|S+!EO1$+q$pu8of1PW=V#i5#3w(@FCMat{ABTB zkECdcLKF4CsS2Z}gO>~AEc=Gv&aB%YHMsSNLVy&_!Y{Uf+DR`xZNUZ5a3R0QqjYFNJ-#0{x8d>C@rZ@QJsuM`8pPm2{5#9?vm>Insz*Ov zt}X-5X9@2Kv+?~P+njmddgI0Ws#c_)0smgc-fI^xuM#;oUAp$YI}~_rDir#GomYDh zKEQfDZ0IE(u*D!I^UJntPa+=5w!HXAA3nKD&dwxZ;PyL`L!Ew>W1A8?3Rypx_x|Y? zmOjghg&NhoAphb$$9Ub+{t=z({SJ-|6AcK$CVRd7w5~pQ{z|m>T=~YI@w%@}dwpjwm&=C7Gq1t=zoexdoq1HEsj)jY z=em8`zKn;@uJ5uFyOMCU5zWyWjQ76|zoXdQVE;+Ru`wxVhem_SWZCkDwOe6_e?`Ds z5tFPHZ=UEqt0O9(cJMYC{$+Pc_xhICDHl!-TMnBZ6AH8u8COp-bK4;sZG1;BcZcue z{%Fz1w;vlsn?A-gMK#Ioh;}=7_rQik7xOS{q5PEcnDR`&G{5M9lOd=<1&1V~w(%*Q z(iBI_B6+M5ToJ8^RA5=Jsxo&X d;OFwIWdgQccuH!4e3nBR%FPYwg9Zh;+l4kDDs$H9 z8>KIA)?n6`!RC~$7Ob);=pm}+HR-K-kB_$L*J|N3~3c<*|VpWOqH@O#$T-N-S+m%TW?pB$?YxeEjCXI;>7n>X=~;R zC%1le)o@w5;p~dr=cf5s+f3&s_=nC4JzhJ!6tz^fM?CL-pL(m>sqOS z?VOYLkFU*MaU(m+DsHHJt=T9e#)PX$JL(3p#vEqeRmTR`vHj>zX2@NkYHI3=YHqs= z)Z*>^?6uS*)qT}c9pp+E%3bU>Ts1Fz?jTzk(xP?4$1b?=+@Q~us)}m=?25jSNdE%= z;wNvPO z>f7w{KyOnL*>1{?9Ml@Uv~x;lB)?@YM!PqC@g=3Mh5bf!eqvfNApdUlSWHbw?K#Jx zPnBW{TUTTiWv#WRYGk^eOkSD2LJj~9`rcgqHu3t233_Xp%yV6@_K!A=^`Ank$<^4q z1fw5!*4~XbH)cc;Xm?g5f-VI+u4IQk3hick(ZY`Z<^SMj)97}+I%(&(pK-KXE1ZSJ zNp)5cYiYHF-oBjAtnSuzX)TfZh~n-DGYRwH$}RK9$cwgPRYWQR(1RQy42Uw-kKg&^ zhYsy}#CaIt8oY1A3~b=W1ODaq`V+oh?eZ4^V%tO(mq zirlpJt(kX|7t7y0c=!FH_#3A;)4g49dwbuWMaYD!v>2b=+b=EZ5?s>hLTx$Taz37m z+3I8YBkjFr!emry&tv4X2D7xZkLu$X7qf{sO+<4m^N#H2Zl9-Cr$(m&RbQ)G*o?Mr zlQHmJsJ>Ko$^4ehURCwu7~iWspFa8=Zt>3!%}LEg%TSNu=GU|(zba3iKX&XQRuP!U z+Is5jxt7W}6weMPMo>vkwa*+;AKP+eOO|Nl!_J49Z(zOFy~%|Ug*o=9GU3ux_rRFQ zrd<;nn{7+4(zH~xJe;~~e+>UnuMQ7Z4K|>+v-hyMIgk1r=T^+0C+Aw-O0MoW=f0TC zS1wNbp`P#*dqqBGB_?;BQqVPIv7a^gt`042XLorGcaD}~WFwY)E-wo|qlE#>RnCl` zAy~HNiRM;){g|a0*uqbLnJ#lfp-ju8;%jB5lUA*(RnyB4zWKhsWYBrRxvqSzOI#JH zlWLdpRW*3cwJE_rrzVHiM?tcoa&I|flvc5SJ(+izPDt6@+5NmW)iwpVDsOj(NghYq zfVb8;1QbMVdbJ@Hkxl-ex92@ zH{HSPnC-~D98j>km{WeWj&tj>+4t^S^m+Do>foj!$Ez}RmAK628k#?R$YPK*EK&0M zb<68q7bPFp@s`$%r+S&3hkT308)aS78AxoBwYff4ipg;~_4V`AsO>AO3TnX8LZ zfe)5$z7H%QeN3({3zHho`N3EiibEGK#*h9ijryF2E9U>25049X7c*-tf3$Sg$2HXE zmJJcS$aQ$Z&tUO&SF6-T3dJwU>KK2Tm0(#7P?QIW_3^s&#wT-#+dxwbVRur7tL5Lz)-F-K9yo~`qoi>6ewbRi72 zwv?4it-@UcjxjW+CzF4v;?3}fkOqJ^xPvimg~p-raR_oj!a8ZMn^$(jiYps@PaT5A z#V+%XSo!wYh`y=Lc)xuOW#=n(DOL~0_-G?LRBZ|y-jLC_uT6|}*_6?AEg~djo6d)W zrG`d2jyge;3UyRUC`JgDzbB%HR$u??Xm~hY@5?ppx;t*AGr0U6ighxD;+I|*D7R}Z zXYxclj{=p+h)HW03>M>VXMW@SdDtNs47LfjUT80D0}KWeg27*B5vgt_y(1BOBRL6|!jcfafMK^QM@U;Q8>#os0Ly?ylsml2Bczl-?YHd3@Ze?i^^ zd)Hn5sD_Tl5k=!I^78VAcinF2Tc1ArxAsl7H$s?e6P(*Yl2_C)QhDQ15jYtiPX;qN1Ro ze?Ncv=^o_ypO(CR{~ner7K0GnL1=0mLHt{{pnAbo{R^H!?p}7MJu&XyzMfcbV=Wy` zUBll3|F2vBY4VTgWncHZCRhx{-P_OjKePU~@PFU@e+vF?)BZngYU&;N-`f1ITYrlh zA_Qaqueta$(Z8=+pFV56#SroDw`RO$iS&UAgTeNBo*-EeLq^k!aXX#^{Zu{Yd2}H?^jLRE+_7S+Ln6~oBrqL ze`er+X5hbOAZTq<9WCf_v9XmZ!T1q>^l8JG&b#!IJuXG9u_?({xXh@DVW?gKrb6ZbHC-b!>j+Pj86*#<&w-Z&ey?78! z>8Z#*ZyBn9q^J{3f3=&)-Qs^Zwp_-ja(RupiD2V-3H7Hl(kKskg;iegU={J;gHYK- zLl3Vf=3(XQ&r^c>cVJwKq-bToO2elz4X0l7dSZl;bmZaPqmP(Rp>}B2qCC3#PxDEE zw8W?^Q>ZMy4zD1wPGR}J;;TsAgNi>5?oc8kbY<&>BDIR<$;vQ1wBt+toXF2z#DY6p zp2$-TR4ILbk=8l3#ynEM5NE z$HFoX3GXdan4!6m8^PWZ%Qm@BaM>ve(+iB3@6n+c{($Kgdn+g==~(jp^J^Z!@Vx+^ zTbY^f(KT{y0YfsXZq{ick5FjLqKy$!c6%7oEX8yTyKE=K{7&b@^M7S;bMGY_H5Pi_6Ta#toM8 zKK;MU6gsb^^D(*`wnwdu(3RU@QmgoVuqmn3pQe6! zgtSfS$i1fXp-KF-{<0|t%_>v!laKG|8i_4x?thRxV(r=(lAC(K6l+0WlEV53CSPE6!}PCE7c zix!vYwZ*Xfur=oVK2--5lJztG;vFGLvmfPp)@@pLH-L=u_o4#My#ElbkTid>T%CB35t1X7cIsZFdrw3>`HS3uC_E^ zGEh89;y7sDHL7lDdU&Ozw5z6qT$^O+w1@ZgxD^Hg(Z%^>n! zT}HW*HGPB>(_b#TXuiJrJ!6PNESB;*9h$D2z4%p7B_TEMi9HGk#+1eHJO{-H9XrW} zc17_~i;oBD0(49Ivlb9oW-3G^it4`kY$?+haO1sf(hE{&e@kH=p{~;2bW08riW0k~ zasdRIuS5O*r*Hl8*Ddii8bSXWM1uepG5naRg)t+h=Lej=g+riZ%CbP(=nYxb6p)A1 zjmSLlr@f)=`N2aYP2CJPAlLz5L!UoiQyT3oSHO7Wj&9Fqe>TK?4dHa&&hXFvhM7el zU}&#DHI{ScMBdxC>G2{L4q8lM^15~1hjlxbFJ3WLEl+i?)lw#nPW}w2l$C$7>#0{8082*?9x@18?Xro z@A5xdQvS21J!RxSDV~q4wxZUGgCaJ3x@nVAahO(qa)cBkjBGyllDX#Tp?v_m zXU_=fhQpX*?lq;NDbL7K!Y&b9%(G*QEB)O!&i&HTDkXGPHk`5ia@MiEf1~?vi*eXz zbTTiqE2Yle%?-%F+>1@S|K!utJh2Y&%Dy$#D--3dD1!{u;Lf%-P?xw)N^^sZ&jFN7 ziol@Q6gGJ#-~)7RXwQ?9_?XHK8ZKLOC(dQ*9^^XsjOE!y_sby{y>h42m6W(dFHy&) zonB4P3^5m&RTB-Uk{x+QxX}^Ic89ZPnN=gZKRs3*etbB1^wk2k`5xZofK@23ye$1` zRb1QxwoLubcAJmeZT}ArcvWkdq~DKwbYhdC)TY@_x!OY)$D3x95c%TCDR_OFKC&aR zE*XolCywQv$FXz0Y2_J*eDlvC<<-_JkK_3zXXS^IZ#Vn9e>PmM0(I+}HapG;d#5zp z?3>QBl#^=aGGZ&J*i3=t6oO6RPnv8)b2Ew_08@cG@oZ?~yZJ9Fjav zvoV#EGYh6!)jw0>UlVq|rsOwUJw#BmLSCWVr>}CAN4*=8Z1bp+rb>Xjo3FqcYlwf`BGN z{xYT!*ywO!=8=59$C*Zkmd`E7zC=h;j<-q2=e1YHaIZ#IIT@fKM>jH$s6u6L#zWGN zb@|WijSL+WG*W&zfjNk#pok4}$`#-h9Y=&@UUj#l>z$sEj>?hLfa%^}f~_ty+?YK` zig`qFpU@dfzrA(I9yOxN?JF`IbpSpfF~Xr~1009mJD)9I&glC-`C>#-CEh@fJ~Iua z6f^QL*Tj>r0*Ch&rAGHVdK77X@-T8IE?CskZesZrV7b`Bb!!Utci&%7z8>AkD$MiB z2=}y=TNG%*%6mqZA%hfbd`{S=2Mw}H5lVN2PwvVPcKaN^E^8#<+Ev`xk#~WSN%#PI zwr_ulbJl8P(>Y03&71?gGJ>Z}LRSu>3YH{rz7MlPMJd_*Jbu;Mq>JGU_+|7UxZ_Ez z<|E^WgA>KE!;kG&fECjf+m+P%(lv{oARmG{_~~)f!Ck;kU>8ucSEI#_bLna<65*oc z(v1HDPR9hwXtFt|V2!RQ_vRAMo@dXSyY)%hb8VXoz1R5_pHkdCorKFgueTW*u z4ccFM6h2iU3oeuH?2@{(!$9-E^mYr%cm>}7`LpZrU`!N}r|0-T&HUdpY4Af}+|e!f zBt8kP)9~s`AM&xhs20|y+n1gvwrAjE?!cVRHnGlx{8;^tGOOxx^Eq^qgiK$0-mb0r zk(T+QkeK+#^vWB-gVBdE*32qJ1>J0I)NN+f$e!U79|$}Y80a8X6dnEo+K|*071MgP zwn%~2PwqCvut{CrG=kk}E{cogV!6~ADaK~*0KdhkNh|CE8NVy4n%r&p!Ns(mFS2tK z_!!OWsgx^^4u4PZ5wm|J-T@UJv&3uD%VT8OJn@55|34I{K|p1LUu812iffmCoA&%A~kjbkr}@4pJL@m*4=&^E}q>5P{p z5g3IkgfMT`-mW#KMTR%mF|P+N9oI&{{RN?3z>#*X{CbbkOQ45?ugiX1nPry93%0#C zA0sUr5fb-I+8rS7-I+XyreHa)^wFs4Io})3#`82J8@_Puse2!f`bbE+`o_#&ZEUT3 zkjnF!X`8{qsxBQ~BUzTjT875_a#qa~F#cr#>WSPA92xyOojr zgC^z4t;Z8hvrfxud1OqhCg2PaWw?^7*N!CyC7zNjri_U{Uyjzh8>H8v`MH3F|3d?? z@v&SyZb%2JUE(hVcJB6+vMCt>6;4IIlSFa}Fg@6!|066Ml%>jN{By2VA-&AGKv9KSj! zS0Ly1XNuDjk9yKZq2O-_XMOvYr8O3N?qxc0f6#%IYA$hhRdOb% z6If=4U?|HQ3@?z2k5+CJ?U9*U$$Z}4ljb|~Cuol)82ldRm+tEA-0UXjt2}$&Pxf27 zNPUDz$W5|%i|`)0LH!9rWM=b7#H)+hdZ50M$T42ES~rc1;F7J}Gxobce49SHw>Z%zjd#B%TlYw`UD?Y7>hoKuS2CvnSNA zb(5t@wd-ZXhaf3AyV~}WSDQBZ1eN{VKtSIdtPN5%p?%0<(Q;xe+-!AeaWc8F+FVDRx&h3e4VBg{C+;eZ3AowzNd=IhkC*? zt0r^5YRjhcS#&(V9}bR?DnSRJ0NxvzI0I;KpgAO+K+Ng~%dU@Sb#gStji>VX{A z4S+y!iDyJGUghHJ35IwQ+K`nV0>1rfaNs*N!-b8ztsuTgf))}iC(MJ|&}5zww_wO` zyN^15`ApU01~7;8W;XT8&NM66DnmWHQ5AdRN;@a7><-!yQ)HGaf9mK%Q)^Pa;dG*D zLTt(<`=Rehc2QqX+P9Op2&+*5vnsssCf{jQd~HkCTvgNKOGw2YYk&EUq>%i!C_WwJ<{8_gqlDMImY0!>IqCfLzh4(71@*Q=)pfIh2n_J%~U+(fUJk`-G%~cTG9%#K~{)nD@$Pp(tis$%$`D@g$#!rsL}@ zRvJ(tHhkt~xw+)|Jou!qkG|>r46ofLPmVkzT^OhlAH7=2&O`Fb2!m+Q<0qU(pvd)u z{h$M{B-~4|oz%c3-uUqX`cOa?vv9L=CbG)NL}rc`&f$tm`-2O-5q23}g=;2QmP?y6 zkyUnY=pN*rZhR(k<%#h^s_~#dI2xv$7J(ucccb%gP{I>GaDms(meltL8?3yP5Jn%M zGx5g6I^E-wBpZ&b>71l|LuYK(J|QuweOWhmgAvhKs>Cny;}>c5tk92d0VIsJ<+s;Z%{A2|FGCiyX) ztTmz90eZKt#q7iZP%pcHZYvleM7v&L6%q_j*9;+v*!LvOuMZc(zEeNpPZRDY>}ZRN0Ts%%_U4E{6Xpg(C!E2-g3!WebfvjJ){YtG6Tg{J`t#Bax2o8Hx$GlmkSwuKu&2F{6NP--YCVh8CbVh+BMY{SIQp zQU|1H!0iM_A-m1Z@Md%~UeMf zdkL!GLGYWDz{W@irtJmc_bMrgC&c*G$kabI2P_Cwx=YR=QfvVUW zl%G6s(!P3cDJG@80Dj!dFf@4iqWGLn8@{jDI7q%T`6-CoXcS z10n-NU=*lYD_DE`H(b}lEh^V0y}L=x=sy^S8CR~A{R>~k3p^)YxD)}R@Os&A>89j_ zZo!nekRF+RE;zZT?)7IVCoF@7^nOqBS(-$(gvhYa@$F{<%H>~OT;JlezDY#MJ!!e5 z>C92FA>Fm3S4UNEM+_wA$-OyWo#I*MP5X8>-GnnBP7q}&bI3s&{RAwLf``X1og>(3 z%|yMySKsgI)CU#`Y%F{mTA54bSAleZ4eZQK%SY}F68z0CGDOm*DcA<~ckW*}J-F6>6V7tA|ojJY-R74(x zra?4P(V0z%=#S&DU#lxZRzo?C1@3ga@6EwNjkix5j-H0o@I?s%6_)%#D&L#wGf?ZklUazdN zcjv};3a*a*Cysgtn?KW}%r?ID(HIei`!jt`_HDd~T5b`NHYT>4*woi)JP5DlXT~nJ z<;8;L3xE>}jX-5|4BtgxdJyMfJ#oNNy)s`rGP0Idg@Y0r>+rq3T~$xFd3GW0EtIj}9XOM4)8D zq6qO`d4eDVOM*KyxweZUwfD^E$iv$vqKX-;;-X?67L;WfXx#ZugS&D&l+$M&BFFk!2KTF zZHfgbdFRb8p{?sDAKtlgOlw7c0okJ zl)qdM$t+kkP~lj|N+bz(psM<7z(bvoaX`Jr zQ>Y8Ne}dZ+5L6etR>lu>^7x~ODObllxYU?4TogBflr#$167JZNNCM5a{U+oI3Eg9o z1n?)Rg9pKDXf?1Vg9PmciZn%#v4ksXF~}ud@ER&|iOwz1FIlPOfltEVtBD?2^VxCX zC!3Dhvf*4O7T9%ixsxXx@phL`iG1@n9b;?y#!=}5{)rpUWd*e9a}V_lfXV3KY})m2 z^ZR=yUi}0um>=yH3Jint%Zh21&nyi5ZGN3+OsYvsl@BEps#1$q3x)>%XtXYTIXK9; zLj+L-*B6kzPxo(Y!$z}Y`+3y8hs)3r?fosJC4*dnbzS<*Ch>{|L3;+|UMv`(U|5Gh z$I0gA1I}yCi^k?#&w#_MzR5xeMpzV-9opC*Ad57fkms!nyVwb-bMh!hI zK^@hfM<|KWwfMi@KakST!3VVZJj1p6JMq8r5Aj{jh7dVYNkfA@$M89zhY_^O0?VN9 z=vneIJh_li1ihuwC!nj)2WSwWz=0fmMtwpZgH2#u3zAvU!$~>P32f5uy->TTy>L8v z6u6=@3J`&4sTkxHgKwtN7A3|-TzvHS6<&(}}7uRmczN7bjh?A%+ey7tX# z#B}oHHVp1sBC64P>94y-jET=&(V*A9v-*tMBeS*Csv#8GO))B^-Vm$Sql249@p*wy zXe0HPWT$Q_+0J=@Rr&DGdg%~`;sMT)_RWM7pxDy zAg^UX?a&lpx0#LaCKUjT+V3FOmW$%{U~oVa`A-B`x&5@nniOaQV1(R7ioTMahS0|q<4t4!1 zMPB*wNQ6BIKWLZHYecBjz1@V8rY0yk63|eI7ZT_xY4%()K90`z&P7vv66j9({&?BSuAcs}7P7hvM~9?)q3;lU$uu>2~}0b&z)0GZTH z2oqo65n9%VLv|RU(1={8wZ)eq^s-FDk^{yMdHE!yAd1)xXo$MK{-gL}xm!a;#81Z* zkNNc2my+2dR`vWmKI;d!wAapnF`WfZq2D}%F|Ya z!8>lS`v6Tocszr_Jf4HEU$*2=;ZGy^Oit2d*z<+j8Prc_0 z&k{C+ftt`NJy&29cUuGhbfBoY)l5LxdPr@m6)3># zgt{&|mWwDTprcnzf5Uc#TmxSg5L&fsp-$ogBI}>XGmr!y{PeiuMA#Trt6_SWAKSSE zH(X>%h0!o`EUh6$+6mNNsJ?o2CUo6;Wt2A1qofVqaSY|DMi zKkwZC5z*`hNA(>~wsIYDjVQS$O}o9nf9!~k+lfkIPh~q+4mV}xaa~q5d!Mx#yW`G6 z-fDl3E}ePimp{V*;GF3AR0OtT<&NjA7WA+kauL~awS9zJBg-f##%v9H>{FKGWclNS zfWtlIw)ACuDKIKO?FJl{n>hUF19bFTZ)TDsfmL*$4 z#p)Z6J>f9%fyL=eJQL2^F}R7@pnuQNq)3(JV$E$6L4kTu!H1g$Y?8Y7ZO9Y)LO3;i zAH0ITm9E=%bm~P1RFqZ$l|wZ*990UF1iof?PJNjmkq|DKaT98G-3?q5ZE;vS@Z2+U zRe`f}@!i_nHIs~9tB-#QKdcwTD2?I58J|3PU#LbEs?&yxVB@i%#Ll2q_vfCGX5XtJ zK806swWFp8iX<7&;%`6D!br@i^5fEV&4O2V9p+k%EH7~_*-V9pYD)BnD$dKXmUTCs zXTcmT?7U9XfzTs6=4U37dqTuoQ*aXQaox=kD;GQfsr0k%MjXvsZD(E;h65dj9anaT zFVb~5a}-0T6Y(~gwsV1+iXy*8NR>I9I&hdbM=$5>L6rWt$yBf+PZy1dk=eAY%z6 zKK})My?E&3xu-@F?nitRl1z~fyprp}*CzTv0fp2UV>i@_;e+ZB-5dIV-ALi}FuBx0 z`0iegYj|B7=+WZUbBiyjbgJq#+PKXNe8FX6N-%4HIAU6=dR?+CxaM z=T!N$9*|alK~*yBV!N1w$@k@%u<+jOz9|v7n8n*tabCG ztALd76CxA%o0mp$QC#uRFUBAi!axkQR^yAjlF`QVJtR>-k#&v1Me6@D&VRUPHPD$4 z`?7=b`cFK1JMIU&fbJpS$JQF_k%c9SD}DY;NHs5!keej*58@JyCvvtgxf{L*RSLaI z#r63!3Mifv$QHGF+c|vQ>OJO)ihnu#aWsj36L@VV@BGf(C@aoaY5Gja_Q$-eJ4b$; zW;XY0!2S0gW~Aix-rAQpcDV=^Z>88FCku~m*8iBE?*^J`Cmmp*ArKf>3pL(uJ}Js6&K-N@$>j( z^9cfzd!6kl3h>y~I|N$iK(1~FMF^zYb~KAyiy^r$47ftu{*|pVv z8mOfqHq>Jmg=K#&Zjv8fzX!|wvXRwr@!a@$aPyk|U!y87`=!4My%UnS) z%*tL7&~QYsAM_=X@!jyC!PpW@0b|;9>jJsw=ndgmCSCv{9~=f_Jv^aIlJ%dIW;TaW<|fUXNb(1i&s`9X1Q*BW)~7@XUk0fL*oyi1|Ijc@u%(dS8@hl<127DF@H zheMgyv7frBq;E$VPotQnLGW)laNsqb!|pzK*d*QJI~`TuKn9d4TZ265IWJlx(h6FR zqKm@E?&(CNTNkUbkFK|lOMZxv30L3_=Q`W0EeMOd+3(5icw?C*qIem3_7EPkT!1&E zUqa?{;^&ac7N9E!Lrh?&;oOPj8V(|ZP+IgBo$;~9nZO9OXXT)c=Fo9|3X5kPvj)MU z5NLk$pD==rSAVoFmPehDdP1;j-r72WXX3wSHF?2-3dq~Iito{QsgC&z_RhD(9f{K04-k%U@yY(5|>=;*i~ULv~Yd` zAnWz3c5Myh+iQ=H}IYkQ=asPHq5&zVdcrGf$eg;w}(lbwE(8ykwSuQ zzAf~cmv3o%a{=id96yKG@1k7zCX^4ipL*T7s^r0}wj}7k6fNbKg;%OlYUsAeNu#5{ z>dU{N0Up){a;GBs1>rxZ1^bb}AQWkbjsJp5nO6b%vPE|`l(7hZ#)hq;3U3l8fgw(k_`RO~St-Pd z@uqOKz=?!-%0xmOr5nkY8j=}4Suei$n;|Fdjwq3P#Y2N|hoC-w6+e$J0-wOeqVB0B zpZY_`EE2My7~~bgW5DY-HF4E-BTu;L#iwpo@kGxAD(u~ga;31n^22`~e~(4lA}{bh zFNrRQHdHd`@*>35eXb$j*(_zw_md&txq9(6=lO+5ji)Dn z*(zk#j|68}@dwP?LSAsC+D=jjsKYlyH8x*x)^V{itP67<-tU~1t$AnD16$XX1C1i$ zixR;>2a~HHW8{-$@hiz=&-URtm<*2Q4fk(WaOC}qgYP^*^VP$l+k?HQrV{4xL5?|S zXSb8_$vhmG^15IKaN;EeT0$q=X_G~aNGHyj(DT8N^;&Ud{F8_c;(iWH!E=!`B;^Io z12o+~3XKAz!0>J2@7G2Ie$deHD|#y@bDfS=I3ypx>d;~=jti5T<9%lr(1%JTHu{63 z4YPmq)5U_km;n#~F7T>b&I(RLtUh(otH^#z%e66t<6Pt%8?X7R2~3Zr(==L2sNxfz z=Lj}*+iixa<0v3F={D%e=wTb2ZJ98{;PpLIrA2xcZWCWZ`5?_$N>wsEt39=SUz_Wl z{>0p*FO!{_hy-4WYX&bRcvE>-Y(~vkCP%%1w3>o*@5f?;=2u-MraM;+q^ub)toXFv zfM?*t>6hd~e3$!{zppsuz<yF#0&PvXJ0Cno39z%a=o+ zq$FxjwS1f!!J;yOEM@SD2Q!uLDLMi_T*OF)?8DbpCPEm<6Z#qELWa7bmdxA*sii%+ zw&BpxnS-DjII#PpteK1=2_%9Y-tYof-C7tTYFJgMZEvAaA= zi@zEe1b2=I`snLoAUziMl>#g6|b1aB3+HH)G6bBp}{K>ccy}xpSJ){Gm+f zGRL-y(o?XiWWmpyp}uV5>oT;-tHn$>*gAw}vb+IdWnZJx(dOtnzwaC@e;N>wn-j$X z+vmDc%u4+0~z$;`zu>{1Dcr(etvKon9=xoNzTybc+%yZ&>wl`T}oqQSb(q7VI;TCn2mo24{8HADNEVOV2x;VqlEoyxnHj%Q`vWePu8DC zAM&T?aNa!I0CzLu)h`6Iw-7YZKLhOn&L2OBd<~a#`{@VH5i(hD z@b{xL$7^FI=@f$a=FQ=%`I|{Fa-TCL~C@;-Ga)Ov>&%W## z{0#3kvOXHRTs)`BcdoBF1e$cab4FB(ID8R)u(ar0{u)sep(dqaE8E|*melI|3`cIT zYp=zfPkrxD4K*IaA6}P8ex~E)Jo}aVl%;Cer=v5k)~WsEvXa8(+{M+&*Ijjn*~zGp zN<GoLlr z$yFS2LFHefl@R^}{qd&sVHz`ysbljUxV3WEe=BY`Wk~kiMVHOSoHG~3V@j6X(i!6M z1czY0`a}i3o!-K`(0wI}?q*eq*ZM6V`~>z{;)+)xh17CZ)A6sG&(*Z!7t!lrm{c(} zTbD|4(m>Gg$+};zG{1UCvddptqnPpTmRU|EE~tA!GJOHs_!DSNO7j^%mlr{6hk)*s zLC}aX9AXI(jY1Vnof@I4K}Y48$yfEDZubt`Eym&JZ04-frDUvjR<;w2Sq3I~l za)|xh`pV}%Ogg*gXH(dFSN6vOFx~|`XTz30uBO_D=RC4lWH^uC5ZE$x1jQSWrvi7X zrGPyFt+u4{n-Em6rafW=LT~*N?SLp?;JAYO#|!A2d^ZYKz+CcJ-xM$TbI4z+Hyf~f zP1cya94cdgfVidi7vGKEJS<@XR}&`$adJ}!659pY)cky0%KKATuz6Vc6M&76{r6gO zIKXMq88z%_XlBPWAQ+MlwBL(uQ=iE4oA_9BiXZ4yzy+6M-r^|8MHBs%q{1034MZ4v zmII)G`pCLdHn^E8%o}wGPA^ek^PD0JEBY3t(3XGnc+jT|)Hjjd;i<}>aMJ;n(R+)` z5#g5!bJ@ANoTLKhnd`0nWM-iaK)Z0LCUrTFodTw*m^y#fQ{lw}cnPliO?x}$LHT#* zbgwRkiVCy@MQC=%2I!}7-5aLLlKw`Hw}9V=sO1sn|16n81Ap`5pQ7lvxU)0P|5IUR zfUBtf|04f9*A>fpoZ$kMzoKw67Cq2`7-jyczt(uh0ShQsTN|ywQ zJHFzh$Ct*zjn%`%56qxDdTW{AAX=zJPqR@9od4PRkYK!$uZ0Lci%Mrg+zjYvK?xjsL0`V&N_JEXVPyKW1Tnm#jXq#)!A6eAU7yws9pTaM1Xf~i z*E>0)MmkGxMUkj7*5zUBATfUzaE>soC_u zzt<;;!;r*7zdI`jlzkZhCtzzA@OC8*VF(EualN`;foev7r$j=qt8B+xmJ_(^fO6G7 zChQ&7%`l;`F@sVB;M|qhDzZc-3eUdcwn^aT!WdeBxG#kjQFHX%cjrW*QKe^3dZsSAg6A@NEy1&fYi$_OSMeGW92Y@@ z55%Sgb`3|7NDW;q@T(%zawKYXL-hognqycxr5zhOh!)s=e!L`Wty>toT%4IldJO0M zis5@976}u-CiveoA2t988H?rw1k+P6YO#c&#Ui38V9hv$lQE0nyJyN$mZ8cxz0_F3 zE8w+O_VFt|W^6_*?Gu=MND#^o1U4Vq$jImF!$SX_1<(vk2b|{1_HHsgPQC`XEOT*0 zD1U)lxssIuuBxy2lk(Y&TNhpb5Prk6SfWK=7kW&Fy%&#;-8MC&KIPjg=w#%Rfr9K6 zr$dOdt2`|~xZpj8nkDm=X`>&^FC(AjacB*ou_3KaRt_K=zw9Xu^YiAnJx+*KZ4cu2 z+q;w#bzcsZsYHj6rU)E?^0o%yt7del+@q&-(AG)V)`r9LbL00aTqam*sQGOe?&0Gr zxogI4Yv20&E#XHS`*U<@9dS;6+Sd7dMv;tUehTNu1UO0dRMBB*igfH=Ap~-H(fSZdP$Iv ztLYS+>L3;kB7Wb&*`z+GxbMgn@N%I9UStJVfJfh+t8Lm)ApWJY`CDx>jhVJQ_F)>| zfN0E4?D6x_yr9k})Eo+U2-FLlQz_m3SW0_a!o{_(6nXf*}j#P$TazRT@4rz7UI zXNo%Jkz)5KHbi}`v$}^6vYc{eblJOJOFh6j8g;0qAK}Bdk)aguT`3B<8kb7`oK8N( zQ7ywYPwXw#3QTLuF$0EKzOrkGnY)v;lagSv*l}T}#!Nn}>ZdN~ht}I(3zsIx^4M|_ zPyg){8+=oT?ci&@S%&sUa31hT-<5<|_?|I-KO_$U@{GTvrG5zjQ%whl!}={r+(nSq z<#u%dzKm6j0IwF$gK0S?Z?!i|le$lduTIUSX(QTS`zAA3>0Mx6@y};@VQ-%b2Kb(( zf@Oc_q|pP5?!O6J*PjMVDPFu6Ur}J}6s31%bmtsQUr={P-h)L5-Xk6NyA?NzxQTy( z>qfu*Q)B8EK`MKbLnX{_UUYX<<~yupGb@-$dbv!_G}-)?#GlIG;b~#KbpBuO?_Rt4 z!h7ac12dxO12ckFj6cbDsU&of1WMqiO zzoL&T(k6Fm?3_Jp4%?c%HQlq}We;t9c-dGIyEix~*)_x6`e8;dUSxiHpubEUFf(ni z-Rs@#`PcREu`6;kOkU`cT~|LCx(KG}_yfF#1`xkkO`41O?5WU~ZDl1+W8X&@2p>Kj ztbqs|!$V*jF-ma<=a#St<_V6C$IEzu0(KS;txhJ?~Rdh zl%!QM_&V_&oj=4ljBtRKD@Au zd%#t15?Vy~2pybH2>jZ#tq53~z#A~vZq=YQ;fBb=e%U}R8{wH7VBhw;J~m+8!NgzhU6DmU-~Jecordx2ZlJi%<4Cj0s_b>QSZodf}RkrmBjdT{};lt5dq_o?mR zS>1kr1m1dpdBXpO{PxB!WFoxQZH@bb5sqJrhP zEU|JQ;H;NVKkM#P<;!KRrY=vL9vQ%u2oN>-a!#S)myAjO+ zFcBfiM%E){jp740QNuTS&&FpmnCoA~FUKug0!P`K&H3sJ0D@B4WhKZ##Ac~JeuD2S z*j&!|%gj+a+86C5_&;mJ;7=Io2p5f#~GVits|b!iu~^`pX65-y=DOP z(y>AR&V|DaK3?n82hcE>yWjhJpjAOslzk0tYM7iNWa>tP!ep_%>9+QnkQ$ zi7-YeVigD|G(~+)m|zMqE^rg13%*souUi9;KLX0D8u7Nd#zlL`5 zhl^#$3g9G#uLovkf$pzC_S(JCAb%z|c3qJXubX+M$hA1~B-WEBuE{ z8-JrrP{vVQ`(avlF@yQ670&M;gG|5>9e|VW-GDSHpt7uSZo?Ks#pVlFp*=x?_X>|T z_D0Hv$&DtO9GQ`uE8l+^BX_+3&OC3x>1i0U%%GXlyG@L<%p`N+Zbj(k5AZoN-sc>D zQm7NzndBwtnu8K%bg5HmxlS~ji6zg>y}mZM!$~JS!3fUJaQETM;n%>fwW0zZw?Kxn z*Hs;Vi^28+=Rvpm%YEIe;rZ1mIvV$+N9mP$eLl z{HfO292v8DL!-WB$M-AD@6-MXw`Q8VfMh<;5ht)8dR`UvF-%q7vflfdn(y^ZRcZ!! zkk-xeZl20tSA@@&@<8xEzWiWlGBH%%Zb(}YiFe$D05t=z1o7LVkQ+-K)K_yXIwdj) z`fTZ4$Lsn@gqN$-0mO!N^$^l$==2Jypi9dUcSAZX#V}3dSy{KR_IU)YPcY0KFxF-O z-L&l+`bx4_&^x*zm==UxyN+*)`3T?_foTQcbw&6x zfgcU#t`j&M9GQb7GvI5{xS1S(?0O4l-{Z+4mk8Q&&ls{xrk=X6oMPuI1pNSb9mng02$m2$V(Jdc z+#G9^vR0X*B6sR76z!&*S^blv=yZ?5kK?wj9h2aVzrk{!L}D`Dd@C5IH8JuDXVcnE zAmrL^2yeEiK-yYRVna4t!3`l_x<>Z*5Wnu*7IE)f>xnm8ews%45al`FBBwaw-DkB) z$V6J3p{jQBZb3iN%BU@RK?M_DR1HvO&tf60$PivJ zm|uX{FhOh}5#(4fSD5*#&9URs$0qlaPfd|Z+c)RV{O8Z))bTau;4ZYeVjkgl$62-Z$-3&-4XhZ}Gy7*JSJqJWf zI+gzIxL`I%OorBXS=y~03iZ@(4PN-n2{gk|?${n;*CSkiS@c&ZcYW1Q--mTvikuP> zMM;zuQs-EY@1;wW+$-2Kjn6V)OTkESzL@~WP|I1TF0UEVqy0%H!oF=*;1#lcrYjpo z+6H`Je}yX%Td<+Nli6SI2AFw*h6A~?ieT2dfC=K}ff>ial;Z+^x_>>4zM@G8=Sq~_ ze)V5$$?wg}^xV#jb0fp>lAiw9b@m9Dn}%kg`Rxb}fy=by^;@nF)ijjrjw`S8cZc4a z=Si%7?BswZ!0VZR6ouMgMXPXv2PFO;SfVBw_Z}Z{-jvRT?_og&b8q0FH|D&yg5_Vb zEhO$ckq15A_c_+Vhk?rHXnhRB1Q5|sbbej-@PRE_Rj!YE^&y|JLZ)dUZ7ARL@~bef z+4JXU%0a0qQD$t5<4!M#pmz=Wts5%Tle{kD`rQ5^G&cf;!_s;LG=$)}U;!c+f^QHw zq#@i$^T!>@|D|`hT-;vMM&mQ;8OuPyjDU*Zh9Z^;ER_z(H2a$x9-|77c!!Pqma(6l zc4|a~;e(Bx&NxKIb=GNY814jYN2)2Sq$k6jGLK>4^e%OZ=jmh4|MtZO3F$moQEpCRP; z0aI=hIKx!k&&tu_6pZr^^|@X@J<1f#DDHuW4mW}~A;=P(<@FzTZ7;*#fE1!o;nX#4 z2@+cQ?3-8vr+bu3ufvt^H|VyII!1@KseUG#WPmcUpg-Vyo`*xut@Lv|hp_kZg5hLD#=? zG$#VHe%7hX%8e!L2E&S?kq=4LFcO;KuiA%urroW~8_YpNKcM@e7Z77gI;rvz`UndC z$(H4;{kK^Uj^tcc+bVpoF~*0H$FWwxL7C@MHB+%II_uZL%DIv52`+ZHNctt22L)vg zCVvzSoh>40xWUOt0TaThKrAB#j)=q#M>1C3{`T*ITmL!m$!>bL3v@1J4skzXZdp-4 zC$K?+aWqF=z*B1lsp7dE_GV)o&^UPN?sJssl_F|(62sqYg~&U^{L$w}kdJ^1TEI8Y zjoq^ogFXwn*FGaA8hTH5Y(+D;3(N4Dmr5?X=72b9vZ*Rg5~R&akE>hhC##9cd|gi+ zJNL)17b>=DBsTnq#N|3@FEql^{&2TTDtqqhb=mf{`wv|@kLCHso1{_9cogNh}wZr=9H(4kAH&;@dE ze6oOn;Fkj6YY;cX%m1}s1B5UQY|;p-VWSz%u@f|s1$`YQ;5uEWw&{u85?8T^ayJ0O zc^-CXtS}mzZdA{(pJni0_|mg7b-5glrs+T}oYQ1F!2#v386^{AO6%dliPv6^ty{;6 zlB6Vy*dOgM$~1iP;Ys87TJgJ2(S(*v#m!pGC0pdW2d(C_004>1b6EL^d&g}DBlpeD zq1grdvL&o>uDKv6XNBf^CgQOjZ~pu#H{}RY0Z#`-Jb>FMg0RLsF<3TV9vJgq8Q5SK z)@>J-y0C(QO~>lfTT{IRy_85-Xie<2^da&eAn{ z--*~@Z@0|6*&>=PdcEOXdxP21)Q*QxVn=pY2op9de+jI)ws2F%8a z80!IY;nt%AmS1oJ;|z9>@sS6rYe{JKY0J!dIPqyo#BpJS{~w_*`T>UzoPoStz&k7&rx$C8IKaspmDXL z$cB3@mNL_qwkn+4^91?_mbTW7RNMJ}Tt4FPfd|V?hn0)b;WQhQ%rEtD5>%EofO+Z4 zPJ~_qmoIRl=2%QmeMSsUFzEQ~+5aC?!e|2(K<=;!|EK!|+94Bj8p&|PlBY8cb>yxY zjC+>plB>c5^FLd4ClFZxSiQg~Q=^^g_tP31Ab1)=)6oy3vx{sFK~8M9N^OPtodoyU{=532br+>;e{_eticu0!*z1@i!d(q0qo`6ySdi zsQur=YX9B)u%3Nkyvm_2INk)@xuet)gttS**2zzx?8}L$w>3FNl0~!i5~}DhfA^|D zlO0AfCvc(n`Y+Y-uGWX0rHs;q8;)e>++Ak0iO@Q97TS{G!=YqPho(B1L`TX@ms(@#f*U&I~n__I4gx)SwYgW^qZ&obC4hB~5oF&`gUp|+~1>hSJt#-_#(|f7rxLCVF?s)`pQLsSQG_kEs|*H$&X!2sR)pqgE@X*91y8Y* zPDh2gz^>2W19!LJA4mQWDiijN7m>Ll6P2#!L%ehy0N^&9ux9xx#@w5c|In)DyO*YW z_%)QHou9Ypgr@lBl)y>!mCwo%KV%*@YVNLox$l@Ihm%T-1@lzUg2ieSWankMwY_^M z@oI2}FgSqj3=D&yDrLTjc!~bGLx4k3CddgbPP-irPIrXx+mEpR1K7_Lj~Yq^f1qpw z^4fq-Y{Y#i7bIR^oPDc(0xb8dnj<2zS{WwTDYIJG=B=ko)qhEuw2g%=ay;Ni~JvPi)=V-6kUHx*n4x z@y;F;_V^^>8{DGGDocjLdfhW~>u~JKQRD*#t>P3w+3gR&Mf;ieV!ucQFX8?dENa)3 zB7S6cWVz^*Y8z?KH$fhO#4YTNX{@+B31OBpfU5q1&sF|4<-A5l2$_0eRTHtK;t6q4 z4f+o-a_z(}Y#A4S3&?2z@TT&}AXU6(swbZj^K7GGH{)SVlF<>$x96cQgQJzsGQCj2 z4jD4;7E+%~=(gZtIoa@~6!Rmmhr&r7E_!q{yB?7PchkZvqp&<;ShqY7x;s;A=MwpZ z`xeI41=j~#l$9P|(^mAG2ydsOQJ5{xX{Pjd3q)@B4j?EFtE{X0xu{j&M$j9%APnFU zZpq9Q0n_%YMHU*Ta%ZP1OW>sbs}SmExG`G9oU&iH?Eu19VJ`Xt90SN2ak!Tm+VwBFF zVl`5@-J3@S8oqSe_ZdlP`zjzx(*?1z+yrDhd*=Qt{cG%#TbqBNETBTTuPW}=6*QGi z{KE;lRxY>3#9ik$bzl*J(1tI%6IxUJA6VQpq`kb0qntb8dlrN@o3kGVaFgXJx*Np( zQP7rb8P%HZr)HzdIyc+rr%)!mDy!55_2-miV;8L;sX?vM4z@WfG!>onMO_}bBVymx z454ki8ZKY78JHcvSO5r@r3CS32{>Iaw+PQ2wbToby(=!nh}$Bton|0rBf4D3ltG>ly6R7} zN*vv)>JM9`LLB(}QFkUq^nNKw{1c}UAhJuhp^+AQ$O>(ri8&3x-J4wJ?_u0JL8^@v zg5sL%Kow${BS?*B;j1{M=!Ui@LmZHkTN?XEL~TregN>jezI?@$ZqUDut<{aU=PlHj z33?;n7ZJ|Nxss|QefY@caldTJSW39V(F1N2p)CcI4xmr{HYP6&S(KEr8yOwhzfhNT zE=q%9g^%PORd}G>RLqx;NYJF&Xwo{st(Gpl&(!O&R)vtX)(w@QJK!Np#K!Ah3mlXc zSH(Du2f*ld2wnjp@<827qe=eWF!!=XLOplxBbgb`AN$TR)-(Up5kMkB1nyup3iq9c z$A8HYlw;TDkNm^tSjILkVd_KZ5&G;YaQPM1+}xCqMCiR5|7qu=t7wA>upGHwd^8Me z=L#IFKVYmA{Mp764HbA4>G$_l4Ov1+SV2xCE$Ks?##j-RzbBZK&YP_U_);89UX;}H z^GIhrtXpCupJBDd4u-O#zy4CxvVzQRe;L>*aYvFie|0KwJb7z;dAV`~^hF3|Z}mGS zXulUYALue#uT<#%dHBMxLtPUlFp_E4Lit5-G z#+9hiuMOaFDFIP&9OZGF_0o>ldV3i*ScFmgHYg!R7p4?p)uD5G+%Br2UU#Bny;L;R zDd7^3N#seklcE3=iYCBlH(UF9(8ZM+ks?_JpiGOZu<*@cLS zYOBG1jLWEOa3W!;+H5Rie{_u{<@NseyA{}s+igVVBuyd1;BA+LK}Pwq$eVuSHHvk@ zr3_H7zUcr|C-UXC$DyR^uJGALQ+xaT){UUP01U)A9+|vu)V2nKN}o&x5^8n9pPeSz zi>d*;uP(x5*Yt4IXioxdD}RgAzv$2a)UHUD3Ixm{;#gy$MaM?|VH@@efwl-?aD4WI zs3l{BTUt8^gx5@s)lqgDou2r?MK55JjOvgK2W+wHmrqiwjR{6;KZ?hpf}PNb6ghIe zgf&TyJ!ZnoC&}lDl>?!{eIaIGU6LZg3!^r{;lwxE0l9mM22`3JSw*- zH0iN~TR#hLY1~nY6i__jD~bfD$yrl#aiP#>TM)rZ!eDx$PJhC}-+{1opKJ?f0~0w_ za?A4KwSP=XSc>Nc$2N z_-Hn_zy(?uZQ{~CE64uYnj;0_Hh^h+Vaph^IjO^`K$6W<_pt#lFe_|*TD;+GrR}RSQ4Acpelyu1H$+_W`WFsd zkX?&`2!2*z5Hsmn`~Cqt<@O3GZWb|{__GiTu06x;r9}Edv7tu5)rtV(6Y+9i$UG=G zP!OY|xKl$IdP#`khsbkd5XBZ4q8qZx^QPzI;`F`B>o^XZi~4>SyB(L(GE#Q1?cZ zC&^BO#?b(I{fL%Yl8U9C$ir!)mRYxmVUvbCFJ{8`LSzI*zYC%oAeIadq;b9((Z2uc=a?Xmwvy*XW+T;EX&uIlIaQr0AD zWLMt?;Ggt!l$_2?ZFYhj=bKNj7KQC@<|t1DSskLSU4NQ9BaKpyphuxJXb}Z1+F^-b z!xD<%Er23C+(tu}R4{SY3QPn6wG&(k2P%t)_}hxY*7<3U6S)kzuQGnf&yrf6m8Mi_&|~(rb|BJ z4LG7VEk=&>*II1k1p)n zdV4y7mYc-ruHhPpfshgg1ijlFKK1qBH#q;nTn@NAA3oPqLAI1$8F#S4Nff1i5TP6? z<`KDzu~NJ0Is6FTOF%XN>3UfVz{3SW_4$iE=wH2K@Z?$V&P6){112O`GH2-y4 z)&RFNO^Y`foC#$4=YOQzby2&p>+B`Z4l-4+pvL@@m-?P=N&+$KtG{I&B6kLiJgGZP z?R^ei{m^Kt1Lcfaux=q%afN*x^);imGTto&xi!IvUTr3=tvm*F?zgJKxn4$vhNdn@ zP39qaUW$Mb^g}dyg<=!x{p4F+wwBz(&Z{;zt3k~M@wbUnQZM_#5O zSP-oUS`N5Il*M1nz`#k%Jt#PRdAXX8t1uyOD=RAe5$-To|5Gy&WRorz)+%CgIfXzw z?um(<6ec4A;#%;q6&p_h-k+OP0pYg`@DtF+5yKna++~kG$=$iHFK@|HzLXoCeZx@n z{KJb0@egyAdn1zaA8m-qWnDe6el=0-59{2#B%}SkOREi3bRFU6vbjd?vfrb3$AdiQ zH(0BC*l^ZFr?5uIs8YJN=iP4@^9uT4(Iw5LvDLb&%ds@y=0Vc}oK&*DUY-3B+_wY+ z*}c2A3q={o?!70z{lkaipSwA)tW{q8`O#nB{M(mC%>z*s%7dl8iX}@dM@~PV^JXp@ z_bawoDA5$rhd(7FqARgH{efBDhPZP&eS;~t=J0*$&P~5{kKtkkuEa-JTBI#H?dbP? zIbUTGU!B+3=r_i&8_YE5vpJfPL3{vhKwYC*El1I!(l)mCa|1iXh9|N^()yu+*iVNF zG0>yW1t@E9RENaY3&TN(4W{hdo~eRc0|%KezQ$XGK=LpAtOa_L4&<==y8-qzC)>|N znr)mtl$K)+dvIp22T4iTd!Q9piEL=P91ruL`@p?lfozY*j+Q6_t492B_dBZn+)q1J zm8*FMJ0$&4Ovm}0Q%tpu@K^URt5~wt<1h{~6mc+1bXNOzx6>X8 zqkXH#Aoh|<@x7ZHerDCp&7d$eUh}HSZ3w(k|=Xme4Tx_OfHW$Qmh~H@kfsK+W}+)qte!vHy0Gyd4{hVO+9VuRtm555}AF$6)@sFPgj_YaNDEO?ePrBsY z?1i~SFK3l2_1ZvqClxKAuyA8H#hb8-%MfjZEev3i)GS0ZC~Jy0^9URGr7j zj?D1ynXOZbk3OyMa3!+Ov+fXU4F?o2v*x0~U?)~leDMpGeU6EEYbJNYL~KA28Tm<* zYUMz%{Slj{+mAw%mbe>n3r;Z^_L7i|BWjWTgp(QLeQ(sL&!Yw@WTa#ITxtbn{`7om z$bNA_kG~ZE=CR``DREGOxNS7db$Ta_R!ZL;x=y~TnScU z+^vi1-s^X}6IB>Z3Vd@f*n0R42=O*X_xn7p=XifM#0?%;UaSv?qDSKdO${!Wehzr| zzIBs2Je8oW8?p6A=bhjSk=vg=3LelcTUa}Ay%yws5qxqG3gd;HOWGDO5l5NM(H%ZG z(~%7>d)DPJe2~sO4n^$vIqt;nd2a`5PZ_dv(yykO`y-6j{a>-3OfRD{E9L>eynJ;& zPD<-&wIda~ z*pJBDnrD~0r*u2DlKTF2ZmIV(=kw+Tl1;BC{6*3)cx0P9ugl_|FBQZ*3TH<`H!3s& zI!_P!#fb5H-TK~|e#L&MM%}*lQz6-D>Ss7|{9fv?V?5es%BN~ZlNGmn5Yrb`6*$CR zAs5GwbZ;-U1oQeseg)g5&sJBS&;LwyoZTsU_%@6~_w6jVQu*6px0JR&Zmhh1CdTHU zZD=6-sq@%%>XYf4VvPm*9_&ZocX(wRq`v8JzJt8?v|<}XUeV)@rI`rYdzWb8Yk-!! z>*Y5;GYke$E2-gZy$Qpe@KZHmDg$)iytaKVCu3Hd}1RH{21Gip0v;!3x3Ur zwqTXb(QHA;j-?9Kj~L()_4Q})Q%qA63;LB(6exTE1+-M6^L!TCJZtib&gPP+QyRQ- zb>C(&>CU&+4=IV&#Mxu{8;`RYiG_}rp1k|i{L#sL{JL|W#?TeRE0pxyr?o4R@ZbP!Om`=e{Sic+-0j|c;bC>+~6O;2DDbk z(>-XfgG*>n_m2@L(DJ;)=Y8Keuao;qg7H;@o#;$6g5)F%yn`fJ-~9y72UzOnuin#A zcG}jhTH(?4*{exmq-^P(zq8{Y0Is}l7kTbn)Y7x#@t+DZ!$~S%?j5F9jrn;GIfpto zoj{iS9fpnjW%q6`mEQs~`i~;heM^)A{Hr-x##t_45B=+b7tj5!tLv!91={}cB)azE zDLX~*^6=q+`+LJw6B@e{feiBfI@G zsPE{R!;$vG`{q0@i^rlb2H$X`{lM?J1%*xL;+Irnm#M{;E*s49%Wr~Z=-)f?wfpVf zQG!+^iMim5v~^=-eF}2II2H-_u#hi0>f$lZHCbXV#tw=LNmTnniO<7kPn__3{$bwB z$bVb!p^Hi(KUNhzVoyXkq>hz5pYi>6t=OIlk_+~u^|$X3<9|63fmBC5Ps>t^4c0KWG({eg-Uq2TNxjJimUk zd59!(cYV+;%=iO!)%ay`;+JN3=(;SPbfn356wT?V?OB+u~I3) z^tp?w)cm|hOz-DtFxl%sEbKmz=bHfIe&2ReOGIeh$*Z@d_G3A3wTg6;R|3N~Xn4(@ ziJ;+$V+#nJ+E9_(zz18E2x3O)wa;aH{zl{ppX{#kBAvb7hBHiIv zZ@zxg6ku?a*eGOwKCNf5yP-sWVTbC@tqH_!_vTWZ13x@(_$)zL?C3^a0+aUCQLb3Z z41PcpQ}mHG<`4V7LC!8b%L*ke31>T$p5!k)kPd$`emb&5&5c>8sG_oCYyQ*3_I<{_ z?3jX)7xm#QB^N@%{^ z!wbWn|226G7gNl*%eXvwg-q_PwyZkX(Dw_ctLVe}c{`xeI$FOVugPwqq}#MobGBIM z^Mr(*%zm4jtKk9^MzQQH5ay>?8dMex`Nm&xyOW!>+ern3eURaM4&nzLV?AwMj>b*+ zH$k9X+NIbpAA9@}!XHO7aU0^2j46cmGKIiv@P$vuEb71nQ#wB5tz>)rEBIYPu+dPX zameR1NPKZciy}JGy5O|vzo4SmXfoYsGMvvsjKUbd(r=Rp2+OfZ>gm)&ZdRKAx3m1| zW4H46-gB_Jqi45_%>c5G1N-iap$m64JPn{h={po#&bcZGb0z)u7`wTC)a_M9WP&hA8LM|}JWoW1 z#w?mAopt|sV|K{!4J~ix``5!lTOraKf(NrR^KQad5=+H9UZO9aw}n7iUnfgRhV}Y~ciPjx&M-#Cs-10@JWA0J%{Cfi*u<~c^l_uDgc`v`Pr!fj%0*0B z?Zj`hW0Zvm;zC1KCenA36fG^3s(i-=OKTM}75H!Yx!E88lZ@}kX2!R|yM<;>?!FYJ z$dy-mvfqQgWHZ1pvPMS_t@)0u`|r+@+0Q8@cQe#?Ir!A_>w|nA7VjIx zR^lRe!zZjs?GblXeeO4Qe0V=4n(&J`@W}BFJs6ty^Nse;FJ>!#u^1NT)Q725)1*dP zQ(Q$qQcX|KU(g2dh&Pi}+(e^$?%(&;Eo7ZOS>XZEeim2Ykpdz?C%rhDH2fy<_#x zLdwr;TCVeEbxW%e%NR>tcUSL*=m>Jd@lPxd*sC62*-vJ2YvytR(gBU|$_CV!UtP|i zzQ*6^^M5;0_nBR5*>-4`Usd#FH0#acajSiihqT&J&wCQ7clP^cwG3U|ef6EP)okZ& z6!>!FaFhL=)b}O@W0+ei)ubc|>20c_#g&j174X?vTiAWMa-wG6<1?3DJsGm+`{Pi^IA7hY1GdfW$oSjT>07s z`}`)~hRl}@euUbn1PPgEOF>QC&p#h&nnjq%>FbGmaDg+>TS<~y+3;^UYv)7Mqy)O#{!j0xMMpXjF$G` zGku#{&Q;_~I%jOeaROJDOdNt4YTl!t?T;O?4H`=|trVPGls}&!z5{l@ondg}eVV-M zmtd93WdSATp~hHQ1-^JCbO{n?9Np1-BEUCtxmLq-{$a!ln>w%M2|yfMZ!K_6JOf?D zy81FZ5a?E6p<9>YZqhL-OA0ds5>ei9r>n2gEOltrRlhX2p>DoW*x-Ku_zFvX-nk>C zSgy6B|F7WtIs<)vC4>jnOREw2KA{uvI2viBB2x_!)aMlRixwi-w(Y+3BtK&HbE$LP zVDI^UkI~Ow7E+vVC*R&2e(|eL^F~^mPanBl=>jz3)TQ42&Q?=+kR+Tay-B@{{ z@RHeoRKqOGcIRHLrLFdy$3=tt`U`9!fL2x+tN77I$GIAjW z=?!Cx%FtOhi;H@MbGc^vQ+9(nK@#L|V~-+doed_Z2Tx`yJyf;Qc0P7I?{e?2oABF) z)7LVEN>n5F3@A4Sr=(~^E+6)e82PDuKM?G}qi$LHRh(jL7Y6U9Oek5|E=tnJ!{??S zmJ3Dwas0b#W$RN+xx3+WMRn5N2@IWw}gW;7p6U6v89Q!uh?%vX%;`X|L8J$Dbm6u*PzTI9L42Qm} zT$6@XHez-BGue= zZ;gl6;_9r8MYSd&TqQ-Hu?!wQl)st^UZXvmzcR0GrSk0}M!!50Uj;_68pwda%rmM$afwy=%;5BuM%dhcu?ZQJBQ z2CiF7@1v7mg^?1F_F5?f+pDb&hEE>vQJ$4()K;Qh^k@fssN`-nd$b_(O}JYefAp)w z^*lu}$b++=ri^9ilq6*FYj6d3%?iftRzF^{Z=h8ZW4UL}BZFaSvCH+l+Hf(%W5844 zkX+``50<+AJLp~|isA+D0um0?XhTh6GbaUghi_keC?xG?Hzv5U#e2c$9_=`QYUr##F1c6z06!>ZG1-(LA`8+CL_4LI>w3BOv7syFaC-8%4} zD(WGf=qr0SuJN8O9Qbc93vo{hIiznm)^SS1=Bl1gFcJ(HCoimii<-Ht_W2BHu&zp z*X5tN9{t*AS8j&!VxU}%!_e7|v@m_~(R!jvrlNSL;TOo040XM*$lkdDTeh~d2J$kL znnuKvv%qrnA9#$Cr;rG4r%THhas)>o|HA~!Nwkk;lJ7r2WBd|YO!NNjs{((#RTvt4 zwtn;4ntkW38I;tUUMAtIo~ejBo!MwM38zSKXSPEp4yeTwR2Vgxz2T zZf9EDbMGmRu%1G#2@;m-v;l$G20y?ZL@eElhUjjU4yE>XTz+ejanCUg zpc6p$$RBcRuW!lBJFqpCG4+sjsk@Ek31_ezp$L+V&9+nT?n{P*V=4!?D!Vk!7_$H` zN(>MrH^gO;NCZ}^YJ5YQ{H_!rIarK>ASY8si8*U+y^Q@|5tbW?c@s24hZavg63%QX4qWUA?0)M7LYt1(xoLfE!x`P^s8X3bLD_^6%ER=8J)r$ zH|c`Jdi!r?!?GcxuGldI`ts?HW0U{MX9whw1_0_LoDPW`I9B+rVn#r8tqolN*i3PD zTZK}ezHt|K1Ujm*iwan1MkPC~L_3b9F?TXY0(m^5%&v40ab*+aQ(?13^<7MOar$bb67p`d=M%E zJK$R83~_0g>U~FsN`l0mDTt__kfi7c=^22tS;c_g6&-Cm7qQ=MvEgT}hhr zo$DYKjp*~ORM`XvlW%7$j~tKS!bRDPY_*F8{So&h4e@!VwLzhT56SJt=9|y$_W&WV zG67-ylYg)_q_-T7)n_wy2T#iL^kv_Fs6yNup7Iu***6%Vu>dQ~;#Z&Ld5W=UTB((v z2!0gV9uMF*UPOr*3#ljTTDY!~=l9qke`<1hS0943Q1fGL6ljllK>4a15RtA~gv({i z|2DNKeA$Tfz#-gxvy1G}E{`>vIo-i!-@<#koDzf8PBnjs8)IY1MoFQ-!kx$_r=xga zrFXy>bBzm>2=8)=vD|jmPW^Z|ddm*2GoiGtT9UiHGhLFr_iI9SfmPVW*%8ipPCdO+ z>rp(askWyGX~3Qx#BNHLXd>up)`6g3LU2~IXjc(3mX)v6ck2bl2^~60HOufb?L~ia zqx6Pu=(@vt$=&8-Yx4_=ty{N*5$#WyK zh1T7lLIG7dA9FQ;jd=a6TmscfR*DNL-pkA?B-8g#>$kO6T=k{tXtzO45lLT*6cxU_ zo_fl%S)PwPlHX2k{VCWPrcC$8WV4-n-#GWo*t-D zTF}oYt)gCQHMf_DZ&o~SX~Zrw=tW8mF)#6R$Sv(F=W;Ifl-cnVz!8`+IA$@6vpp|# zX*i$7FD|1?$WVc{T|N(Fm;0{8-uM6lQkBQ`nfew!KFv0;5F>#y2P`!BX8E0Y-0dE9P^ zGUq)Hcsnmo(KFJ%5Nuv;f>JQ0R5c9iaoYZzu6C?U_KLR;MTjY2=|}^{&l_PGmWr>xeNY|+ zf*o}v@h$TwYSZu(Pa$HM09GG18BGH?-(hg6VakZU!4{Eupeb& zLj&9SXA44!BM-vIo43a1sM*k#!b!F=w+!-#_KBX49U^9zV_cn7Ip#BQIHwG z(=;7?z0?j2x?k$FRUDA)5 zG8XgRbCH>aM9l_ty}Z3%(y;9`?NV7)jBYaLL(DGL#6}!@%}N;)ij5tGn!^Cl{<{sN z-k->Ql819vjPx_z2gs8-|JWV2d^$=?`ew|{a3clRhlfW)Q7d`o=k6-?geavW1-lia4 zDD0-JK>sU}QAOjCs@gC&mjWC90pC-rc*H}=lBWS1<;y_8_~RkVR}MnbfyVG6 ze+p*ZBOic7Gpwav1jo#cC)uU}8XQg^j2rIt9~wh(l<$gU4Z!m?SRm8eC$~uhhcnk@ zdB}o+iB}{x!dMC4+hQptp;VDc!1AK27Tj8m+eHinj7Er3rlOwQJeSI%>W~$Poh@=WGvb1ZHk|! zObEf)r1pN%bGDll#RkoxeTL`^pB3LZ295_dtxO!|$P&XM-)G9@9}zXM_aRV|^Vq7L z1-z`MVccxX9jWC?vBFfRFTFPIG>sLI)yZdFvoEsIi>V zVjAq8tIbOK-sHCY1s zJfLs3q+#!yCw=4jl8mkLkI(ydOWPhpHFjrppp}R&?rK!A`E>L*3FnlZTC1_`iSwD| z03D&e)wYYXp#bOxgQi#h{7kkToti)p+AC&0a(v41>0#=$Q&VEvyQ$j`vI%`a;i=0M z+zH)U^a(AOWS381WiZf1kn#ult^RqzG*HV{am~EWkOpoZDwDsJ>dRMtF?T8?|D(WV zww@Wf2Xp%{kSg1UtU)DL$1={i*P*C9PY4nb^_n-#1GrsEFlqcSf->>TpJzKBu3`_A z-IZ`Ft#EEr3Houn7+U$qjkx}856gKW<*t@6u)y}#OOfBtGl4=%KWLKx=~BqiL~c$+ zehPi4n2dxhp5aL@Fto|N;>$~^@=cAUz8BOSe3qzeY$7#BP#UqfkhpzB^mUODbeQ&?>2{U3h6-BSE|_MAInxz5f@nRPyA7BFTt8g!exeY$CV z)yqs6V8?sQ>FS};gP~Lx{!W;Ev94TSZ$0i&RlB~F*Vlo7T5IbGtCv^5XAUYj1Q}X`wh2wZunw0Zo zv{0(<3f6wW@$tsfvs)juy)T~B1XDG89(_3-Ouav5djsLrRRm4t6YnRmN3~Q9 zWytJoj?q?>?=?y3ns1$B$jxnXq1$tc(zxjw+bK)~X*A%y+agL-w%L135O=OpLln0d za2`6ftT^GWo1UvDJopynkt+pzHJ$2{H9KCqFJJ{_tc?tDV4mss9HW^qPmyl?U}i2V zCg$8%T&>+31yq=qo^lJGqD3~G56PevPv%@XNN&)E<0b0&m*jV!ShBoyn^U+i8@R6@Oqjjc>Z&R{0l+<{6`|obGnwxdo0nj+S>=L@;Xy5 zNEOLOhkRpET`+sDpn9LuyL(Jm;fu?5?~unulaJ}d-Ir^c_pMi+q)6I-t~yFVtEQUM z2WrjRy(DKie_4GN+x(;^FwOliB4C+CfLJHvHbCdIO@GN}#@_CWkze1Jblny8pEj|e z2ZVMF9(u~J1Mqgk3B*8Xr=vY%ZLAz7+)vn*O5*%OQdg8Vj}-8{XeI>H`FBX}q!8sMuG z6CXzkk7zV3qNB=p+s_nLB2$MQzKfiHCSkMQRJ8)lB&U2&j<*uJx8Xt{KMj6wB$YcV6w77T;0fxM#^^VnLC0k| zqFM}HW!#)=Qk>n70T^W9R=7k_+tc}~T%9Q(R}(L##Y}D0*pSc9e>8Cm`OO}Kavt1d zqjtd*r#l7|!T^_Khp`;2f@N12AYf(ac0fY<)0Lb%PoD9Swi|}#yu+0|Ohjb^w}Ora z%e7@DYkv!#ovU7#JFm4VLMUDRs$`Bo;(|%*-iTxYzrQ{EC2>AlkjywhEGZ~4J|#UJ zLSo2w9JugZe<_cV=@Ob%p_{W4!#6w5`JK*t_rDWnI`hMASfw~u=NIqja+cK0)mOR1 zi^`3co3N6x)TAoz>E4dTt>4If_HD_=!Oum1h&QsO!^44I;UOFem+M98PpB>Q_Lvg6 z9j>CBRBJIOQEA(F8)_NWyOchw508pGw(DRdOTTLUp+{>&!si5{qZ4-ADBiz6u;l^# z5q<62IeAcv6ibxJ)&Is#{&i-lL7psKT$Vm7zqio@U9+jD!{3tykxDqa$WV&88SqSnYv2Nt?pTjYQ zv7{Nn)jn)**3m++B1_s;t}O*6N6b11`4Vzl9Etz7ruc-GoC3AzB?2|&jI5$9;P!m7 zdGxSlA}MPIuld4!onQLISmFMSabpPRNQIvpaK`G3ii7k9b8&p0Fw!l6H$w~!WLFE* z4IW%P2agM<69=G03ZCs>HP#>U7TkY>iw`a$RKke{AGjK+T~$>1g?SGwtS(>9!93$>Xwb5*x^bv}{M80? z2U;5fvg@yoU=*58SoNtA65BBwO1m|x_zzd{BCq4@_a@8NomyYP)2{QG+V_HgB;H*l z0~+VpF*V6_+e+jNl-V;1O&M|dR2Tb8K7&!qdD<}4%9YgTIQ#z^kj97DZDTor6_WHTllI#6;ZQsY}^73|T{?@YcUM#4)rO<*H=_FS0Hk{{ zg0s47w_!?8gVSZg!l!BWqUA#-RGB)Ruw19~T3MBE)dE_zH-#u|_D0_Bie__czycK} z@Lgg+Am|MqvsHRZBR(;`z^k$rG2Q2SA-A7&3S|1^s7zi02NBWdo^3I>sV&!j1AgQ1 zma2Q}J|225n@fID^T%U>6M zgj=UO`MJ5p>3YA%B1uMj^~*+eot%_+jwt)#je^g=bc$POon9+>|5$H6p#Q&c_kX>Q zz?KQdz-_7y-NrUH(8AY8D&1j~^rPHJYR+2+Z-0hCf|LTnt*bP`N=dhXhs?57IiO6= zBCV|`ium<5ghK!4M$r93U`&^8wF0sqYW)%%LK}BUyY97d`Y3TX8M4|1#wK3j%2Y(sXT7j&7loSo zLLmw8DkAPpZ?0_3V*FNqU)+Kg%|~#8#2)|2I!*PQibiyRQ|x^AZ}fxHkml(kWgqkP zFXF}a@-Q=+FAOVL*8D{d;rjGhsTq=XqpBPd9ywCe_CUw_N!`eFn({nOLbPFkJKSsQ z`5W!&8gJTfu$LBIiQTW`vKwn2M@emorbyWrKtY4e9}RKXl$vUX@ajm}3n?O-|8b>! zF(f1hHFY3%v~`2gywAU2vt(iGOz3gae1$YYOZdKa-cK(7Jx2~7d-Qo^%$GatQ7vkd z)nd4c0bOMOl-HIO0Ce!-->hG+_GwbL-Yw_D>*^Ka&_)Rk-^zge-TdcI`;&Qg(S<#u>htfs*2 z>tN{kt<7t|kR!_PxO;i_~re&~`$3?`wn zgrj!uY!Ak$Bakv*`H{Z1_S2R#U`9x=$Mtf&OMu5q^1JC}AKN?Q<5GR&V`M4-B^Ot= ze&-wb9lCD}fA`)cgxHCxEfnl=)E1EVn-+?G&@}rW+6K?yUkmc*=_SoYK8uu zFLW}((AhR1yjQWAh&Mn4#3|7Ek9TQQ9TAD2BjUk-riSEja;2EM0wd^lq_H-x$k(!X zZ{a&asn?PSq{(NO?YC9DKWuw(>Sd1f5_24>2uU=Q)OsyoCh9S&hfOt=h7vtFl)RFq zUfNwLM0*Q6R#@+;+t>K@(id_*7#8h9I*8pdb}4RZc4(HSAJvi?5*&P2kPz>eqn%=J z`K;)tP?~gwP?Jw}g>(~pcJn8LF!X$=((Aow{|-?($r{_Z#m44}>wxpI!lL8*j=<(X-IeKruDhrvujK_9C3^PwmPCwvU~yNd`4lFg&1j-3ATIoU*2QTKV@-PX z7cTipvj)xunYTM{7(u?xMh#p>;92k5C2s$d@6%31e7VlbRA+rrUAo6g!G8){>#)xx zpEyk@W3A3VT}tLGVmAQyTXAzIAAatY&A4x(3SzmaRf{Lj%}JZm3Yt#d=XG||wka;3 zQI^Qe{TD;7O;lJl4z{IY4l)nU1maU!4FplLz~(mQXZEy zl5YO-NjZjG>`XRKPp+pUJo((3{)Z+Po((>kwMmorDY(^U+ZoL!J=WttkRnydEN&*? z|5C=yN@4NGd=5v8_v{-x`LzxHc-UrGx3_S*Tk6iwW!j!bo|z-OW9dcZtk1=j>H(BF zo6Ill^qZ5{0Sm~6Vy*STI>(|bfp2aG5JbXEbi))5S)fcDkOZO`s)E);^Q!oRb4Qp)X=-;Zn582^q?X!c7?dpQ2M zD_MagVyI#FI4r|h+^IK0yKb0wML=g=10Gv*LcGBti@P5V&@vDWqpL3PnLFkvJ-0Ko z(J)U`@-bd(|5{PKQ{+S#G%Ck9pk5by6*p=ivd7jEei;!uwv5hJ!_Gf0iyReJ-^9Ps zo;LL@EV11&K1wM|<@{~Cc`Rd%vBS+%xuSC!=WE{0&96+xBKXG(GK;-j#%GNjPG6d5 zwb2!6q$GZ!4KN*77j}D7)lk&*-PvOdQ4mXYb$l-J&yfvG{kTZV+Ah$p@VFzHHl zTkZ6>@#?fyK+w5sz1LQcLBJcEdFabE-?dO7H@!IXtU-mX)E6nj`+sDgWjU>t;Wqfs z6D9nx^px9`hJ{9tNaE{b_#X}ldVJ7TZE?ElH1YDfZrt7Lfz+dDOBZ70{BBjFeh%SK z>|#TvPvJ9)Pgy%nZoK+rIwQ^!KoXmFMKq0>0StA9A^YD0rF{=yn?tL{M`H}p%&G!G z{dGG-*JUQRD?F6saWWdWUnb}Kc3Wvol`Xb8FULq9r!)^roS%7L1Yh|KU5=5iK#E~C z9iflr4e_VX+i&*R9nYeMvB{&mBmqlbTVj;Ie&=hE z4Se0o-m|kb;wH=B9qPFf4|F{LoT50xf|Ko1^Xq7kCERD!2q163OC2`JznzKmK!hs={VP@85UTR#Ixr z2dkS&+$j(IYMXq`10j`jKzO-yn$b^T9dw_q4zXgRVOff9k^(+&132}F_R_SWug!yI zD{157l=Q;48-~E%-M=WZv6V2`;Go=kyWPYOFd&eO@mGao9nHO^?c6~@~ zZD>~fdSFz$V@Y{ER{;8Zbtk59vi4wkrzbbPy!oL$<@dGQ!icXZh{YO~JK)FuYxI4c z>M6fMgjqwiv-9!S``+s>Pneu1Ed9NDwfc=2A`UA7f0UP)^_6d}aL{?XOC47FbfT{` zuJdlw%H!!*XV|giT$+oM5e-zX&z`5eDV+PN{us-0=cH_a7_+WufZezuO)Ddrp40r5 z)FK)0BJ8}4kNl`>^5@@b3rm~rSLoyf>JB8QfOKf3S$g$Y4ww4LbUz|n_C1E$=cLWh zlsgII4CD_fQSoyt*KXS^X3!#su+I=2rf7Y4eI{8jGH38Kux1Us< z5`QrDbJ5VE@_SpT;LYiu_G6>IaCw{z)wKOs&U9ZX(qY}wP46(6f7tWlYG6ibfsLIF^KU-$2LYWH_kGuEz^q>(%k z_=RhC&-obABOl)GchgkcduzCl~#J8&JvCX|#~rzoVOiBaU!OZW_?aAt^!4sr7w+SI!`33x|0-ZGO&~AtwHh#Mp-t2T}Kr55| z-gar2zYb77RS0mvghea)k3WJd5tuZd+3v`-Fu&b5zRM z(q24SMmJK8*G>7}&B-SONsst3KxyMl^2CbTkhsx|3-(Z~v{!ugM&ilX9*g|sfzE@^ zkXxU^Q)eD^I$L{D2|Vb2{h0;q*P|nUb~0r)#H~1*oKi0^gX$=L*}di3Xy1i+?{4O? zh5logaRg!b+zd~}%{9)}9{R7(`a~gRaSHkPHFH-%bDf1H@4HW4$L(Q0LveFsv}f2~ zY7!qC6>&4Us1xEC!pYw5eD`=og-(MT>NL{qdHK^$y<>^!XJi@d)~+wDi{$c}cuzcB z=`+%J$A*^tixhb$9P#SRTUk@yKc}G)03`^4 z`C~RWQ3Y3U^Fy?9WpQ*(AI%H?xLBtSE#@l&;wOUXKrgng<@`~!<%xOxYrbZmc)HC_ zW==jdVQQ2P8nei6jwn-by;YimNaT;+;bYKMDY*#7I!yjt-2COg*Dw$E--+R~x_)Cn zm!fS$J4x0nmz2Q9sgW& zafVRMT(Z6Yn!4*?rt%^V1$lL`#i%tcHG5q{(r&oGI)2h%GxgdIp>m1JzcHv zzRg0`%4^Yg?iOi~{owf4XrM$Y)0#f7(K%j}<)BEgT}xQWlk#AxRU`?MrIGvIQmDt~ zRxofqC@c%VvJE&ihV>uwDp}Lx2*ZTcD7v}?-KvqkBv1m&nRQg;9d9x^rVlGT02=-x zdwnTMYA3F1mMF4VR`Lslun#T9bt_rPzJoKuL%BeqJ^4~NFjG!W1$>3$aZIC-BNlO* zr)zuo%HT|aLQeI(x2uSVFI%VT0G+e=(Rp}0d%`o!N_j_{jD@^NXdrpI52oOeo>lU5 zb;xj~#Zu<7P3-62z(sy_on7#xZjd>KJScUzRV^?L{LpGxnJl6W}ck3zm zpvMrtPE#)|W(kJ3Hy#eX5bmkM?Y#={!k?VJ-OGN{_XUN7p4Kyp2d$0`U7H5Nyxbyd z4-d7Xr#l{#1wLwVYP@L3v+0VBBJWsgzoQ?>zRu$&PV2zH_;(7sJMxsTbwy|o40Lh4 z=@AcsA1+&73xu`O%UlI8=njirgB7m=m1J&3Sow+{FRd;VzIXUOk-GKr<#FHEx+B3+ zNS*Kkz!j9<4C!PUkzFlqY`0QLVBrV?S@zxKknkqGu*8;$SLA(CqrF4*TtX1@TR=`~ zfZZ|~r93i1A?NgYw8_u#?#^Xa@6==8MiURBds%(}tp(W9ceN0LiIFQx3{&(<0K$!- zkoIT8MFAeL$sY#VIQHMa=sMN*toXY?5B$9Yj?x@e$O5lD{*&yCX1_NVSGR$28w_WW zxsIbhzd>QmSj+qv@QkROdYj{KQ93NzP6m$m1r(Q~OEo?^!H(o-Zc7 zImV2HaMWHq{c7YPfEQ$U(^<%WGMuzqH*y_x-LHf2V5h^f$MuL$IKa)F9uBq?I)vH8U8fUBjgxreu}iOX3Z5;s`1 ze*d<({|I)MzfZByVY7dWXD~Z*wf&RFzjx%IE z-iis(zkUCwcrGNk_e~GVfOZ9nPMz>#L#AQK!pY<_+=)ukzjM<{HjAz^8ykNVzuk=-IMk^4^7Cc}9-Jr=TCcX4DVYgt}1 zcb8-;yIv%*qhaoJPNQV{6Y$6F4Kbj!&>(m;&Y;47{u%B(u(SW0TXQlN|1|nL+lkjs zzv>(4ak3q}ejatwdIuDp&ZkPD8_M=8R)o8$R=mhVY4bp%bY>%h1rR1>!3r5Jw-eWi zaVmN0Z98sf#DyYoE0z~%KvC?zXZq(1zQ3a|jBr}su)#Jka)V)9bes7oUI5E0_cp!o zrykeMdD5%)4YxY+iN!1+yzx*4$a9rdPSt-r=#pS{hWm2ZOVDw*nN-5GVTW9iq2;@6 z2HcYp&h0tPi?|&yM}SQmx*ss^=5k9Aq#x;Dxd$)Jfz|UNofap zx~u&jyVsoSj3h8?aW%aCJC!!Q2{V13@8biO02D7M$JUN{B9tvKtW|EkDkGkI@VW&X zF8mnJ-~RZ+QvSn-(&6qb-XV&<^zQja`uH$Ryt!}rcNRN!Y<8EfZ=TpWowvi2eLZf% z*0aM;Y3!JIDc={C$bL)+q-bkNsR#a5jrlV$extqnqMqw zE)8V&T84iek?zMArbk?PwY~XW3PyYLD%5n@98T03fq_oDOqxUGv%I$5_LRd#( zt^!!vcKf&R7iAcItsfnmG-k0^l&eFEH}KIFzTsi=lBx;tbj~vdw%W^d4-mhL&8jMV z=6vlyU!Gqjn}?8x!db0!m5z$UYb^Xv2MY?(W{xF<0i_qIJoF}^^!Ob5+ArTr1!CF% zPSl1J|24OMBXG+AAOUR=XXtrq!H5@L`u#}KDm*@j&Jiz5>A195Ue*~Ko{{-}yXaOa z317i%7pmwx98sA??2UnY79Ck^M|8!~x0zu_ta4!wWuMq9)a##rA{ty2l$!P55SUmT z>fTzeL}&6vrL|nK4^`m&%*JyFe6g@O?4px7g^sYId*2T+CD2{wqR`my(xDmeENQ}I z#iz41xp%J>@MWy%L%a2fyvtd05q(>QuG3V7UPnRsIYAE_|b#y(u4^vC4qvM-Aq{YHCFJMYwQE#>F>exOqOpXnlf z4IWAhtuwLkYyXA3_&2dpDn+)sx{AuRGp4jqfj&FAynZ!s;z1t;gfZg1!ctv}E(7o? z;FwYlwKVlMhC3~^_Rh*JmQZ3*erXjjUW695?F+Sj0Z2h1@01t)hkw- zYH#x|k_VzlPf0d0vFsmy_wU`97}@HZH>h0WnzW{7U1dio}>pdz7=6qbYKV_w^a`lQL5Wd)W*J^ zC_?TVKv9P$Zw`uz#tVsU#!`o-2l#lO@{k`|qGaN(&o2$kuM)druw;WMp=@2FD|LO$jF|c(n}jbj zqO}SJN~b@!=s`T^WYrasyU809^aoiF+j9{C4oP6Y{HFa@YH2Trb4k}TK)Kfzs(R8k zWimoI{VntqSA0SC>Hc3yK97PtsKtjmazOZk0@bGO|5`e_upTPP)=z@o~@;Yq2$;{IwvTy2AXvr4`6p)GFd zs4Qt9Nlg#2(q)NV{h;IZF~(2O5-FtaB_-w^P_;VLh<+TbCA#wA#g8i$IaYyf+&l~r z*`KuSMJ6say_Zj%85B^xg(ip3gHzk}0UVCx9Kq}K<57Mcy1p*}N|-`gWc#KTU#a!i zgZQ+n!LJitrKT|m-P=irl^Xl&UAL7c^K}&@RD7Y|aK+GFsn_^C<-|le?wmh>qknsY z%(%@9@amReyqvvw5*SBeTM zl>p?kMrLad@C{IVn>m9_cT$hB?7lFt9KVV!TNLiu64Np^K#@fM_YFh?gn>jm9p;>@M~!p2{Cm)T%=Xb-SUmqLcfxy*xy%>y|)2a z71}gqM+gIiZ7NG8AuFcTpTHOyyhPRUQ41nT_GdjDd0dw2Uw804=n;MG(@PP~fBoE2|-TVKr}KL9T;}zED~# zx|$G+q8{PLUmzBS{lPl?aJ5`wMP-ssQ?C%rcKo$AP&QEOpdZaJP%u=a&|k5R^^%_a znrN`@Grkm&Y|*&!I3bxQ>Cy9G;^%K#bUbOaKfp{{-drHdKHYZ(fnaQ6gJ)+Lkf~XL zE?`Qm)35`;=7_QC+nE{@KH&R!o5ic_z7~2}rda`>ktFg3@>>|bt?(VaUiqD$!pMe- zikzJ_@WEXF&SX_!p(^pON5MlcqV{UPOwWkxBDj?43!36@g`h_?WZKCI=Koyrg#E=B zY5loH-YWe0YM+@Ssf^#vU|(e+C*gC;ew)TQpQdJR@~%G9s_~s`4CN*^#+*_;njrlB zB8F`=Q!XnGzlt@L*dOUnCaye65U!~-qJg}y1fdgxA>j_)8pI$k1|`jkADQaiZI>Uu zO*f{o(E!3|LzTR_m^cpj9$RUUa|b|_(Vs}vwxvY8W&%QyNEjE^sr!0F#83g$!AeRg zDf+30^tomQg>06j?y!4>LyZ9eI^z`7CH}!J&^UHAQw#id zB#WA%_t#~5=xv7*CLV$f1#6&Mky8ySMJ`bZC`6KQ*qIkaY}{>`w9kqt{iW4!QG#pX9PZH`$fkA9aeZ z0`w?&)uCm^0iL~GgzSl;hlG{$mG5^mC78UU2>Gw0*uXao#zYQ7drE`v9fjQ2dMJ76 z!E&Jqw0vVEqQBkD|Ni1nJN2K&I)O#R-jGrZBmbSlfDwrey-ZeYo?nH;x|Hd17I9_N zbVOx=FW0Tdrkp?0Dkc^x0f2_ZupSL>%RXYbNhx`UY-g&vdR6|XBbx7%;=cpTn({)_ z0i*L_g8k8k%HKp&;3dk}OiejHcCOa7Yns3Gfb$Z{YUjdg_(+tOrh@g_<0g*RkJ7V;n?HVLsfjMN_p^{m#+kMuh1#pD5myml#TiCbnesys7 zT3Nz#Eo_yoQ8cN$M)mQSmgvfJ4>`)1?<^wQUi6kiiW2A604f3Nha&zRSFRmI6IOe- zY=Bsn4K)2BU%^niRBOE?SnA-L<=r$I>s#KW1HbQ5G3D zEKZmS5Gl;W6%lt$Bf~K_7F8jr)bO9Xa-WgsXd|q$x^&+5fByGQ!T&Ugb*|B8CJpgM^Y8{UlR%L({4l8>yFDiKZBJ1EHKmRgQVKpE3?R1Vqv$Q5e3 zTOF4NQllc-OA?VLae(-gfaHS59J?|MIVHJFPJhqFBFj~q|x03ZDRY6&HF1h*wdjJbh$J0_PR6!Oi`Qg*{ss%#lf=eO#(vjq+ggPuP(ytVevx@S5kv3R%~ z+IB1aKa6Q*kI0d%>q8a&!H?9Ow zk$oozMXN%X8MI&9=tkE{6fL%v8Q-;JuDgSe*P3A;*az2MewNB=iRulsbm6DSBw}>s za0Nqm8Zct9Y=P$d=X(11F!zmT1*MSw_N=ZXQ@ON0L(Q&qiKU_XxsO3uUddb)N=`05 zrHo`2wx^(Do)nUr2_FJ^i9mT{+w4 zkNMUdNFR2UETL8mdB@$kTiBiHfHI&x0-hx$O&T!>mh$>(H}ITm+^#fzAk=?p{9;@EP5y5RiKoU#G zy*4YWPGis#GJ}Ohz3O1>`CZZx5iN)@=VTiwP=l_j=Yo5FC9{u;m98~{nkqEP7=tr3 z&{;!UmBOKN;h654jF-{6w=AQF&3NT_wAaH%&0ggn%;-8^&S0QZ)<6Gk3|;@zXyEo| zUjgEw;kofcC3g>PRLNQfKg74*xVU=rx;O4-ae2fL8B3Uy#CfC@Fg9ultu>sF#8|5U z&*{9KlBcDb^K&p+#!ARL0k?aj zVx`{oW>;Y_!7-s|jh&hI=K8TTA>&ig7)u4`)$AvPQd2uk^4 z`D>)XH`#agY~FSwY?OK^S$-y3Cexp`py0#1g{HE%Y6JM>&;OSJf$dX7fdd0PASXXF z$-;Yd|KP@d5ft&Cv+8e5>*;L;s13jJmXlNM`-AUjk))e^`15Tghv8G-%!?(RZBoD6 zj7LAJJ${stYac0V-6bKBjp0#J&dQ}#Dv#TIetkUmV##v-J)O4IZg6ev^QO|4$;BnH z(|MPZtKG%_`h$Tt$aM+L{%dDD>bMO%>FFVPV|wnpLYo?CH^H}!8K{ny3m--DdvU6G z3BioM9h&yZ1K6C53-ZNrJ8${{mK!Un-Z)uSpqeoZDBw_sgy~A*;{%Q!bEz#=1kt=p zlEl)iN3(5Wth@8pv4vDX%dm?auB;~-ya6rpU+t+z`@0jx)z-pp7AdejM33}q`N`o5 zKqhc*AoYG9WW&=`Lq@Yq5D$8w@!*kbe7-LVnEUD~oC~L#5`;uwDJLarK`yh5bD!eG z_8&^{fZ&4o1T`EDs`T(|=s5!60kZ;4y;b6|3=lt@BlJ95^sXX-WJ)c-~*WI&DZ(P*zlx-UCaeuU}3jor*+e2 zyBkE}=c+`%u6ce~-%i_JHd&l8a3CYW2kPfF~6Rr@e8H z;WU@pEEBSbDp`M_p4-Mza((X=-)fqa!X(~XyxXwX?=*Yz4-iCHh!++XL_DtE*}}|O z&i|LX_I${ti6JSYSVKxJJo6l))?fbQz`00aOyBovHDB|VGKKve%UoKy?tZ4>kjB-q zXv7qd-)MCpnj2~jXEf;L3Z4aj3&S{(I)9N%`G-eSybBv{EdxDeFi22dGf6n zyo<{*J@>1j&55P1a>RjZiXThqAW`>hUFcstpYacCe@I20*{*0NDBH}~y^^Q-IU2%he&jXO$e;9(aAdaU5f83_i9 z?rRv~obiJ@1Khya{Jf+jh8oi`da*lfCc#+gE4?T_oMjwM|KXu)V7u^E_g3S(4t^qr z01>Ldfq^dyv&_%z3d$SvRK3>h6#r?W=Y|gnhXbE!V~4(Ia&Z#`-r=_twSVt_^27fM z)@6{4np$n-lG(QPu3sa7&%YhgPnz*Zwy)ZwX#F(jZi>PjA@6+yi%`)t0B)tl^$e)~ z6{6EhP98kLrO+m{^G3NZNm>vcA$nX?ul3ndz|p_H4H-%l?aK16Fk?)j112tAl_ z1E`S86`h-}i3x6aTirvwjTUjMLLciUr%%K zUmroQ`g9t$6A4M`)?ux|;<1ut&Bs(uRfU}Iv=^1rMQ3`bAsHG{=}(9tR-%vO+wOj- zHMpTVtQQB%LowoL+v5U=lFyl(?wDMRv*VLA2Eup&64TLAvkGbQPAEMv6DN`uThxYw zF!zt+l<&J+&=VV&8yHO0CbXt#|Np@P@(irX;}kf))~eZFa3=lZqjj1&WSnE5)KwE&YFto%4 z;^n@>DspTI=1?$)Y`?TuSAQG;-;sg!6q=DU@CvRHFgbG0GQNBe)n{NIA*le9VLE3G zBV;3EAoq_q0?Ou=H(v)1%98(6F7wYR%D-~pUp`w-`1+B)Uj6WD_~<5alIRmhHJUN< zX8Jw@x&wnpOl^v}k3|IsI-~5u+T>CQDn3FKUh#$CWHfN!!WoxjH^7L&X&Ci`G_ER@ z(ZsZYpzYbV@j7wv49(+Z6(b*&$>TK7aanU&pEF(-SLK;DiFIDKW;6zS=3ntdP>S@jncWFbtILt zih~&LaNg~k&NR(9v7oa9ZVV!3)AJcXxl~N>;2Oe1L4&9uY*BiyOV%!pG;>o^Q~3e4 znJMGJzn=3SG0uNR#DIo)h)t}s={yYp^G6rk1rl3uQ=~DRJreIy1_Cl(@q0<(y3K)4 zP`y!}A`^rCPpVWiusrbr0z8RXy;?S8hzC)<@8;1*Wg=sIP40!x=>=PV|mZR#CiPWWPZvfuy2dz-X(FxNIyP9u+AF; zs_vdBe$USE)gc24)G3R3oq;lfG+2#_)<#j=7(zoCf%E!IKeeA126DqJ<@EP*PRz|4Q2M@}mzio`PRR{Szk@h?M=dI6jcy`oLmDw#zTj zfy>WRc$%*5v+vQUVpxvAbudnuO~LK%?<)+8)JzvUo^>O(Cvn?bNV%-sJsZBPng&G0 zsU0g`DkAE)3)9iXr7ie;-ylVGk@|P~vTPi8e1z@+)j=3}Af`)oi>QR34$jSXlq=AF zLl#M%w>HWtGmsyp{t4$A*w=Dl`U@V<1Puqs|_@< zNglj0P0`GKRQWP>+3`4W-1bpyDUB5U5`5 zDz!q5nRsbAg{_)?qC?S_wyP&!xX=U9z2Uj;T=<#0hv0Fg{^jn-{7Jj9jTKxXpc)$+f9*jZFYcKA`|WCXk2ryWq36py z_^FkiUczHjlf10Yl+_Hg|A|C50Ym_h__)urPHJ-FR~;Q%qd@jM^USwmI8+}Cfb4&` z03$V{-rmgOcOM02Ov=~fE^#^%b?AIXW~kg|B%Ma?W0nhMSR}`qnuRpQPY@>J5rNhIylVL zjrOiHbRgf@-IaJmkDajLIAV&^`<&scJ=C8BkVEM-6_!iNVd(S!AZ7$5YkH0Kg2cV% z&=FPh8KCiQ-My7y4o4!$pP2<^VM$w1Scb%6dAR=gPuH?1 zhGUteY`mrJ`Q^vk4R4{o_~jUs$-VZsW&7_C7t*HE}H*Y}W||Ov{Yqv?{ox znWSc9K&KkX*zBAd9C;<2FS!09qDcpf5OOcbX}m4PTdU}Ak>rcw`l$$$O%nA->EmUf z-d!(V<38ItV)Pg`;>C+T(+;?2K+MHRf*}zfV|sstXIIl<$DP77CK%p!VL05l<_URWt06jR1e@pHRfsxL6Kql171u=P z6^AtUnTp8NzU|y!GvxsaB7GEgW25FIDyn8oU#ymI_Fpr@W;&X;C7HWolK*x^A?-=@Y3nnNO_AqBbqWu7S6RbEh4*!r2c9}A7-P^tbTQa^pkJo}+Zh1V zz;If5>Bkf(O4bPs{c+qCE=%^K>{hi3UfxU0n{}G==Ve?dB`V3G7BEEVg-b|^3(YKc zt_2O}P(iHErEJ#})J4kNvlt_PP_@%x(VjKaz}1byaTWTp6>XM}2~ct`iP0qLK=sS{ zfXA7pX-XP6xYW!84R=@I3KTS!(~Z=D5Nyc2&OmBujbGMxI03RCX$y_U;ON?oHf(gL zCbi$d*2RZEh?8+9=h{MNTRA6*UQwp;0>33d3?E;b4zX1KVQkRuN!HV6?sqQ!;BQ474pv#U8d zSt{vJ|B${&ng@H6pF9HTie+6C{~?WD7qRTD*10c^6EKnUd~wtk@3Hnq8R2_Dn~j)C z2pCq!|0o!?u-P~#`Yu|aLCw@@-cLx0(w^ULh=tXZ) zQPGg2`S|6>_U>H1&@*8?r^>!vms;TAr_5CP(&h4K(AZsT5}zA3 zb$o&G6^b7pCzUtKRpuS96Dm0{!479U3|sf^T3OTtO&PFC*pT_txMH}dQB+5TZKIz? z)fkw8A64X;i*VY~SQ`9Bw0>`&d~TdayyzzZ+Ds+YB$^m0+Kl*eLAlx&($8$}V7f4& zcgR^9G*I%8omfP3*@b2zV4#(9$#`QslQCnv&-603jXt0ZJZ-xv+rr@ z|6M?t&3`c@g6tD4+rO&s{{r&obar9j@_dXhDZkochkQ&}+)XW2Uj{i0{kn{<0QE{$ z^w9BLgD@&i!MN=hNSgEP_j*Xg!TifbZdaA@29pH(FAiLSj9xfJa%#wQ*i?@1CQnx) zb`?s9PrB`$`heJ8=j&T}60U8Ud@~_-U@5)4)dbL0R5uBgry@~8zpQ9|%!>j>vL)yk zfWC>!-6z<+D4>@&Dh$>9+}C!bq&kvCMdq#-N+Tt=O=|$aAOxdk^(=8FHqg0;*^pGd zsMhVlHmirgU$>3d{7B1eZ@)SC>x!LL$PI3f;_^n+OrFu(r8=PGzrBjr{u!ugqGuW8 zE6fko59s9i?EXK~CQxREbD5;9y4gwNoG9RBv30ma4u#2qX5SPMnWDF&et~L=DA0|< z#XbrY(aeUjtO(z^J(?5cDRB04yef4{M@-~H+eIP2^_g(I@PW|{vUw&acZ0x&ACxZ?pau7RjQTL zYz%e6(64I1qSbJ;M<{j^A#^cca2PfxqTpBXbS^)V2G5&&+Zt2o7d)Y8K@UZ{#MAZZ zN;|-d8DM`Lc+%9%Jos}X4S_U}9|Wt!>Dwhw3+#uE|6NXh!{Kcl&0AGP{Z(Av@r!@q1A5i^K5pjCR6|Tgls`j>ueBJw)3jZ zP4PUD33j`;wmFLGBC{V2bh#=X(oD!Omr?bFj*Zb~=DJ1q0!^^7J?!FP*nToRPM}?B zU8I2QZFIS_M1#p{*z8A2g{wp7)p+wbQTGOpJo)>_cUR+1GC^$c@5ny5YrlaB_OZIu zSkT1>SK{vSRi^5{R$PuA6GzwSi+c?k5N+$Ut^8Ao_-~dX0wBIBeq~EeH}(6b(3AhU zCp`iuKYLA0QkLvrLm+xV3PgXL;@k}v<$rbJT=3Po)RFWBDc!wKRF-3%8QAc1IYTg} zw>masHq&>kix%s|G2J0;>BZ_dR+KMZLl#9zh>y`olXsFEu;|R`_OzDrEr3t!8R;4T zMQHKS(ikR{7yAM)Mf4_UwnvEEUb-LN%Hj1RQf~Ojc#l)gj5>xNb3;LlSkw!E21o@9 z5*aRe*O1zbDaTAaf=Hj1duOC$S5^HKps-l!83@3nmQw2Y=5>{S16$u>wlbz48q?_FK4uu2U-!+s?IaU#41&5GhsG5v}Bj_qrbD7gu5X2 zWi)I!+8Iqh`~zK+qkgtb&Ob%%PeA#82%fte!C@;Ia{X{-1Q$T=uaJK_ZjMkaFfzoy(-en z`5PZ?iKR(_8cuQp-!4K@0VH<9o1LT#n)R1JC{PBCWB%_j#@OH&sKkb z2;t9rEFaIUU;%OOwv~lSvba75sWn`zi|?DpCsJi$!+3LQ?6Px2FvT`m8vaAlJf*74 zQlesEv(a-35LUouK^hnX)0N207l~VZ^yA0(FU-no3gB!rvJe9~8Q1Mj%MnO?Y&6k1O=Bi9Mn#8N^ zlbrmf-bP35!(r*A z-KM=(Fl><)!fKWT^>3hL5h>BQOcZZAUG&-MVR5MW{ocLtb-;Z|&kDAHi-W?B?-SD4 zf}F`EYk-aOhnkY7kGSvNO#YbJZ`D;ae5s%M|k+wK1VrBJe%|5_N_?pE*3wyo6D zn;`VI4Ujb&*(r6?%ptvfSl$SCxZFN%=5HhWevq(Q;d$rd`?ZPjz;bX5ENgs>5$1J@BJ52~kn%Z3a*E(^^41m;NI$8R3SPi%?7R5ZFW8EBNzP6t{qVxj03g;|T3Wh!A9AmzrY6_+?P#{*$!dfEGjK{|Sb`p; z{%Yz+G*Eub1*WE^)&a{j%er!iT#;t?d*ZhB@$z(zxrxb-=O#(L!C4DV$YJ1>^tXwS z^$rD|w0ovhVe8iHBHac+T`~N`N{?z7o76WtNRlAx;6sc~4ytZH-+LAPHb@e~TS{|H zzBvymgGUYYfg-^`@IlB37$py2+l+zRFTTV*K(B)>AjcS0w|Ie97FI#>f551;f+`e^ z$tb@c5Qj$njtx?7-7YZCEev8ul5k+cKE_4)_P1dV;)@9JnArSq9S9-!;GqPT3}|Vi zVIL%jvy5mgsR{`|9e&^eDKN=G-O&ianN?ySz-QWeKWDUU#QcsT8RwsxK|UdFmJ}+t zQ$`o^VZxKb3<0_YWhX1$$7#ANvboP&Dm=c+hV!A26@Tu@`e%LpnZh~;ILiCs)m_hg z!e5km@`$ewS4`&bRU?x%42N-~lM9Q6Pl{P3JBoTmW-}L{mbDT)<_W^Z+!em7i*Jk- zTLS4;7C_;rh{Ir40?8tdf!A*H3kLaN#@VRCQ<(t#`2hrsyeBg88Q=Bmtu$6&ZSh&= z#G1R1SK-t9ym8W28D8%Zadi`JO2!6IzuMSKI{%9`z|vb>BJ=I=J2RR%1JmoOL4KVo zyAEGLm!7ZpPc9CJ^KHLT%sZ|1qO?p=Gx2?boOd6ztZ)gCT6^$k+sQI*Qrvd!>`9eu7)s66Xx>A^Y?jtk=dP% zsZB6rwYVMQmeifsEkTr}%(0T9d7WgbgXiq8z5P=pB2C}8-5wL{>*q&)%V-8 zzQC)Y7Fl<$av6hh|--B4KE&gNy%;_@dw-crmy!bCA{j*gW?FjP0K$_`5zzW zU0jhHh#vivnd>akMB$E$4)Za7=3Iy{ArQ z9n{`QW!n`PzVyl8=0A>)gIXNE-Z}qPkwjZwR8WOYu`!yNv>vyTbf5-{&mbarw&&wa zZOvaYwsKiIwBM*G%1VyO0w-l{nJ(rO>XG=mP7seTzjPK8~`0nD{_Z=ygf?3D} zNYLTB51r{PH^Og(MByY;NKB~Cc)X;JTs>><8L)#f)BrSZ>4}$qWqOw$lOGj{2^GGV z-;Ai>DVX;&PqwltKQ4BlE+zBb{W{ zG4P4UxY38XuLe^K)rh&v_iPk>iUh7d#!u<_;0VO8{4L>i$oV!b%>Wqopi~f783ZLL zD6z|>h>{UDv;e@UXn1B&0RO$2K0i%<=_+Mr;wjIzLR0z|x{$w${1Gv1hi&q=fV`1h z{R(PwG8al%r=Dh6jUaoaPo9(h-_-LC$R|*fhUwCXr1YmUdqKFqf&Np&!KJe5No)Ao zN0qv3n&7(I()wy|A3Q`e%FWJ0#o6}T#%@v@LwGb39wrJ)2!wz^3;?RLMLo=-DOzH;Oi*_-LmKB5KzxYxHze6Gx?e% zuR!ncN^UXW`qDbKs@Xz);p$Zcoc5 zRzgFW$di^+ruU~%OcyCsIoK#2e%nAo%WPn!X>MD&cY0&eySNm`1)FTY;gVW=EZU!C zTgX>vDO_b(Y+YCxUVA<}q^BlQ`ivYGAiw@0e4noh; z;(q~&AZ&Fnpto4G%*nGKbC!}qq3LX)*;}0 zjy^eJE9c0Y$Lj8e^px-v|CAVSP)+H9jSY5W-*{VU(5!oL0q&q=UB<@2!i|3Ivc`G^g*D zrmgi>mDEZKb+*NXHP>M82s`OLl7|bZI2pu)aP$PPhV3GDU`J?lxTULD0f>d24`=P{ zv!R9f0l*t%)XSU3Z^wK#lJ{G!%5h&tD4XL?Ka957X#;?zNHenQDve}c8VHUMUpQRo zsB_)d|9v*g#r4xr{HHh%8a7|zZ{j&33pT#} zA?I@jfX{ZqB~#eHTm4E&PkFI;zO+2}4dA+bG;U;n(Dt(olehRoos;38P zDoI}`_YV22OWcxkF|g$l=;TcST08i!5III`P{GPVt=Y$n(!09l-~Ts#8CGKXTQBY! zc+HC5No|-c(yJEt?Jmu0yZ-E^-nv9_hhcJc?)QT?wb_ZcocdHBUh$9bxY_!~+H0!i zx&5)wa|_^8Cd_)2DAyu*Ir!0QQwIM|-(cT7Tw}K8+()DLb^yevu}?f7Y{@o`sLJSN zN2Y|I&mLLACMDgfC}#p3SQ^j$MSS5ccF`JV69nWJnnPw^qx5I3;$*z8Pk%h#{FOgI z5VW(gG0boJ{A_N{-T^#!%SUvtpA0q>6o5=Pgl^OhiTJSFNw5>dS!U{+_%gt#jEiH; zDjy z(iiPEz}LD#h$vZ0KEH(6f+cs>RQfpDu4`dU5tQe3<#W;Mh~}enBYqRG+L+FGI?^C* z_F4CLS7~dM8-qxRRSnyR(3#!Z$OiA3F4b_$L*Kaq5R*WK^l*kfd^mZhTEIkq$LP{s z%&RzO#vpueyMi5260j+$U-Csl*FPYrS!=CWMIYa=X9qhZI_8XZ5+26v*W!pvf1~1 zM|$K&>Aq`Ie5a0OW~(9Vl4bATh4^sQ^&Qq0FT?_Qq3PiNIUB;S{de-QAw zPKL}xnL{j2BXJ=id*Wd#FP40(OklTwQ|CL?Al#7IAp!RdG5TO!&Z=S82k5H*|Y`ZS2VH21Osrn&{^Q zwb$&mo`0uLpL=(rz*ctyge|Lc=uZ$n7?E$awW{aIQZH{$9Ok*Cb^yRBD4 z0>>NymurA)CCmAn!0JlD``Tyrk9_S1C_|g2Y(OsHuFV%yB2z>N%BMMd+QqzypF$)a%QNxU*ShOEk`46da1a4Qr3Cd_k-z)^=5SFUH;E<_n|)} zHM4_g@-tlfxJ+##kZ<9FzG(4{fusxbBuQ+Rs!}qe6(@CI1lRQj$3$EJKIfHp6(5@% zm4cs6o66;2#w_nO?oCA%Z2;;lvcRx}SSE})Up-DEV~q1@mTJa;5`F&RM1NpE5vRIT zdpl#cP=;EUOBSZG~*@Y#4^GeZy@GXwLZGqT^RR3Dh8>f6N)V0_a6cA z$x;L3`B0tuEdUAp&0ZA7zdE?yc@MgG_?r<8lD^2uE-%?<6e}25HVCtXm=(3;r^k=->KZG4d98ZvKWMtrmWkLhTK(y=1Jw&b(nouo0gi^DtMZ&PZ_KEFPPIQnX#fL3ZxL{#(J}mDI#uWHNRlvh9ys%XQw8-`j%-pb)5J$;RnJB&^r71dZo9u zj4^oP_7dk$vgq{q+5Hq3yA7?qeMvyk3Ap%Ls9|i+Lz9)}tlXvP_sjyH$IKWZWOBjK znrwpgeJC|g+YV0rGQ-rQ|7mkMIfi$8UhvZTd~Q4Wz8`CPt6nn0I z|8jpFFKuek`Fkmq+?b)ow{Vkni?FL`8L6K$w8xP$*1 zM2r5+;?Vr8RI?lTN&4ylKCbV)p6+3ql4e?}oecUtjBtQn6Q;(c?yM5~DJU$9W8!tT zyXZAuS(FA`P6eo8Hp2VbzbHm~aX2^cz#OXKe%t2OIJPubwgg@hlU9|<8nKAd{KiF3 z_UvEt7~Zkx(3PviS@j9G7LHBbimF7AkG5%+2j#KbNioZA4H?3B)ZKc1k>9uXL25-% zxvpW4sACxr=zo2_ROhqX0P=%6wNgu8>?>%lu(qY`w@~zlFf5cc?TV+0yV)2PQdR+Y zYr%)4ZRlV%@x~`EN5N2dh@aU zI1Lb8QtySM`H>|GY>w;bJW^HQOYqUsO7iwy%PtmIaREkaNagNV;IvJSXlEWyWHnCH zY5ie>AKc262cPIhK}CgfM-!qTana>>^uP?+GH>j89e9y6Gl|fUcym>ek%WMRm^v-a zbrwCb;s+nCYi?w}b`pmqGiP|HyWL23&Oq+q0{rkGv2 zssu69-k07;oE^H6Nxb=Li7e3#r7t40i@#v<4{*_1tHXI0N>?QgjysvzVs6 zoe}ZKW1ak&pKq!ozSq5^GjM>u@1|;dg{CZ*?irH2oXFPq-}%FW*kF;`%|0`xKJgrD zBpDA=Um?wDWy0y7&okLA!rN?l0rmNgb;e0LZRR4Z&bg6Nr!D$TJ151~a;r8@bWGH- zMuum4ECO0jmVVwL9enPx&v~p8XXGCcvEZ}UQaA@_+h6k&d@ACwE9tY+%`{f-a3(xd z@3cmDb@9%^Hu15}_h|wDtB46jf7!aFt8>_|g~(QzEXmpYhJo%MHl=V!2h@!({s;Nq z_>U<#T!pT*fR1F{aJ#k`RY_qf?Oz(K6}6o0?Wda1km99~b*})A*Z8h< zlI8C+i@`f~>0^`D2_~%_73DJHySb%bHr3~ySG6@F$~iIgDXoBPJt}~8sZK^s3`D)E zMf%jzrybFYz#r6=SS=a{m@&VfL<*W&ma6)7Gc2*YtoxPvucyPh%6w*{*?QlEnD>RP zf79YB?LWkq?P^%t*ccX{UoIWcrk?$Nz5_>yjwcen7z(Q^%x$3$b=ZT;&fBi<7Z(C- z%CGtiVk3LY+vYReotdh}M;&Up(k9%NPWh3^9uiJwd~_sbI1WcA?{BW?7OP>Y(^n+H z7x4#g)|0i&8D4Q%(}nvcWaXcKa#eo*>%ElzH*at9iF#*!eJM z2j%gqHt~x))Ncf2+PeocAFiJ`|88d4##hEX^WIS`lHG@c_{p1A_mIo#V~VEyHT61U zYcf4HONe-Qanl&6UyrEU|E`j*o_e#*?sf&4pYO(t@r;`F-}oVcE2$BTxny|7;8{GP zlLxA19vxTC!AkuuRjKWkXx;ROCSp0J&fQ==Fe8R3OgL)hhx($Q zfJ9es+^zGLn!!N@_ALQ&g=HJtQ!wr_iDGI`b;>!by=g1<$|5DC;OLE4v2&jz%faL= zKvL`9X94WJIo?0ml!#_dSA9Pnn|eLonBJuag_;lEswOtLrmy!L4vsz&xW)-sAD1+n z6TWU;3Jd6@m3H1s5?=|XAH(W4s|wnCp!5u80M};_pQ)zBgn?TF65O5@x0&d%4IfD@ zg5%W1AFp)#oGCJy#P_k%OmnnoChfT{7CuHiw^E;V-W!BoIdgiWPX_pgs%PV#Ga4Fs zB$V2jYSnW&uMpNh3hu%)l$_utDo$;n1PZ{zHZgs?U-eA5opjTQzR`@H)m$XI4Z?eh z#jf{R2r8_K*^(B+yzYf&Svq^k$>ERY0w@<-$>x5{tQVtR8=-;*DIPA}h-3H2gZ5-|ppR7p6kb}5*0Qr*w+AwMO~ zD103rfogH~B{W^rU51f0ouQ>{w`Z{5~j{+Nv&|NaAmKFw8Spk4UO+F&n>py#iS=tEcf6%%i}|V5rl(#NvlFiMn`N&GPaE zak{@pIfq|*@4pGlk!Q=3GQ7AAii&Fe5uQ^Vl*D!rpmL0cHYXbo7e5S`212hWXyx#_ zX*CzBp;v=tN8}6!sk#P!4nC9W>>=pNzL~=M1{mWavpr863z=@^Xk&CWLW&(e$f@DF_Xq*`XpuA zP|5fS7yj3tZ$PA8o#?vHtNDebLUyRJ*&VvMpUKr@v2pM-#)t;ijX9o-)1iRsVt=@aqR!LM+7$XDNu%IhkesAvc|&M!QCqvGxf3;;ppqc(e|PxFy(YO;A-683nQR&r~$^H zj|9av&*^q{p(OrCIe?j(Lh$`hzI99!9#fh&gYi4KQAptS1nzg)Xl9xSWS!QHviVN1j}SD z))f{VSQYux-&()KWF2pw!)65dYxogq8#t6zbVg!=en4NP$kDXN%&INed}kaakz5R> zoYjG36Itq~zIz)Y)N!g68W>$P*^YnV z1^Xos7H;w%Eg9ruO&fj|g+?N=Y`sRmrgvcTTIJOPS~)u-@>FlitpfSN>4(W}*>${CJ8Lsc9W-T)5>ZuM~deH;lo|)6V z3501*i-acJ7g1=v+`(};%7W|9cbmr1T*bW`)vC~M58lbaHKk?Va>gaRA2G+p_P-g> zgVzU3j@b!x`JiGT?8!%Zi%VI3MiEW=)53ghBE?%Z=}jjUQ+x}HDTvmoqL=WxET2~@ z7a5GUm6lSfFw=EO(8HQDzp^Pl9mVgXv*Xm7zN+r;;ADIW4Y>25h;fMrHyU!d4IfrNgwbDyI!mQ*`nuKBcprW+ zhodNq>eyZq+@t3rt4$z;#0oIK?%Ju_?taPa_;%NnRnik=sHx}Td;XL?5*g4($7`3u zgPn=6DP7%j_b+QZkrI3F&*AL0$0&8;?e#q(+WKj^XV5^^sqG^ET>o6X&)Rlu0T<$X z&hwwu8{3&rz~lYR>K_Y^V7ZOy6M9m8DS+!d;iXHHVu0ZuNtwyOr*=~1Kt5_O>iK(t z=pVOzqLJX^LXC&3WOL!qUJ7~a&ex>SDsYoO`+7g2Smx<+{eH)t9oYcxX|qr^Iw$#4 zLBh>KSrYy}!|3NU`Wt2s6V7*=1k3{2b`vHnLjdHg(Vi7Q4mHInrbO$u3ac4s#@s>s zF9b9Y27dn5ws7e?Rksal1K#VLw`f}#5DDzkh78~F4jGob+&wv$Yboz=+q;C%K-s_9 za3N=gdf?U-5sSw!117uGua~ZIhwZ|IgmT}9e$;XweAgwGlKUXy*A2Ubo*y@xN|a8| zm#!C0kBbauAku_U3lBfoQHbfvh2Dcz5d}JMo$-=5!i$B2-^p*iV_gmrA_>?&W8Hrv zes#7+A7j+&+;a6rzGt<1@bKr=`JTg{6=Iv)yl`3LcSeeY8x)aNQndA+_Lw*Db#?;x zJH}vPWK?jof>eeFhjSJg1(^hfCrt-D_jAWF>Rx~aFU;iTQE2^G-eqRmO$lS^x1?E- z!?g8|k$n*Bg;td$u0Y=2;Nf}vI>JF3->*TJ*pV{K$lFxuCs1tY43K?9c37(A&E*)$ zE;Z2VJHs^4*pxU&c@#)uv`O}2@Tg!rtMy`~(lPqGv3LmCZqh&j+4?Q1Rkq^Q zu|tcZh^XMIdG{4ne4b>&nvOdLx|2oa9cD+{ON}pr7{lVhK)2;3P3~(PM9eA5m`rL$ zZ@&5q@-9e$IwrtQd4eqOg{Uq>r2d^Usd)b9!f~M}(HqJna;Dslu)W2?)Q}+J3Z_(5=c)gjp=gROlrlVOFPg4Qd0XLFURR( zpTT+}1_K1g1s^ zv9Nc!a%-#THnX?%FR!{lY3&%J$1Q0Wn;HRC(hDc~x$cuQR(avVC@(SMq$BeC(O#$cJ!DT$ zkEDcOt3&fjPrOG*IOr}JiN4O4zs)CWXN26qF+M2srw`cOGTiJ6-pjB;ss1J~ehNu+ ztt+dMJqN&Yh8w$hu(ym(aUsa%e1M>mF+(x8fa=_Qr$i(*kAXMhb<8cZhe~c z$;5G8*~_k4tnze|A~1piL~cyR<{HiBvt4P;N$(fj*zo9=3e=8XhksRw1jJE0>&9ze zllU2fgv>3vzgmd#5AZ1rxg*Xr7iXd|`*qTK61B{WB}l5weG$1%GcZKaAact-?4wk~ zVSA)=b3-qr?RJLMDuHXwrG&AK=JWl|DSXRgGmp_jjE}u+-b2&x8?S7J-wx zpC`5_*BPlc0qK`%e9*=&hsh8I{YGC!zMh-dTf)=)=5^Kb$hpy|dH-g$eLV&5I4|{! z^SOxOIX{0u+O}D7Ts_YPa{%O@ z^zZy|fm;e*N2TBP!zp@UT@*_-DKNjmS9bVIgkD2?Hf$0KoB0K(CYS}m-gFLKsxK2x z1FlbN)R+-4Fv6FAX4h6;frMX<+_>!mBQXBO`1%-noq){fWJFKy`L0WBk|mW05^rXu zDXd?lE?s%$1Fwq zdgptiW_kji{KPIWOs?dzgGn{T8;Tk9m(4kw24*iMRY))(B2}SwLf_hqw zLnA16SU(_W`KrPF&Ep6L)HLJa!k&MftlT{7&P|AtvGmyw>M^V3szLth>LGF49R1^2 zI?YjV@D|>q?L1x0Lk?u|s?3t0@d!vs%c7l#!@tTLuBOIRLHrv(OTxvNk&|oBKWgez z;rh7X55|~xEUc(^Rgdm){{FKesj#{_L#EA0rtk!OSfbtoPxBfwujRvP-@>Oqb0WVg zneVv`wfjLHZabE%Y;B7j^LZ(@9F4FY0!|SP{}x9Ci!WVxW}N4^uPisWovlWMS9G^f z*%cI9z4YI>VI3nlvsHcwjUwSs4=DA1$t);rMCVdU?g2)S56{g@zkVD&oDDWFbmS!* z&apTkS?n(sY^20j&g!Pad)wSH{I_dEyZExasjE3ou!+}LrAhmr}Jnzwm*!dUtt2AC4?&YOkt6ENIH9ca|AeXjb z!Fx4LxDWFaxT3)R3`M4k0-IW&*~u_;7w_b+P$CHqj$uK+_-sVeGqdP$Zp3{$4edJl zC}r0Tj?7|y@eMAqZ@GE$VooT%`&rmWQ36N(NdbA5Ts~6j-Z*$aD+`@Y?q6p%Ek$0qF+mE`b^8PNho(q`MhXNG9t z8)jf&zU%%x>s{;pW&aE3KKFH8$5y#vmZhRG7BC4?y2{v@|B#rF_+I;0d&9x``99YI0zf`kUQ6zMcX{jQ1$#| zekdAqn#RaOZ+UvUU+xYIiBmLXVs3AG@O-PA4?9k9_pXwZ zww^9Lx@>qY#+8aLXT~@vhKp+0RyqqX4SX)5Us6o9PwBd%4Y>RRYiOnXj6?ey>KvBo z19M1FIdb2b{09)fM0Quxu)VH7{6*c+ETTwCblbUR|lu%GxA2juf}I&dsTehxXTlEuFuai!3k5f z*Ht154-f2`*1ojmpo0IK6ntlYs34$vfu(5Al58}$bzID9>)gVH1(uqmCH)>dn{>mf z*5a`5r@gkokdZp=NIZIE;)ECn-&4f|j7)7U$K4J&5N)1|QvcQXkVyZSyfA*V&iT`_ z1w>gN&V@8WpAp>2r8|bYSLOe5I>#iZFABc#8A+DhLJo}dkY+rexxWx_7FnXB%GA04 zvDWNlUgIsW$1bOX*C1y8sQJ1sQ%-JTu>i45^0P5@V=u~Fsb8=-&#r8%$ZH(X)2?4K z>csi+RWl)~oHXmZ-gMpgPmhUO<}u0!Uw`i~Wl!76imOiCii*Zc6FS=~FwjQQeRc7* z`ph0&_^P{FVJ8UoeNne!9e6bg#QJf9()o9blM)d&;q=QYjDW=ZGnR|;y59wBRx|gc z_N1^=Q->{rdv#f7lc#ias)Dm}SHHqdFH3dwfWBV3Gh~OZGwaMP0by0=!zxo5r_cp) zX8$(#O+P9|_52^#+N&D`9bY5zu6skvh?#h1Z^frtV zoI8K{DqtKq)|4CEeY#0u+qGQd7{T6lZ>qJ}+MgV?(zf}=01myzaqyHp!6CR@n_5zc zn}VX?iN^MBw2nRws)(E?Mku^7z$ejZ2?diSz%RX~!0{Z5y%U0)nV3cn;MLU#*1Ef& zU7WWw{3nmRa%2$r9@A_pomZ^JM}M#S z!>6U?L*Sz@_`b~85Ngmo<&4j952no6X1x}c9~(LJY0OH{)N!4oJ3r5QI2#v!=%3SV zY;PH`w)P#6MsP!&WY0}7E|x7-r*zK}eyPmeO!>VBioWXha7-mP_))=6gH)I6({Al_ zXzd=BET;VP97>i%-qnB4zkGGB6n-qnA0je0hV~NA;2j8AWGG%;Lw93V{|CDi5iY+z z`Xd&jKc5u48rpJDk=e-hziWJMJIn^pkYkHX+* zQWBkwR*ZKY490fT?5wfdFu1qmouZGeY}UROMVUV0^oK>hoLPVr&D^s6scEL|e=E{L zR6PEY9e#LE%9Q!MMJ>f*SeD9{Zyt@n*6GR+xdoBwGAVyZ;qzR!xv#W^tm<2I z<@MuKY7!fw8ZPJ9d$*wPpnNC~(LA zbkp!Dp2(^B6S=5v{DBz(6Ma;1rl(Pg^KxwENnZ*Lhlo#_35M8Be^VTyeJwH}+xGno zV}qjcAFq}jYt{$z44xCYFyIlo1f};36Fb|D(7oadSnK^VL);>BqJ6(Hxn1cnI?kee zu2Vi*JZU6H*i108v{!yf2DUjsb~yKDEg4Rr5XQAgW26@iQqic4#BF^)dP7j+yeyIO zFztVX-;h%OBxSIVRTE`@5yLa%l??~G&p2E;{_;05l$L3c`>(0kfOz#$!fkF6OWc=J zI{Vp>w0#O@r^mnwFPo(r)hc8-`8q2&1`!9UshzSq z%C8t@n(}TUR8FtuUkplzY;8~LxPcwgWqjNPpNLj#oqJrwi^ zo4Q~5!nou2Gz%dL_iQ`w%*X;?v`DX0I}+yp{yz}sCHhN{1Ha~Z(5f#B@XHzA(t@ym zDCibqkwgKf?rR#lo_9OJ^Qow6zn6x1dc>Mf^~~e)_qsM7D?Xf8H?96|^7~f?!;ezMy({{n z;W-Kc6RSc@#yAkaG#g=!+?@)jQhW{U$^x)_^Ti$Fa`!oWkt1hFacNZzVdwh+Nj%UV z>sP2*imAY<>}K_3h;5d@+%}6+C>Q3yGZq1*Vdsw&6w|gW#Jdc~Ba=pb(>zVdvlH3> zh9Qp|TK`H(MCUdfk2SSsx#sLUu9WCr1`#bQ2QVyy0)6&uXdY;FPQUWP4UJQn;u9(d zrmSrR!#3=A#imM`fMd_eZ+XQG;`<=alIhaOVEWhGPy-j0gV9b`{BM1Q!K0|@4M%@6 z2fk=(@O(ezE~jlwAK3d?YIcP&ao9rQ!;hfGKwV;>uXikUR)3|1$j?^}Ir}s;Nekv+MokiIIT6_27-UJESVvZFg^| zqG9Fo8OS)_a3brKS=QsnDPrBr@h~a&*kn?6u{%q|Svy3`UX3;}=0i4MO$PGGS0?8! zZT`D(tAhM=O%Ssr$qO-*K5-UT8`r-_uvpTDk_GnaV;Vj0i#>IK%T2y9W*% zsmm~bKY7!#`DuIo{b*d!d6HQ-L(j^!VA~ZIYpXKeRQX}@%mv(hK5sIvvTNOmV4Y!+{_r5PMN7q| zE1!P8Yjm5w_>t9_rhExm82JZEncIESQDzt7de_&~^*+#pU)c}DU zSy7g|-U_Zt!nw8ou^8TavaP7UG$aUWH`Xuv#wgXnuv4Dz)hygzVH7~m*es9U+{UqHyLj(N5U&{5KvS;G@xzqJ z>Zo&;OTlx)McKu?u+wdtuFLs0Q{k!_6ZFdo$aCl6;nG2j@A&SKYM9aZd1djew5+nW z%J06+DubsoaDv^ZOQQKZ+ULq#Jin`;W75?%KY{-2%9jGgltM!P=E;`Ik;A7wFoilf z&l`Q3S_R1PMr`8}Fp+TlW8|UkZ|}Kj{>c}J4`$q4*j{+dEA0(to-urfINWoRMei=` zcCzkYz18g5Nm-T3qx8xfVQggLGHWNu9%VRiDv%uC#`D2+ULe~+uFjXbk-AGYjfcUm zWmpK7FP{((es?&R{EFpP*#gw%K1;W$ls}Y#Wh!T=P{eHiN&BEAk zf|ul>ovM7MN15;N>I#WA21NzSDk&j_l0bW(AnYo5&pf{*L2)~%rPc0an5xm4V&^8t zh+`%%8ZKvSr}-OKLfFaH>FP?662rN0TFmCan|)I@VX zzxmXz=iH0-=d)C?LL4tUzfBl^lr z*MY|HOYkKE3{!dhtL}ZCSo-z@vbGgSVMPCA@e7SpO}T5CgLrdGFnIpEf6JutZzK4m ztlct%(qKaRoa0r)={lvH<>kF~!{7P$>#P|si+h}1v|my{Ym!p4eQ;|T0ov;kRi9eu z3?_3VaqmWOPwbQdJniqr0Hj3-M=0rJrcyeRX!&nQq)*#u^xY1>``Oand-YQNbglJ) zNTQ-v_^+RK=ed>1SqDg&DVqB=KQxP~(G9*G*aC3= z4mv?!9#*HD&Avz*{hXJf0l5|O-|*3Iwlwh;{(&E5tU;T|4G6b%{snz{-|QM?JANMm zaeK4aFR_W`k%m`0YxJUEYv<;fyNi}?qqGR%+=TB?=to6G4VYJf>vE0fUbZ5r@&lDz zp$78Z7~o87RH}l-I@dSTvtvw;HfDBqd%WHE!FWK(+pF@JdYD;XJM8uk(x*y)t{rWM z43_WW;ASJ(_-)IKg}0>LBSv7PfV1%y?}TvPd5X_={Et}@*9gMq2uG>^TT%0q{;rmV z0OVD@5qmrM+}0Pr=|6VXd1@PStL*KAUHpV%WRa)xQlEfBI%BO@{xPEwfOe929OWAIdk<7gHyM@H3jUni!pu0G&|<}@9Gb>; z*~5e?EXO@HC418XmBHGl}F$_8H_D=Y!B3vLOK4iwe znp3X$l+lgG9LesNnmR`$SD$j|o_$H9$K5hf$2D~&sz}>@n(f&8#(hSfi7?#Q+krs| z;!*kho(7V{A#@4d)9vaqcOGJEYugbwCb4N(E)`kw&K&M9HE{7=?ce0v{BGwqb|wd| zpb)S`Y-F6I-a!w&uNy#j&+D8%R~dfKhnpiJZj=vv=O!XPH#S=PWglPb?9$h@?}L@k zQomP~h;XqlEVfN|j&xicGYi;VBZEB`Tu*Pu#e#U?d3v|W z`Q0}xSP0k`Pmx%B%i69cx5}%E|I974fircNRh^@LQrg81MzOfEwMgzD8RKKqDv>^Z@v385gKPFT)H+x?Hc)lwF zWi_S+2PBNGTzHgUp~$0x?y{UdVu}utyC{w7FGA(*{S^n=UeaI2OnL2eZJHXMQZeEi zBOeqyC*+U(5ktHSXOBU-lIYJAaTOoR&enGEYQ@rhBITJX>wZx}k`9vH+jiek9iF-O zmTuB{!nfOgRRO9Esx8yR1n#~3J1ZX0RLbm{3AQ#p4s2}axC&RFRD~SMg;2d>=Hql| zB5ShQ8P2|UpXlQoK#k0$^Iks~Hq~R$3YxmNzA{T<3SVZbjzX2Vk|z$+c?Q>Yyut}T zlXL}j_Y0@k-Q$soesw&Td^=zSG^Xk3eEYu(Mv(w7$4DyYxoN|vC)elmCMIN-RTPP> z&u7(r?{z6|NT=B6Ovuk0SM3#dW55?J7Ed(1tZ_V)BOe(}pG5J*5b#^8XRD`|LBURL zx45Tq!n-2JXdz4NM<&cBQM~vte2I;n%y-6%!n-To=#Lr~=VQt2if%$fYlv=~8Cs_& z91icFXRL2W)4CaKTeNiMiIBOV0Vz_RfxJ)nxl_RBvsx&JIvL&FP&X+C2A9 zFEb%p)yo+iUPmK9yrFvO*D^5<#8LsduLQ+SnE#Elm@3izZ^dt6u_%yIS#qj;EA0(D zRr}_D#S;t#ji|^EZW?Yp^PV#&A51u0-;1XR34Al&V_Lrc`%R|U9e`)s5T zUJPu+-#@&+QuXCPzQ+-hdKu)vu=-EEsUC(xR&YO^S9!C)S@#}RHrdCBsC{A}d13!A zVJi?MB*pZVXh18(G&V@{>?nn!qo1h|d#r(&cacuR`}|JJoEpDb;kicOCizJaU(SI2 zRby=%uRTN28Xj1=ky4c6+B9B$0N$`te4VjoN3iW_<5HPKZ9;1_pE(%?i)<@9uYO&H zV;k$qpZasWK-_>^yx-^At;t3W-Pg^dQhMskZ!i6f=^09A>p(Nqwq^zzgi`msY)*ByE*Igxxvmohd-(7&&!9U zWI1*IT{|vJSUfFreR{caG(M4@~&GYQ+{Bqy9 zzk`AnPaWhtL=GOe)})RL=rfHGYt#e2K_A8XEKEw1n#zG<(uT|5CY$alJEHb7=W=BC;Gh?Nu3!u6#eW>Q-unA_pwM~OJxwfS(% zDx`I>ni?pCZetI7VLv8zDF`J=&FyNHQ5aiHzTiYAK8GC$cIwjaa(mXEyRR1hL=UvF zvtYgX?{|PBFscG%`?(ygvtu^WSa^aZW&CzN--miYTlu5!Yg4)3VGvf(!#S(nF;%C9 zq_J-yKgctWy$yz;wNHPXPT^5gI=x%&a!qdIfANONX?`X3(ZIf8^Gk6=YHo zvtdf;&1s_1jgepGduM(`@+w;GZ$g_l_0&Qni@yfBC2U@)f@ix;_)V7k$*nvMi9pbk zSbTO$hP0{59u|v(x;%pBW3C7rKewG-LY{Jz!A~S)kH%EjNDNFMD4ugR;##oWW?947 zZCv}4>DD^rFm2C_Kbz9HrqF!}fAu^F(jenMxzhOL?bhwdL-I40{#8D`r$I9PU z26ux2`qfVFd^}PxqK)MokKMnf=(KPJiQ;*+>=c)K6Nxhk#wpvkOQLuR76u&@i zQ%r7F!CSO~o#MBI{@n4SC4tOZq}8{e^>f+F;^Xr0Vpc4ARz}%hEgS(R)h&^S`bEZ6Nq&>8z6QCq zt)rI+&BmbB^+Bd)kPCGBW&VCokjW7iwsM>L?cq3tuW!rvn-7L(z`sQapZWgVQlCzG z*9pmuQVRbZ9RFRxtl@^<1D^--Q&;kMD8KkiC|z_-4dP+5vE8p8$3lA4FL?vgpu8AG z+|&-Ds`UzuK|o{XoZmGU_bv6cZN6OaZFe==J9T~E2mWS@rF{D8TJ^lp)R{C0Z)Tc? ztb1&(Q=jt?6}l*j=%$4|Q=#GxT79yx;f^-=hOr*W*(nso^u<09I=bL>3Eq5;H(ckv zZS^HFu5F*U_rD^s@u1ZfTx6QEEZZBgI9U2yFd<-DP2lm8Ry_*2e6U*?oD{y;lG^wY z!Xf3GC2AV@vbzlH9BZul(R#8xLigICW-_MTxV&d!ND#TK#NsJ~y~ zk37lGYGvd+!r;Dap2Fa)!CVsRGYs}d*MTJ0>M@n^`NDUpjFl<=zRd?_(@-nl2p>6Y zr{^or7OASDa)_-SwL9amPVyp4DcR-90i_tS-+jbBxRs>L9gNXTvB?tsy*fnUVL%&F zaVnh4>A3Bp>VG(ym7ztOFIH~ZkC#ef+J0Ku_Fg#Zkgl>TgpPLmYrBS9hPFawR;gL9_zEL%BF9`!lF!H&8j}Bi&b(IK;qTvTLZe|H;uVU#d zUp^rc<-;;e>@g6DNf9ejh7Ibidn4{v9rr3@J>J?nk+e}oCja@KVS)hfmSPU3P)}SU zFJ#5We^aT<*4Ux*!V8JbFRK}REHS(Vj!L?EL8&t~=XFDNuhR1P(MR1l%J^`9g zntpR$hcH{U$r)djb*kQrqvJ)oOpkz0E=S^23CK|I{0d$Osl$80F|;$1TNxtG|p+LxkN2!IVUM$P(~H zf8pWGApw^3b;Wi$Yrb)!4fvDJ*njQ7S+{=nVD(cYENA=xUyi&^n6$f~{zG zX_0er&eKiwJ^N=qQ&|NV>d06Ovtvdc?Q9muHEv{?kd^ks#Ybh6N&g+0R`HSKtm= zhe6#yowG?AN=;lc^Sr5-()nn+dKd_i+5o(=D7&|-Z-g~f>D=}SF6XRASGQ6;UcIrR z`h4wO!At2jBbnk**F3JZc1-|jw|}rBIfMq;&Rb7mycNZ(ybe4@F>=ULdHQDT(V*>r z3)kJBE@I4B_la@?UONVM?_VMj`sK@`8w(fhwiMaIF*q8-i?Wi24Y7-q8pB>U-w3o> z2S)+-vjlpX{*s95-EE;XUNwR0O4V2OL#m*sS*k!*pZ#zSCIP-Pu1Q9CSIp7|_^DJB zSTnmhGdK6m7P-HoLj}0W_*AMte1?Ir-Nj8an|kqom_(^ArF}*)g?#hAr2i)VVSuAJ z;D_V~H^QDx7A%3KhMZ>icVK-I#VXdzMmP! zes$T}pUe{edb!rZYtiX4S^l^;ltSfRNN|mShUUg+=|TU=NhA=F0@XF{(^O|2$2l2G zHy8G?4N3d;1B3?zAsin(i~)`~AGxS475q--N>tha_sr2cWVP1=2ZSqc75+M+G;={@ zsJ`Fg{&*RS!O;;&_(YZQ2YP*RV>;Vr*ygU1@HUKeX=?zKctuC~fpil6)9ra)49DgZ zkgw`y!(l=>;SC9uoQ)NW1wDD$E=fAFW`>r1M0*@?fO(SaJxK07?GFa+p%yvKu6iz; z5_slgknI?5dDZ(oYsIEwl)V5birJyXSNeTA{)!U4z^|HP<9~TSEX`eFSrIPF?H(#5 z{z~~-IFVGqeOlnL5jZ2v*lya*K-I-sl138$x0{Xca_=-W_Y}nk#no54OzY2_#ugFv zw>?ea7HfqRF2f*eRJ3X-`NIRdJyHJfrMxdFizkU$JihbJupje0x<%Agw!U}(P#on; zK)p57T(Z=B|I1l;QOe`Arh+JnV}XTb)?G{66R*9b-X!KcDN*isf}HkBysr+6^Y<~K zA}mL{Fs$HcwS@S43}9Xu{p#r88@ytfMudXdUwh_mls2Q=4_w+s73pl}ASJyAkYKFL zM+6bt)=t|{Zrjcte!vGMa5hqN^WTP(mcwk9Yk(&a8UTDhuf4uPVW%}87^}JF`?#)R zB;iYPIVo}}%H+=%8yMxE_;}v5nVe$mx11KxPc>^L8HVddcG*rWu%K&zTWpg22RtJq zfDsUODb;MXoL<56oRZXYsN@@aYP*q4%lf*shl{4aeth9Ca%gF_oS#ibSDvjECQ5;4 z1i6khJFukU6p9@>QWYI%tAv`?Maq&%4fQKjT~zGt<+bYERU1sZ^V+WoJ+k-u(AKI# z0GZ!8KH!hds)Eijl8$6VC>YU@cter9xF{lQBOEMsXV|#=uux|ZNHyHXxro)rSQiq-WADxgLjTOmM%Bxc&g;PuEQ?^GMCy^jqvb(WAVhRds@8}t=Jzu-ho?f&(!BWZm zdgc056C7u1xGM2Qfe_d`NbCF1)ffx&y3abT$wci30+jd8e(nyi43PHl==)~YUE}vv zpO%MzCebRd`K>gU1mqsfk=Rm`Vml^k2A37crxpbH7iaKY?^?iiEns9_*Ku716G?Y4 zST}Qrn`r<2?GVJ3dh}NY-#DJp1$*}XNJk5E%C#c{glXNqY`;5#Z{WF*pGSWD6bGPFGjg;y>s2w^hZPTn2z^5&11qaz36XNWhR-^1 zfzq_2Q0_cJ`uAKzgl|6$s(&LjY;{d$l{GXv;fs)O?cHE5u~PZ2wH=K0{>w8F6EteZ zuUXEysiIzgT~tkND1do#PX1qAJo&Qs4_-s2(YM){i_p!A20EZ@yhyqqNG; zsHrZF#RMr;G1#|%r^R{E@f^=?ah8Pr?0W5TK*)WIzGyc-7Uk1Hh68F&qWY$vFM}}i zveo2|nizLVlvI;EIFuk-P>UOo;^nA7a^IIICcApHm5m{?{RpCZwNU#$N!w^Kl^tzy z9A9AHvy0;3GaCyGh!lkaksM9c-%z7>#|Oq?g6y`eChf&8#Nw=Ee&MN+Z8b*VM`8sy zHj1NEW1p+C{cN(^Wb8sbw0(VN>-DzHGF2bG;w!!Dpwrb;($7Tkd!m-oI)aGnoq76m z-`YArr7tW6w_7vr)%>3I1nc+7b{M6*Z?Ge(kC^wJqpxX0bP!wU^cp&n8maHOr3uQw zaJRa)6 zUXaU%Wrc)3@drH__`_wVzuJ*_*O$7qH_;`C*xd3EWGP`JU3R1PB`?R5D1wR#y(Z_M zJYBB`r_|rW8(V(f@vEf%xQ=X_Q3b@T$Pl@S?F`cy_?y(g&jmL>i{oBfX^+24cK7?p z0U);fou+G}=+9Py;Fv-6hTH9R8(yc}z&bwfCHrv49FLf1iZ3E2_ue&lC>rCOZeNMX48uQrCPNob$gwbb~tFlA1#SuJC z&|W2=(N9Cr>ayzKV?qqYC(FHbuS0Wj{FDm3-g#XAXZ@}3;_|RMlCjUY5~h8>(6AML zaDLTkMlzuCy^GVQTWU{%@w=ETB-k3bbpL9|u$xgAKIpSssdqYXlt41bB~$6gzNf>f z$M{Yg%I_*P!tSU*B&My{aZf<*nNx#5c3?nmDl>2I-%@sbn_Jdi8G0#$a^7A-A?sXMg7wws zFE_5mDD-!B2NE!0>k`)q`S`ru2W*Rb^D7YoO#+_>jtN#YQ~s%OtKFGuxWRmR?uy6X z595SXRX+WVQC%QPkax_*t)W5=#%s8R!`ml_(eWhI3Gi=oT$aRp=xttO>tiA&M4imtnpSoJH^B#J*vanbmF z%l1Q{lsaO+UeX1=jw-7rtjNa12Ui{{oWLE-`(EhWFl3&8BkM!aKjWtsR<$j>FZ$9< zQ6Zvu=v39(ybVX;Liwr`fIBLQzV-C5>X0QvBXEoq`Xl@8GEw@3uo^mzb~F5D%zURm z9C!FzHk?HS*ST)hzHK7#%@Uu5ZR_o%NY*mn&5rP@5W45-2Kdsga2jCKjVI^P7m9P*#D>;f=)E|8^qMa9tMG)iBm@z{yeSl)|VN(L$75+ zqt1w_$)_m3wg+FYr3q?y4Eo>HcWxKeHLcIT>z2;4qI)P=@~?G}vJ|;}3vjsZI8b|| z$Mtep+q7C)I%|P=$a>sJp*leS63`J1R6x%H=9EUNSHka>aTb2tF65u!nIMB+o`jJ( zQMQRwMbRsjzR>K_y)|kR6nrI8&BDbDrA7mJ$}e(pCkvVk?jA;F2nFwkHb36dQ+`OL zCY~e%vJ#74^~&nm%IUWnV53U3&9C0n-pThp)`5F{e}zE?=-wK2`9YJ?*lu}b--dq= z=^<<4M@HL|1s)8|`)P4wFXnt77>~KLRI~AcN3l^*2Jqvy`x)&y?AKwKUSBbZRmKj~ z39aeB<~zWzp7yB?BTcPzi>moBho**aer@jH|J-NteMY+a`x>lE@+B-M&?erfPXYmc z^z}MiX9n|M^14!!yFOWg`D1PvJ6)HZb!%O9z4B66jKUs9W`M#a-`X`NTvsVPFai}l z*8FZM8+Hq*O|kE^oJYsPlkHX2jg*|0f`<)7i^&`7?r*?4@cdGlno(*Z z|Hn07RYw{tE845mwSqbnSoP9RB;60(?>f&HR)1Y%Km?bv+^@ZaVc5;XN7>*@r%0R& zruNT0CDMb+1^{|suEO){^M!{IpiU{94+w=K&NY$15?#NC$Gm%(is>LYq@Iwa|P@zF!}s$WZb_c=W*J|Q9G zGYp&d=`1fsRByO{|7shI?xzCQ9@B)_o;xv1q1&rOedy>P}? zS zpOAW0V6*F9aa>ym7+7`run8k`Xs`LE*MkpNh6t=P1PO>D%s%as_2Qq1T}(RpX^9K^ zqM7jSB1!4z#!VHYcbl`TyHr>OrV|xg1)fYJyV($nRjp?ftP0$}8G(q&Ys~Kv|BCDW znTZ_jdTYcm_P%731n!z5d6MN8H79(-iPTeLy~xvR_9NIjMgHa0clqW-D10XBRdiks z8FtG7FsQ)_9k!p7NjG>3mSVU-&e7M?^j$B>Pz7-s&>z=XC_G@WJgD;q+RhyQv?wVV z_Kv^aRh>DwM8tCReaJ63uXclJz^;3H;wxtIK;P<<8tlsWMEn!yKvLo-D@yvEFo_1o z4wh+UJ!`TbKsK(JVZ~({9Pncb?%~@w`z#SO!G^NdPCvi#sNB~_Wwj_>_WfBA&ZP5F z{;}eUbPds)2$8jObTq38a*q-ehkLE>DXL!`$ai*dppRhjy2t|ypQtuU+Kwu)PGg16 z(M%6$4ZtB_Hyy9`-q2&+Ej}@EPp7i;>11nVW+4Y0VQjF{Z$T%R+0Te?V<0f+shS3= zTOO2QUtt#d^bYIn`#I`xV3fnbzNOyxED4{3EQYxKo&$;%b_HHRPUen?P~S9eW4}lv zc8q=cF&Za|Z%gH-Iq9mIaj+nGcAL^cHVtx-8mNc|>p! zg+ue}+jMw5iuJXU@-xu^u9r$Ga9le_Js-IuozI$aeO~H^M@OS34vVszPmH#IRDs@z ztEqYy+I4FSW`&}%6QGjw6%){0n?+s}W$D#1HK z;dVvoOP`8fog3Lx&c9a0we!vMR8kYMf9@sjI8jAvi?z2?H2PUOXYCX)C-VAkWK1E2 z-vckfcK*v?6T$aX7I&97t&frf^54E(M(?2%>_(}!@%7$g{6jM3D(nW3QLADZK3%9al z4m_F@x9-s&F8`kkU|v(Zh1+?nI}mrN&oi7n@-q*5G!>{*ZbCxaz$wJWcqO?(gtQs= z^HEMLdFiYB;A5ou$VyhPNU5g!Xo^8rlifyo=?nG0DT*zP%|}TQ{^ZUu*E#NNk7h^R z35V-aWuBL?{rIx;-^*A8~4I?SO zwX_^qA_H)At4sl(%fW)3uTM5(EVkNaqX0W-^eqKft%a<=wEo8&*3M`22LWIkGSq}4 z*!}Z(3M)dmw%}q3AH=|&gbiG zO=Z}Hj35NuMVpun^X_zUilYCEA~A+-+z8L4lMo7k*c5%2y7u!E=`%*YGG*>h?Xud9 zWa6m|lw(nm0By_39pUYm19moF9S}9{)HG8s^`Lk!m#pe%0gJshWXmW%5`CnO>(1#S z!1HvYru;lkx4GR|YIiPXc1S}>L*zP{XJqGa4>pQ=D3Bnssmhp1$y>5e8KPcH`l5Qo zBsnEg6l?6(K5fAxHP)cuZ}nuVwm-mK9<`nUK^NY^9>*R?qRIgE2W}0-5Qjnq)LcTQ zc9uK5g>PnSg#uFqVu^}a&k6=NXSNlLw0?Sy$GFN7*YY?uG+(Vu!9UT7CP#nvP~4oM zkA@ICl}9H>Ly|+@6>0o_%NkU^wIHPBInx*yGuV%Vr(GuMbRI~eHo~It5#)KU@DVhu z+IQ1GbrXnD^1)4pJxSq&uTBPw3lLI+Ykw94?fLB7bhTWiAE!+Rq zix_7DIPfN7BNJYzuh!!^Kd*i6epA})b1kd*J^*ip>?$P=Z>#nAAjAD@TxMF_@wbg$ z)ipAQRwqF<0u#0yBcE;Qrcc%>b1MJ7qrym=xn9D&ch!E>`k%5lwGO<;&R@0fVoxj> z2J_uh{|@p|76bA|-niK;!i+-J?#brxknJeFuV|V)LvrcAq~aZk&&IQ#u##?OqaoL2 zIJ7Lkp~NE8au8xi{rCG78;7dX0 zjUKZ=Ig<1(v4N*}ZcQzEw`TFOwY~NKb!h4{c6>^}VnVzi_;0=iMtyLz%s(%)FI<0s z=r2VX-j*g-Pcb7JWkv)|%a?p{AL>7@=q<%g>2)ay0Nv7N1qgHXK$77O$)sipaPO#s z>EHf}6*3i)x}|WSvS8K$yB-@e$cHH{;e$|R4o~;ncco5@ppd9%PvN5;rhFr3a8se) z!!<^&$%$+{6&354n+xq%WxBxzd(Nn5@+v*+yWsjs*2VTGD*n7iE!xxK!LMlIN5RH7 z8jXr$ya?5J6;bJjuN4Ii*nA7$yh1wOCL|;j7-?7tA8&;7TuxZ*3C_0@DgAd`d z>8M@Zo;|GZ|LsUqaF0m}F{ao~>E{ zVPgWWAaH1#jD3o$7G)6lo?~i*8Y1OWa0#~l&Lr{Du)v{W)@iS_7@pjBi<^v+w^{yM6)IaSLj0D5cSy=jo4yhi{`fX1%W5_8bm;w4YL=!1er4 zv8$W#6t$P?eqNwj<{odr320VcoLJH)pJ??+<0yZMxAu>8 z1Q`LbC6d9vstrV}^!HdjTQ=ko$wyD}wN^J>Wh98hIwT z?FE;?j3i41|GbB6=CVdGljRgV3rh{USYr9_{ z!}x%pTst%pq>M*EKNk~5apc6&i9`VBcp~Y(8Qn_{2Gv`lsX@_hoB+Ikw0Ku3D5>~2 zm;udy++u)F#k0R1oY>;HO$U#1&onF9G0DWd>rtF^Jew;oeO}ATS8@(23CpPfCP$&! zzbc$vTwn75(xVYpmwHa&&SyyM`4%Z!Cx@-RxwILZHx2rG6=|h`4O@mxK&h4dG4KF5 z2DCeviV$g3`>g5P_Xq(-$oJ7mhN1>CB?cWv9Wakm-?Wb@+`XyS`Rg^Zs4?Xc>k;6A z#%{39cmN29gsQCG{#80S@SdNaY1Anc#+;`JS&dgz&u(Y<9x> z15+e3!l?W_o69(2L~nkV5tB9osB(p|s!3l66Wjx8G5e%g`~a6nymN1W2LY*4W|Sh} z2U{i!8D6R_ww1sdB<>D74s>iZz(B*#R6%9kjbe_M%_E{2ZU!s;i{%fHSnm<%l@wjB-&DXo;JJ!c2oja5Ue~@a} z{*+xZQf1`64}-wA1>k=|;ux<>i0!c-X9r@yV~`ss2N=}epSpYVrs=bjs+c@MFOHLg z=mKN^p|<_s073@V564g(t7APn9m%JpP^Pl?pDu>Hpi^!Nh>33}nBf-waFWN{Zz2dlhpk=P=Op@2sB{ zcSA<85Gs~ISww7-Hv4p|dxFo7fZOH!sncuNPnJ-nHn9MLa6`qp^p5;~N^9CtCpPtnz zbflVX2Uvtc3jtCSE<@!cLpX-6#W%Ns5Wy8L(OOoz}rl*umLHq}RH*54izYrp}BRE0? zWVtbbAq(rS+?ipX^j8IN>~!3Ad90O)t>pqbN~n~RR6#F^ITATS7cV@o_rJPYqbT5# zZ?4|yZRcPb0t0VvXa4| zjf6c%c>aF6hC4o2FRTl30UnuwwnlB|%T-2O|8lxLoHaiUb5Q)2S6DhNdp~FSym!9F zM#1qMRu9~fJ1#v<{gcQdc&fyFp$Om*ShYh*o?rrC zqj&%P^~@81eNJW>>3CVa5F#vKV^x0)*pdiBeI&BSOXLT=mRE2^_7(E^$=J^P)dVCY zSaJ))_7buVa2J9uD5hDxzAJpnyi-2lfiZ%!?;?f2wGPxfN}C9QMb63Or<4~M%^C*DjH6zoBl#f9v4OzAH1gvSp8g1!@>aAI` zPWWR#`P!dq_AT6Lj+sADvC@BCXD1a*suOWf%2v*3(<@)V*;f7bJV(B-+vb*McKQ?a z9sk+rn;<}YJ<3?_Y0|Z17C{t#>KI?8y?NV*=*AxFO zVOm37vW7iTL~v_=EzvXfQ(qY>X*z9sBL1hWWMC)Us?RH2{1tm7WGLj4MXV$9d_(^R1I#PCUcD`9tIChH1V91w>p% zxH6=jUyd%8Gkgwd@)D6$M~Z=dQkxd`-I+)@THA%hMxH%^DXA#x0(^gH^id5|+OEz% z;vHe*7yi699nVAXRBg8)SBgiH+%gP)`J#7~h`gV4;l%1j(}@@2Cv8Sn-CT+2?D2@dd?Q6R9U9Q&sghdfbJ22W z&_(y>b%?O{#Uk%7z#xj0KQZj0t8GPF6S4}^8{U61jYZux9X+ak6dKWZSlF*U6J@ zJ+IHb_xt>^|AqHnYp=ETGe+(VlLq-Ez3(R0N_C3h`;l3$qwLJ7FjpkrrNbSo9xb-U z?Z6I5o#-WNY4J;r@5nSQ=XqxlCVb65`=aanPo8v2eJ*lYow`i`H4= zkkkzg`nYh@+P8?YSj%ra->I@X!6-GH{@RhFp3b=|;(O|!Xm{9=R$FI4Xa<=8TIr^C zUl|^j-DrTSYk+G03`Ohuo^t;>KyeFiAHlfFd>1PCbp-i~TD=q;nDBm^oYai^+I}!EyD6Qn z_&E>R+HALRsd|V(ybES8sDYQGai6isF3Is8-@;cc$-nXVyoV~a>*;o!m!{%&Q}RV) z0WlvVVzYTa=Rg3HmwH4dZns)?#tz03v!8NahZ|!{#;9_=_uRQ5T%BurDZ@}>XfB*k z>0zIWAnYB=PxWIzC&W?N3(Su&(9i!)P320ym~`$A<7bTp=a2X1W1*2CszO;Y!^AZ! zIb3n{pxUDQ(kNRQ{Z(a%2@*5!3F@~A{dB3br?7=E`z#IU<8}^ zjJN->IWw@}>=1*XdYgP+8xr2uXv_T(=cNAhMZl-3kzEDdMl*N{eSbVF+A&!w{+qcX z@zTaUy{P`$Ut_$0;hPHg@tCMA0H(zJCkm&rIvBfPz9zR(20v6nq0G*!3i~R4{HEi= zkntD=*}Ceyf;{nVlS!e#nd!NC*UENYpLgsrr=eDm+1O=*YOcfr1~;^T$UsDaENa27_qaRM7MSY!G(`etL$TRSOgwhbCwFbPF*z}fv{$MT z^%3gLfQ?8zGABp$YG)HN>Cw_;)11seaTZ}rz2$0JZ+kAX0tYjM&!XCb=j21WS3xw) zT~yEKYlVSp!T|R{pI3iYPLr?;Q{J=q(f1cE)Nx{rIl0GJrNk0HWJhvinPG)`GPmfc z(vpk`M6p#XO!o)9Prfl3*`+$9(c%~kZT;b4DVODPT}jX5pVBL7fVf}!?0E8%&mt^~ zi+i>0K5Up0LQAWOiDZc?f~hfc^oNCmM9Y>kP6jn=a?FE1FD2!Aep$)WzyLR!qx7^bXXay)iZW~OY)*{qG&J@!b0~o5)wDx&HN zw6(!}iWz0xA%n^&y8C{Je{eB#%zNPj!vN+*$JdaRqa1Fl+lda~Nud~)m>7aW-AIw^e=!l%ao4ymxtT=$4w0kSY$$fCWrr{vVX65 zGb!9HCvaubtdy3;x6+zP5ZYW!t88VlOl8YGyqM;Qb%f9@Yhg2_64^%APk2`}WvkV} zXeDQ|1V`njBpTNUqQ(K4a}Im1H~3_BK25Rl_V%|0)waVajJ?fx(ywaJCI*ax1LY4~ z#Q3xMM>XjsB`EBN5<-vETAaI`uTM_6_5N5_f;N4KZR1gdkTD{x!)_H+% zgtD>I@ClUh>`95*8=l3R5uQ=p#l4E6kGRq;?AJEw#MsTNHTkc zv>SXz49+`5q|H+$p%h>9430JOoWsD4`TBSG0h=d~z;%K^W>ty=bUTQdeYF~q1r%Dw&uh(edcyY!x#ihIc_DIbXsN(^Y7%2)a}P!LQM_TAKw`dUoq>$p z+z|F}H+1yRA`5wcNG4J%KCY<<_nr@%*{)gpXKq{U`@wbht=gJOw$Jp0)o6zUay+dc z?#t4Xr~>;fp6Ic}qe0C)@#(z)T={Yc2erlXPp>%&=`6+PMSo77+6b=tU7+#pnJ1g(V5QH z5A0R39YC2pegnUHFCW{+i?$0~7qh+e?nAZ8K=vfT_KIh7(?exDmS==61Y1zo85|yC z%s?ulBxMoI(i{bPDN^yD=l@~oEEN=>E|J^dkpHJK_Y9~9mx8=05F6+pDw%@M0dP)v} z?j8`ppAd{6Q9g0ovv;B6{;)(iNW z&EwTHYk+VUF05YrcN)^m{cR|X&~PN}e^kt5nDPy5`YAz%Rd8dL8@d@W?wbiH8_9CA z>pr`CL-q0yK-?KY8t#o|8RL(Tgf7Q$Hl9mkZu|4VgxvIMK#{7}*Van8!%w;Vy}h3* z8%Ce=CJ9jPay>)lM>6KAbj-+jGRD?f)*0Mt%`?wJWM>=+opjK?hb6M9zI+t)8?>XM z5J1XCRGmY1qoZ@hszILlbf;SPp+>t(OoiVWr7Dj0ETvet2nT3Fspef~Awp0}=A z+-E)|O%+RdKDwKSxm{=O9Uq4*C!oh7NQD{1nnb}Loevj@Mn#8tK81H>qD5tpJyQ6B z1^=0p2n|%H8!a_Zl)bQUeJI-Jzw|8n2awGT7Gm0pda4WbSxO|mu&j_b7VpoD@SUxn zZ;cwhU+|l+7+geQLCg;lU$B}p8BHVHRL4i8I!qhK8pZaU9d5Z! zx51B(f8nH>5{Om(TCR0=&j35>SNN!`KLu-A4&NwVuH~>E@$+^lqNv{FLI&FFP-db~ zp5->K;BXX+UJXD@y3x=;A^E2GfnyWSG%@?M*y!ucr+!+U{R@{nUim4=;rm8)i&ydB zf`SgI+wkp-D*66ILdT!F3`uK}rVQxDk|ARI_(jWArRL7N!gKdC!S8t_JA5_^Z~{?% z`ohw!C0`mC$iSosW}GT&a}pX3aG8WMPXl$%|Y_aTHzO>w+DE57QRX z7>X&p8)>wZI=}nfoilFjwu-YMAWiPT3pH%)KpBQ)_p}4z={g1iM0ff@Lvz)2^0e)B z)#j;UJ3h7<{0dPG88pN@5! zPN9i=h35C#7KRt`6)CO&`)0^~w6pS!KQD&@O5n5jNjc}gLOGV*g<6*8f=C1eT?# z@$}+e-|cw1)1mOGtII}u$%bx$WM`h?28ipqTE_yJKoVG??~`(Ahq1XIVWAuSQkmY9 z`q_PK*P+-%6`419Jw+9CF;w?Nz7w&uH&Tf3miUCfsZQC?RiXB1zQ|Xx`*ao`_bphB z_pIz%Bc6C(rEnc?f)DM!F;Zq!nO3N`U=<_y04-a%Qbb$03X-e(og9wx<<;5iiywm8!V>oj%3 zJgv3MAMGRcE7`wInd^qh5Li?kyF&^=AFs)$NwOa>57}|y&O|TAQM+NH2%4$siRQf_UVZ+JPnBNYdY%a4?Ko}CXw4mD z2{;6Ght;nl|AUszx8rF8Jz5*^9zh;NpF91$2%QTGu>{jFiSGRmEP*^jFR56)4{MV% zn`QL#%&ZaJFN1R{F|OqUAKvdQc>m^6IXNTO@alWl`kx&|1^Hvz% zT;Ovmk&qj_8sECE-w|EUhNDpkdAa)J3`O$2t~l-1=bXWbk{Mnm zC$@X#W9z%mSy1~iE&|ITTDit}FQ*-X6AXdho=r=9U{MIDyF8z01_$Jj{j6Fj%Wg{l zFDg^pB-DsthOsvXRBK9VaH*>FHK>&l^80m8*4-C#pZOgZoMk_pt=OaWa+h``0-foK)w`bDfFBJs?e3SEq{XZcK zd(WG@e%+$g4u;dPzurURnDxeUhGRL;SqFBSRT+(r6oUM+DDO`V^QBH2?75iqv=55C zS1r0Fcp4d{5>?h?%RJT7szw%o)*s-wu3gkJuSxj%y{JBUoZRdb2CLk!)PsL{aZ*d8 z%CyXSJbE696eq*>p$EnzqT9QL#`K}+B-QdINXgUXzi27*VisDV|5~vNRhA5ohd;^1 zX`c!nj{7HMw=d+kS&1ZKIj%oHnG9U*OaPavU1}}YMG7>UEstfaHv8k-_>ZPnT}4lm=%ULuQpTmv$c z&MCNGc_e5@o#ig&Jve>i8>hpPRhXSh4d{ENdG8z#0<#2-os65sj>=4bg^W@|(^!1K zinYXJ&6W2-DToh%Qa?hyvAfio9NCkhEZJ8GQJ{xU(r(n25z?{Slu*X47(#~|tH)0- zQ&#@}PRsfoS}`l02`vdUK)Ilp{-E;`cB1TJ{fsp_f$idLqS-Fdq9SEngEmDbBA{(= z594t5K;99QdYPbF^J#mc;TF53Ql0wB3rf-+*`lqZM~$z1p#AA|;TW!PO1ZYdG5Q#* z=UR+`kJ2t8tUa~4KdqT>nvds}_|H@NGKWJ}|1;CN)$N-I`A3u`>a0GXS8cZZRsNSU z*R1}%&kHML>#WRx1WV?#AIIF{01Uqn!*D2nbnxyeZ6>FkYX(}pxRT!Rvx+>ocpNNd zlLd<3enG5&sMS+Gh*w`J>E82~1<7-QryAnq*Fam!YMFt~Z2v z>!nKn#j>jPdVoP06~K+Hgryppr?`Sm)lWm|Ti97HhCrfC*&2fB%8k;SSIBh1sfD(U zHk9K#rp5L?xD^S=|sxi>TWO7$I96Z1hk19%ugs7B>QD9`;GT0A+hHw&ANUI zjY48Y4cSPLU*~e;()Uy*q5hH_&vK^?zB(HGymm`)K5}*YDUF+X|2FnIq7c)}Ak{0$ ztq$9_?uTWaOP%13ka7h?b6-iQ6`7B|~@AOukiXa*TWGiG7WJBmCne{HUZ@zH8cjVRV z027KyqJ$y^5KPGJUCTY&Dm$Kobf9~yGSnB9$ipja(iYv|5Q zu9qyfuX|KftTR38vroWC|LDZ+2&07W#REBqaLrPHr4Z1>7wL`0Ju<^~y-{m;(_XfA z9(CI-mEjQ&`f6eyPOhQdJbzt9_p=gEeINCk|7G;4#u4s9$9$J%Tvq?rMo*`d-Z~b! zzS*~L&`tZN<4`4=|~9I_uTDO=<Y7oRg=G9XHj?Jai+MSp$P*246fI8RiyaDh{{HZZ|B ziRPoQ%h=l8fhQzzxzra8jqhE-l@krBj68}tOGE7}tq?gta#o-5x#GO1$Ciou1x($e z-`>me{)^rZ(SJnOZTnD}<8M|I6=XK^O6(fFMo$z>`)0H>zk84S3<=aDsaRhnnHX`` z*`?6-bU}bGmw2mvpGYb~$>21O^RVqNM-~JoELAMPiq};)mDACr!_DKjX{X<>BSPAn z`c6~q^OYW~hzKE=(BOcR5n|sYX$&gv&%JGvVYy+2uy*BRyz>9!Vg?qR0%FkgZbjvf z_O|-nx^ZVO3-}3;Wd{tMmZd(+*rl&_f zZyyx;{?gp#Q|>0^8QF6#K#EN4@}kJ-2&@4K8Q{W^JndTXj9|PCt3XoeKb&y89j$d; zCXx2b6*cW9YpsK$T8%~;2bLA2pMF4k6mEGGu45M1ZUki5sO0kXHg6eK0Jcz-BIJA1 zd&3h#y7IlpBQyZ}&?J%b*RL^5pMenM%f*fk_?H0*0X%b(#-`5C*E3RrV7mciu%Ucp z2>c{(`XlnPezPPQ^9A8DS&9$T5pHCR@5Vrm~2kqKsuqJ8(M`k`?puZ}Z zoL*2;PwquKxEr0Nbs9atR#ju#`N5a}f@-Z=bX#8)QDcI7sl2cNmxQ4o>$qsFI17oh zdr1SJQIBV9{`aa?WR)!#ZY?GASB>cxof5YP3s+t!TUZn=4x)H*;TM^e(ZV6yNx5GQ z4?~ar2kzSg-C9xxnN_oG3c+tk8gp_<|4;xE9)~T%@uhEE)+&ee-jA%zsu@A?CaWpU zHefM>&OagjvFOaPn+u*%C3uwiDZp>dV_c@dv+ZF>52c>9p;lM;XK++)3SQu7q45?I9R&_&uG|QGcul zvLge55H0yls45Nr#X6v%fF6g*wgd+x>MlQpOkwH`35@x~61!}QH&#s#VYB?+q0+@R znr*grC537LJl959#(S7djAZBAU72Dd+N4Wg!0|>)KL5so!Yh#oEn`> zajn9WZIEzjtTfl8XS%E8HEJ^4D|8v)I&m@JEh$4Zzz#ZM5YpQDY*wb6d6pZA@pHYl zCVZ=BkA~uHNf2Yrl_L0oCF@8kIFb-^ zAK_*bum;f_I1*NeTBVcLTdWJ-*ILjgxs=||wCi@Tu>=8;Dd59m9TK`#l2x|=z($OV zA@}PV-;W6&PIGMXgMWZ;FGM$85Om>3+Bpy(sELt`Jp^&mI@(w*M|j;>vu2*%N8QT4 zWv~0edxy2e#PaX%vz?mO-}WWBY~SG)!i|}JXU9M?YLR5I(Gk77&Lp>{gx;X79Pe)5 z*0X4RVwswd6OaiQAJ#TjEogTGN%zTfKB7XI1iq_lT)rq#c6^s00(qvCc=GzXR{?|4 zGp`-d!&PCl#6KDbl>UWztVu#CJuW;3$$x4(Hk=ju{^$&>!+ z_co~@11+6j$6vdEERS!Z#(s`2^D!LEl(CpaxU7p=TZ^%}EQGu+&NO4PG7Bpy55B%1 zf^MfKbN%A|;hd$q%Dg4>U8QWAt+nR<42z6-P^9;NiyDQ# znB#m0!?4*mC=Ih!IyFLy=Qs0TOuAC~0k$0<93_MZEvPZKZ$JN-kP`R0jI{E~e7n`k zp#y(`4tD|pqkFxH!wMcUo+I4pVIH#o1{39zKp(H%Enm~IuN$R*kNB|veF#V57Ym!q zV)b~DvBJU=o5G?m27O<@Lz@>efv|T#u<5VxKcTQ3^SDBP#FFghU>c82p~nb8AL-Q{ zf@pQGA@aP=BN=VfsL^A&zV{EVzk35A`&B3|EN(6~3dtcZHVP%T2m!65236~XHf-3= zI8Bew!xMNfq@~B^JvuG-M3Va5zClPQR_MpAVrA=kSt}#!SU7E`!gcFwwU-Sv5>rB( z9-dJuy!VYr7xeA3@hSb}Z4Wcp_nm@-Jsscblt06!Z*#$yy_>^OtI#kQ*!f9NEI2vz zGHkousC9G(5!q;QB|BY-N};jB1{>omo#CpnV5Z%NEI5;_U)`aZKii*=pAsSLwC<_? z%Ma1%Pkg2CqP5|4`=N5p)yaJ2SJ^s)M?w>;+;S(AUXxQ*GR#O0*_at}$_I~|;~i*% z_qUqc8YLAKc4k+)SQhi8a#`-8mf?@q+0)tmtn?u|=vo^cbUQ%GZ0qoLn)AK<1&{16tpjDH6+vjPk?|~h^$2zMPCP1?!+i9Bn@*4W7lh?1? zdLN@FpL!F(&}(k4_ir{YaN&nP0YttXWbNzi1mhMZ>s45An?s)8%;~{fAFR+>no$gV z2DlHE=)b#Xhj5@|gJ}l}rKYx;=MtGuN}Cv#m|1yoCFMMQaX3Pvno3GUWX}|kR$sy< zVLjc$Q69)yRsc|ka==uRKvdcCxfLE(*22nWcr*Jse#3l0pFtNhx_=mt`&(IxS{*0SxO++rgOiQTspf6*MXQl%#E{-QNEYqPn_ zxwOX$xk>X7L%&jo-lDymM`()9wY&t+tFdOVLW`|e=hxG=k^@-X{P3Ye^KE#8mT<7i z=8m##rL@ktI;%#TT2eX(a_zbKu)-Uzp*Q09oCEN!8Z>dMvOw`U+CBe1?rW((tkd+} zLNf@&2;opg=o?+=`<5>DbI|JT*K_ct-t6%f=ltb^Zn->wVO!R(c$8#ZG!MYQaU9J= zIJ!$B1Xzkc$B%kp{XLvdAL_!M@iB)Ls3o=z-ID+Zz}bNUprxfk9rWRSos{IJxT!f& z86eN^@28P&UAhx)9JUUI4*s2mGLZgmbPWE(JAHT!-SMZ@lcbtTsQR_WBRH-GmZ(1eEuBoHn^>r(0u6g7 z@b688C(S4-d@^+()q)Y;!FnS&)?NPIr&q^lB*vwej93-Y4_AwTq*{?gUAhS7Ik*yT zA<|rj6*BAQ^X;mGjaf(L3xR6Q4IhktSQL9JFXZPM$9bC#6BjfY|7qy}-p%1zYuW0) zOWQZH_3uQ~;`JV_ea`boNKfkWD#T#OkMes;J61#;hA=j|hhTeWwIvn&whB#rcUV|R zQNka~?Ek9h_KFUuvREi?hm{!yb&zbL_aS4g=e;=cx*{GVDyf&id| zfv&q0kkm8?CJq5k7ZUW0Z)d=S0#*$(a+pGH4ra3^`?FgJ;cykY%R$sn&+vkFWLoCg zP@oBM)VPO)U9rshvF?t#|uO;qS5b2D=x| z_SuSCFoSq#sRHTzv$+tR;+V%39C2^Nn?=axqhP0To5xwsF{$-09H;2>m7gSW$K5;& zxtP5}0a#!a6XjCeA>?0~#*?s|QtI;H`=~=T!Mr@6^C}Z}=ThI1+P`+|GZ~ND21b*) zchKp~EbiY|`1sqw!-t;&!y(t>?747p$2bRyZ)t!}++viBXg&5_4wjg@feL^P z4|TxQ)bA$-aC+`1rQF;9V%M7ugLcrqY84pae%gkyf5Gb?t$kwd%0@WM?+&C*sj=_> zwT^GOQC$^9z&+pgvM)%CW$)J^;?G9xeeFN_YMl}}kZ*iWXcQ=v95I~xc*FK`kf;D$ zKM?dDw5JOD%Rr~ioEgR~mixaRFWJY$Oa*mIjTYj=x;e@ncIyE$c#0!BAraB)^tMk4 z)Ilkg4@f>aIkR@7B;;A#uO;s|qt5rz(e;na^i<9mqJmw1=wd7(JjXsLnjsHllX zilwb??e}MPFzN<>JZ+Dh$Y0-ll2F{7q~>CVy_{A|SNs_W2`C%pNB5JK=MYZS1!>un zPw%0_#42e4fP9=n8g%WXLNVq$vS#Ux5pA$ei2YZ_=*% zP~iHM(zfOQBkr>f;4VB(sZx3VrC0{^)9uZ3?fKb0Tv;Vdi~AoK!LQ}^K645Dbs4t~ zn|;7>#KGrMX3UUIrPL0843}3|?0-$cNUr-mmR|)g+au9-x)cjxYj);+-)-&vy(ytZ zJop9SR3>aZRl6iAfkzT`*`3EtOh=mi?+^Y-W(5c!uV6Zj)|Zd6Wv*lKed`6$Qe%-7 zTh&OwF;OCNVoq|}K{djq%#z_*aZrkvnszZO`(P(aZ1e16gtE%x)YlaYd)ty`{=SjP zoraSt)SA16YhTg)Zd5~2h3)y`f*j!y^rYN?^dxCyK|zg=rm&8SaWQ18_i0V>59TVa zhhb9rGj+Q|(S>DfRQ@P9frp!FP2-xx0ml83FuY$jpeukRB8}F9?(c>dc&ifPI*YxqhtMN zKH@M9pn_KoLnA3>%f%VPHPccLGA*;zVCy25kD^WRqgKQ6$5KJbV#iUtj2y3ckBdWQ z${4X5Qer1zIX_|*(`85D+P^y&ePN$QbcBO(jfS>4n}ni=?3y#%pa3lQYqTAns<(_# zNtxkTeHjX{>Ew*Cw|?|w)rF=m00@YgU7h?R(OXOaq^q!K*aHAZVQ_Zh8lD}ItYS{> zo9viaNPBqzTsZsI1RbBRXN0TY)`@=q@^dFv<-FTQ7 z?qd{sY~gSh%0}9&y0!2@FytK)C~ie_ZvShfdHEd##Rc1PR z;)o22g#%&W9l7^{ygnz=V3`nYlom1DaPLTm+1N~w33(PFGTn1VCjn;jL{W*0{&fMb zkeZSp6jURN68UU`Yj|!3?RKt7Bq@}{Ky$((MndOV;p(aWmr%3byF8Re=zRhg6UGp3 zyqR<+p}jId3;r zp7D-+$1Ny-4U0ZCuF1!|Gvn>L$?x$jFXK)5!#~2z-q>Ntkl4+jb~AYFPyJ}%u}QDZ z?lSH*6(I&naEKEs(>}iG@Se`6I@UA2Kxb?CRjAHq5XMdzTh(OV zGr2pQnXt6?p4R#)QgJM?AT9BqxI;S!sleB_mjMk1vbl)w!F2&nMWm(Q2D>nS_#)UD zdteY{z(kv%eir~?VT1as@**N+(}q}E_(_l*#rVSR;r4SvN0RTSWCWK@2N;M>cyHb>i4+Ux$0N{^Cm_c#cA9B7}*C|W3 z{e_&y>-V^>w4&20Xe;m^0Z&B^K>;nVR_}Qk)7>Jz>HzGE9#I8qHA?1R@`|hxz-Uv3 zOmYR^m!vJMc8;nI5fpQWzm26^lXCT(B^BD64|gVO#X~&q<$f#$RmOJRnhL})i$Hx} zQ$p@?*}mcE;sY!On(KXSt%FP!aycC)cDuPv`jq8rt+PeKhQAyvcQ&rE+WG)(i8O<= zW?#;-8p|8_0T6#Adl*LVN>ul-CgF4B5Ppy%zCU7QD!bLn=!(A2g?#R}^rc-W6B#J5 zp?{F;FI64T|RBg~0y=1ibyDhO@{BZZH8vuq|FQ?ng+l!W+J!i2OKwOh* zBIE3>$;6h(lASMBou4sRpV44Gq>~d&1VmwoVvkSg= zUKZRBbN#c1Mbtd#|4qpt-Lt5B`o zCX+&^`@J&t2H=eZ-Tz+}%3D8CyTx|vAOMlEcOxDZobT%}UQLmo%^a&O%1*Di0Qo;h z@(!en)zv&u>7^_+E`NH-8G?k@w2O?JSdjJv8o+=p3O$bQf-m*E!`70>vcs7EYs!P1 zk2I#E^qE3K7{BQ)iyV38J@lXgo>0ljaLsozRnF3u+3ZXrT=`nPG9slOzd7m1*Grhp z5JOc2V|3-`_hLcH_vz)S$SW85j3)QILV?fHMN3tUDbeL*z9pH!b2h6D*Q%O+HfM`N zHv2NW7?>&%V3HC$!csaWyhism}{vgyq@YP8CaA`PhmhPN^Q z*R9xguP{TYg$;ngmRrT?UPd(N@Ms*{Raax36N})IR`6cjvMI zhVd!jNdO{)y+#jF>xnEuC$1pK+g=WR9K%ze5CF6`sMi_^VYNczSSm#vOnza?z}@yZ zCT#g^n$q0x4h)T^T86Yfulp7Kh)3LM@^CZ@c~*i&uYK++)$d+@D?|U{lh!Qcuh!;h ztOvzSR~&p`nLSHaAez^iS`Em>IUu#bTL$uouOv$#JVunNk-VyJ|6ng^p`a4)p4MYb zuWMJzj;DvhSf_QbNQv=;Xo#3_avkNZ7sD$&o@i@AO=^Y1(A6-BMm!FNU$f(^PSgOU z(^}2DNyWqjww2@NnBkR~&V9$Qlua$BFZA6&NlQE_eEc4r3*ExZoQ z!U%pGs7sJ-M&(*kxr=;it9HEO`b}tiJEZcG-qmMo1y2EHWvQs2v$>Xj4=nFt^of(n zRtnqL{0;h)6MY7|;*`!sk;T3z#5LBOhui(}y8Ot1(Grr;g?sZxzrrXKvp$E#JcY;o zoMe%H4@h1>W$kBypwH_`iQ|%*2KSV_hQ5zWdS61aF6DfKfZQ5D7xIAlg<7Ng#C-oi zx3&v9he~i89?p03c~_!%Jgb-A?!jofmp8bw+wE$*k5Bi2=`(NAFB(wCf_?a5f+D#V zZ#0i>|KH!40crr_dO*!=KJ?#kul~9Wh-X9qwRS~9Lc(Tjou4aIFElj*=WREK%{mug z72M|;_j7U(2j*W+8}UOPDwC@N>RQ9$%SFo$NdD-2`#8W+hgirqx-*vt4?Xp5KUPq$ zl$I|lbP@`evm&D$!*AkL{_R>0uqo+v!}tC;H1!5WY~%KJ(ZY)i8f$pW325&KAIqhaYnsi5 zvj5=7`T4x2kR5}RJAmAY_HyT_{Ry_OY6S-0ZccqrsPh_8IIG5rrg@7G`$%6Rq6PEunl?PFsB1BcAGezMR1>=`xcAktZ?1lro?YGG-d=@{b+Uj6xMjODt<>SE$r0s z%srl5?39e2IZ?gn6}cWCQ_4IRBOaWKHtrDWxCg>x#A)%ARsJ?){uZ|vdL`=?kvK$h zwEhmycz82KilrgY%L|a>A~hO>Ja3Y&S-Y^+*lRRjBZEV_^=B!9u#YE+#9{NnRkUvT zy%;z&RT~-7CSDk<0qqw#b_}Z`5H}H%{z)sM)G1zMOr z3l~J67A~ zgzc%=V4jPqkU!MPSiQl;9E~ryFO*b1fYjhr=c1V{mnYqyb&Eku|0g-+5R(d^El-~D zh#_MbBv}q)^X~+*#U@_Os^eDGdJrjmaHw0&$Pvh5+IO&iXSAD?94pp_!P~x zwVX+~=Nnh6Pw6n~QMF}qawV$9moEifxd)=hN&(+Qb=MCx2*bD;2Vtfip;N`oie$$_ zucR-rb7fVVGq7aB5=$woFmsFY$v~De)FPbCjz7QvKUz*naZT-1Z{$eTAPtapCu9r9 zKQZ6L<*xWe!B;K|pY@aPgsIdv+OWOzt{FU=4+`?~49#$WT7a3)+rjFV`#OW=;2{5~88lb|35(VO8>`Orp8pmbjF=c2C zxiRhhE4v&Z&W5O^WH}ZQJpp;rX+gpa>+)EC)`c>yo*Z4VUCJ`TUU>*hbSj12 z5|5d)IwpYKO=e@0>jZP*Hy(}q#5@4*Mx@;Ka#(zv*@ON7oL1adYv0mmnJn4aWu50; z=b3)4h@pTq@qUZ5lC<~3d!rmgF0ITOA%{7urepG3Yh7}g*1#$G_N&e)vy+F(p4xe$ zHqWbx2U$N$vFwDA$TxfO%_3#JEqp#tw{IMD$`+syb-|5bXuhb4r|;cC;jDJSJ)T(S zoCBGB6?eYW4iR}S_x53{dL8ZX`HJ!%vyR^5Olq}a=|b5V_O-Q2sR1iVzf`iMIoK30 z5C^%2-Vd5q^qg)bhZ%%u8xg@#PBZ)~7LZRS=!5>T%oz4(2V;r4cu~=QLhDUd$9@Rj z#Na*x{9cBM3Z6#U9F*Sxc3+)#d7^Z#jV`E-7Tb7XD&jH#9lK9yJr-xl&09@3Ry>aY zOUjjEwC)+FwHkQGRZSJ|7kwuCoO`*h>Wh=}du?5A`z=SFPla3{&dF@~AD7Z@TBsQ` z54iOfz={D4u1)4=L$&!Ik0S!@pQycjsDkgcP%JMODsz0}___5r`}`7*@?X%ify5sv zpRzc2kn7`i*iKGO#5d2MtY&_>JS@#5R^o41LL~e2cImXNL|0tv4QT@owRpIKq49II z!MI`v=H@Gz0zU0liG_s}uwW5Tly{8Vw+SeK5U#8R@0hlTPgPDpY8Npv=s7RT=W*?_tH6h3J(KuCMu&xxH1%qwM*mtXr~tX*pOSPb zB*yI)_K&#h-w%Y``jH*KeF3f3BIX)U;udjGQqWjZ5R=HDPIK!@7`?(?%%0gPLs`aa z!%Ik=c%nc4@SQveaDwxV?^8DJxU#6Ow^W4l&9_>74~{3A-L5|c-RXTNV(oA1X}ve^ z2IM}Eju3EBZ6}BYNB6WnU7Oy)oO;-KmA;i|Ceg=tDsZ%#|B?eoSQR*+ zxa3&-vme8(s4(!Yzqk0JUBkSuU%cLN>C|AIUQK7_ zbE_TZ>d6F_`rsy3u*|g#8?zins5%Fhn8F4#X$Tdvu}PUKk|gDL@>eG_iu+jzbAih| zrlJ>+y3W%3&J4yLVjFT$EqxF$B7uf~DKMq|S;Y4=b!SNw{33Spi-k-^{_GJOcYeQ7 zB>qui?E^_shyU>7SDy+A2*>u@FrY=z1W1rq_iq4IU=z7_VDG!jS_ul*5ea##d48a@YL28Yiu!AJXe7(jY)FUnCMS{Le{M) zB98Nd9H;b_r^^TU@7owvuJd|T+Wn5x6~FLTJr@?8CK#*I9EK+1pFW*|g216M)jygD zSV63iG#Rmhc=~VA*bnn*vqpcE3DnpGJn}!_rc5`Q?VKXb0A8WQpjI7YsL@?+p@GmV zNPALikHbTatS|24oQ6yqXUOr59$@~@_dkCW(vN0xd+;?ze z(vDA(c*7wB@W_neE;Qs7osa&qbV`Kt-jh%&+42wpxlSsm$nFZu-MGr zmzmHT(D*;S$4;*}j%6^75=LtsWUmK(#jUeEy8IQDP)gVy9%w8kEG_>pf9EHgLYwcn zjugkW_62(C}VGPg~p)M6DA%;s^d zZ05T#dLBmoF4t`9dE~LQB*KKpDeUjuSG;2z#o9U;r_`>rG)z0QQ=sNIjdJ**O#;l- z@<+wS#)C5gGT+SQ4hPvXA1OwQr8lnd*{K*)1dtGelK%0%_kIN;GZl3VQ(oF?Ves#c zJSOUb!#tmZYuaI~2#&WrE0cw*9qe2D>#L{5puHz?$lj>?+_5rQlO3_KhDXI4qc4J`bW){nLZLHXK~k&Kg3^4Lweit}yr zjrn5uRX;~iMx8P!dYh)MoYYEDM8g6P6aNPRE1d1*OcG|BMLidxA;hgS z!Dx!+l0c$rMYD6*@1&zSglA_`gqT^YkeIwgwSkpp&G=#53|B+5vLaHyo@Z?N@um7A z+S$F5DSYG8d2trIDVnkAl`ec}+QUL}+WCmHFLUN=Vl;IOMvp~j2Vnb2igbZJ<+ zjATPD)Y)P9W3cgF3bAFli~+zPGm0|_!>fJwKhKKuLMZ{bYxyW7$yBlB5d*EEN2lqm zX6-kzQ_iQb-~i^!K@0_FyouRqC;mpY@2Kz8Pi1(#Q319$ z-@grWxaYx1OI6YkLlISHlY=s1O=eV-GUu+Ye}W z#B@6svT@{__qqO|O_=DXQH__n89*zd-_d^^MyCTXofA&)>DbuVB_V85%qE(Lzy*wE z*zmK$6bb+#;gL%BX-e!KBO|?dm+kh%1Vm1r{x~`dA>au*=H|nb$ zao=7Q5dNK-!5I4aUt;r0jecwWE7ZJC{UlbJ&44;AbyOfMWQ-I^P>-_u=&A!MP?hAj zRzMo&J3W7Op5R+A*_eM6Hm3u+nC4p4$~!&1y90(ij>bH>Ep@CXH;b=3m@`U\c- zXk$1wm&kVX_Mzta&E!BJ30#AwWu!`hK5vlJfUs9=@PlYCCnP8~cL#8-1uP86!)*3K zcJ#j1DUu%Pr$_Gh3&tbf-E;~LGkS4CC4QOb)_hQrrxi45y03~kJq&Xnmh^0`x_fyU zkZdnBatXyILn8BCpMItz0J%#Mb9zf`7MK=C|9_;sXH-+|+BIrHQ4ml;0Vxqd5K$tc zp(iRxkrELVloA0IP2%71e5YmR(fXGiZ(8L2J`skRvc?_JB_Adfbk z`kJcw{+29r?tDG%nI}?c_F{2-fk27-#?QXts$0UdgQIzJVEHaeg-WAovRa{gTKWUw zF)`9Y3UCRssrSMs8iguG~Xd>6dIdTRWx^@X~79_l~BH{Tq(vg2@qXP<(|=ZE(S zvsklF1%&a$-cK9P50}=}UAl3%?3crvw+bmM-SS(whG!-DMQ2mBk9%7x%x}*{?np=; ziQhH;n!Wt$S%wWEC^hXJ|5?G2iFQIN^bwEPsW_O8M%dk{50M3{3H*I~B{ z7MYLmv)62FLbF~5OzKhgb_+AFCPFr>z4~KJKXTDqFw0}FEcea4mj$#uJFCjGPpf7l zvDX?zlE0aIZSeME7rY1d9HS`PGY|Ih$(OpTsaWJSjR%qABlEA43ye_e(r?s{^aLvW zp8bKfWFOu+uc%l&><3g{Kg0dk1Bx!;VR?t>b|Xf|vYrdRj6N~=^3hf9@04X=y!qL- z_*S9_?XLP8g?$;mb6@UBOfL)wtiNlLj5ZI^8ffO6+kuXla$aliCf>J-@bT-bbenwm zsLHjV)aO3851@3Ol-YmYn`840c?&mBGDMSaI6Qar3$9skwv`>puJkFGfAxnK1qIfcJ$owco*b5$?c&NDkB@*B?~pLK3}kK7(E z{JUSrfsfS9>iFjL1I=fuNauQ?yCUH^Wi3WhCC=MC!tdEnsbUuI9%o-R!bhzd-guypube1VF_4_` z@v>8UaddvstH6vaEmn_Jx`uXt-nR&TR29vMF~1A_8mYOzGV&%iVIL!|>h|}``ZBiS z#op%YY$;%J%07juxje~3x%w`977r?i14v`tnf!>9#XtO@fZT=Uxm&f^fSuv3i-{3S zW~UB55jceUoNbQWGic)wFPgvDmtIk z9`Zc3udJ%H^tDYKUyfp}w#N;dzHj)W3|$^V17qp9uCkR!?wj9QRK0_)Ai}2VQ08eo6*? zr(D`}Uv3UT9{dcL`6PB7dgdcimRIh2TAdi8=Ub6T8zD;jaIcl~TgYOnh2)VFL8|=~ zO?s1`;{;NCw@=)FIAUXq(^~XN+*gUePbaJ;1bhOUWSrPI0QrgL+N?)G@B;8xe)L`1 z1|A>AJX&I=H+{^c-TuMBC;MmG^v-=Yo!KkHa3($)E)_9$n@7bj*k|Mx zemj=`MpF2r+-IPKff!7^Dl0X0p{o2r)b8hBuOf?L!td^%{*si4enQpEDQ*@TRbYjX zBsOU(E?L->sB;5U`&Z@y8V4G9PD-jMFdYnT~&L{`b4Hj9pJSF{HRzH;cdF=Y*(lOr5=?I;fsl%lPI;&W+0&FV)uy%h}8rZkU zpF5;AKMUQr`(yK5t7(cvameE$>hqJ0yzrVKeZ&Nvdca767nobMm_Ab^(N@Q@k%iN> z;P-t(S7XB=VR5&!TQe5ov(>Q*(y+*L>$;(<((MI6_`-_1xv5v82)0~^LeV{$09yJ< zr>n@n1(E1y@K$t5nI5z!pNIIKA~fxF|SEeG;U z`YI8EUL5DzvA}EFiW*fA$?nFPFk@O@K(m%k^r|A1(*zw?#O%0vY;ejfn}Z21Hpas6 zZVNE*TQmy1*k!DYngP?!!JP+Dln(BU56zE;1sEyV_HA|!{gPM4?)|m}kU5JXu(9U7 z{+YpPf2P~C0=Zds<_6ZI)6Or9hLeyU(^*u3l5>KF(*2Mj1Yxzoc>y^{cA!1|pnKaF z@iXBTH(sGsDV^8eDpXSpNe!EG?J)>e#|jKaF*py6Z@7=J8m-s4@5_0D=!$_QgYG6# zVcahm^bTyi*KIbq=vVdP_>pS|;%>&nKlu1#C!PCpNt)?P^Vp@nsM69N(vyK(J1ze?s~rYgre zqx!TB5{1&E;%xjcJmrR0N;JmzIY=_1iiiFGUvLsaP$FdN(|~@Pr&L{dnOPRPQci!mM8^c zxl06ac<%7du2ZI#z_pEg#LOXL=0{~~Q&;TlPU`j6 zlr%eft7u^c>k?ApYR%y~p19J3>g7obZ2*qv%-2PI<dsa4hW-Sb5z6O$4dwNjztFJO2`BBZ#~w-hrpb;g{i5HH50$Z0N*LP8$5; zryxqg6&Q13tkBeM3P3l&%>Y>%`h`7^?PuDcpNRD_xLfe|lbH=>#xiPTnETzu;-{=U z@0mu5(wQj&Wo|PxQ)?-Wd5{q)F;T5x-af}Ee9(ch%U+v{${t4sjh`FxmBp_P*C(ADPizO6 z8@jSh{al4CE;7y>bVR6<&xcs!=x=%h8Rw(`kE9v0-zKFC@2`1iCBLrfrL4Tn*8WZT zvTQ7+^)`qAz2wTd>CzaM=aLL)s7Pu*JNlzQa{2dJ`J0zy)LrD|ZxBjIgg3u+%DrZd zP40{fO~ZHS`(y+=D3k#hJ?8>zlO~ty&-gs#uKY~PuM^eR815a~dHY^$1X9BR1vL1` z>yJeN{YeapW#>}60QH%%+K{tH!HK%3JoI8cxI86}^3xLTKndFjL3F=WGlT}V60|_B zVT-C<2No&Z!1lW&^u-g_uDX!;+6gOYlm(>n9MTf6X>sqTjhE{tGyS5wac%ES6;aAU z3mm2fa60ippHRMkcoQP{#L&cAScS>8&0KX%7GQ*f$L-vIkdMwV9AcwOUgg72tl3s0846 z=sWM;Q|StLB~I&5qXc>mvR=ygO6S$n{bixrDHXl>mglX|ukotQ99;X(kHGgE3iHM} zWSv@HQ4SuqK@P%)3_&m0g;AIM6PN+q2=XVoB~z_ErAAtm`+{4T>3)aZqu%A&%?Y6P zs(JLjGqpidNASb8LDRAhc@t98A)JnqMy5mCgv}3{Dw6V*%;*f=HG?s01#D1G2h(BY zTPZhdr@W0BTgm-`^m_@w#8qHI+9=4M)90Ye3wyr#>|VXRa&;_Jy#WzS z`!;>qvR$~S;bmiHALO?V`@Ml5GH7pvt$@`!$)Ykh)@Quu;>nlOr%wQ`B3Im-HaKK_ z!)j%t0Sq3D{_4l)qI!=Z)>IpM0bRu=(2rK*;oJ}g(jqotx*v=07oArS-ZQ#QeoO02 z32s8tUe13fBb#QK_g;OIsB_4}#X)G84uuV;1}f$LPRPt=$n?iR&93YHtoKiu3tVdE zv<@(C_wr)CnrAZ=z)GJ+v421|$nOO%x|qf5OmTyxObSMKN($h(9`vY1-Ovt?^1a0+ z;XP(Hl0Jd*{8p(lC&b+p8cKPav-8zyeTY5G+|tXjY+ik^f@;Uj{=iBIl4D#4>ElTD zcvU?w0OaL`T!0%2jNJgx zKLE5ih88+Rl1mH14fg-Wwui>eUaiy4X$pSui|MNUcBinvP8ohG7eDOtX{mqDQCLXg zIE?yfEWa0o-*v-}hK;9(J)&iFYCj(-yHXyWfShMGK{0{aL8RNjVDkp78Hsqg zpP!UQ{TaOE^0W!?#6k!}zq>hCJvHWIx8dUCUPZALp$QXv4@*00VqKCKh@tcXL6D~x zCy=|Y&hwnlm%7uGItWtz6#&XrgmfDARmgJ26^x6QNE=KWcEUqs=??{jKe;D zvFylR>xJM?YMx0*(s3husUWxWZEb4^?a#zG442ns6t;H?L6M;*ep2_~yg4U&G{okD zp`d$ilkkF^b;1jGl$n-?Tw>_g!41BRu=4SK9DUwErgZnI7$>S%g>soxhfAQxhi5lm zWoLexi2^yCX!CLg(uSX?33?UF_Nd(I^@=S9R%GW9NQAn+aP?iK&L8l*GCwOi^xn1c zWW{>*yrGN$AS@T4!u#xiyXT!<>7Gw$QfUfNVj}Y&6nG>w{rT8Zn3_xl|M^UV`##4Q znYCW!*#>Nn?I(h-lE@|X-=Ng7C`yc`ygldRlnn!5wpf1Yo=^-?%C{xHL=t00v z3Z|-Y*BDdKNL1`!n~bqqJTCNB6T#e+(d?`boX7Ic$7DkifY-s|kiAeEfL%f+2j=$4 zV(2c@vZa{PMiuneS(IhzJK)Q1p;;(Z`_HUr{K;;z#V;7-S#jK|_NyQIb4Z)SOd{xF z`QCe=JUd8A^cZ}1AQAwx**YW*-JRPg2ks>UjbIDn*7%_d?3RyHoRRtjUk?bvAfWTZ znC}unp(DqaIMmpQY_4gP$+<}Xsa`6UBmZ-BWRh@H6_6lMRy)n@B2QNYk-nFBto2PX z2gt>iQ#c*MdxM-mkfvD#IGF6?6vfop!855s{$<=s>qZFsXHI<=h6_EkfF?(RJg2OQ8pJ)KvI`6FZ-Wt-xVR^h|7 zu$s%F_`JvLzQm;Ev|{U-TR`p>`6Zh8a!~#${9%HC(yx?WjjspoBs4ItEc-lu=nIER zA$WgKpHG7ahv;F3Inc87ROs!!QUqDxYZ%d=xn7GB0DpBE1Jd?^*yTpis9wtOW%#*r zmccPb&ThS`2l1!=dBM>Gkno>bMQyLBy*7IWUlFIF%j^`$UWza5NuK;tIw<3c)94Y& z9D2J#p@16{!5B(;a}d1PJYQ9ApOXb0yYBP)=*w{dm#TX657o1NE&b=WW|HDs+UJ_j zy3w;Ds}U1wp4n;Fe{ZR0?V}}Hk@^#kY$Om$)dT%}@dB{it#hB_Ai3&yLb${RJo2Pz z7m_2w@S4?ytQzupJdujh^k+}u3F-r>p%fXw8abU3SMFF3k+-?`BR+xZ8A@%%`#UD_ zG6R1>VGf>84DK!KnuK16hfO&9*yOwI)NSJ%#R50tZ}U2;AGMb;I@t&!`J!M)`7@t< zP3K?@_@p0Ate{MhgGm3*8&|=ZU(^*B2q#8FcppvtR>TtZw7~wMJruX0NFhJR*3RC? zxSw4h)`f|pA$|KPy3@nyUau3JbCLg4pA4SBA6z|cqc}u|Z^a!(+qoG%q=p3dwd*1v ziDhyQQBGaBJQG_xctkt($Y#`n5~trXA5xyaMMRy#FoB2whNXisxEF2od8(y@_cV|Z zE?NKts_CFkOPg|QYSEY3D%?ECZr%{K@cKVG&}#>T4j$0mW%lBm*WA>&NKZGylZ09Q!*z{zGUf&ZwLPlMg`mpiN zlz*en(~{OH3Z9t`TNI#(_v%o5{y@eGJW|158+|stmqBVy-+}(28S?0BbR%RmY~Vw} zT2AP0BpKVYCl<^C$tt2Y5j%T(dalC^XKgRiD7|Z#HWOq(>q|gXHC|pYAgqMY+9OMu z4!WXY7rw?>hA{(Bj2Z<`+dWe*Jb>+k{?@p(gP9E50LA3TCK_e>IbJy&CN<{I{0Q;)dH>>!r3-93f-fRV zPsPRI!%<=U!lAeMvz>@YnRSJTC&n_y?hJr;kYJzI+(pw`jC9a4gCW>JiJ8V3cEyR#l z26?c5^|MTZuMQO~Y)_1#L2SKIbY?mI`|5Z<-2YBCvR|``YZ=;MY16#|jPHF698-Z3 z>(xLw`r>66nSw@M?@#~4y4;dpmk_q*IFuf!UEOo9a}YjJ0I*A0YNnX)Mk!~JX8bs% zNMYybiHVb8p0hS$eJ7O`@)W?k+t=%5k!*>2P-n`9NsI%vnO07^V? zXK&h4cydUChehCKNpU42Ia2{3(0RL45{$qNJVe$onq)ZnnS{X+1uyJ!b8E>mjvB<$?pTpUjlm* zRo{-OuDZ?=rl`Uhh;0Kz>ME=KTxRm7y@fCo$7ltzTFK)5f%=S<8w?6K8gp;~OVknU z(Ouc#A>KesyPCCO&C|BSPSV2ZA!$40aQ3wiHQ}Ud*>TWmn|V&l;Zp1QSp|`CS}Xs# z5bMNcPS6k2C{2*^X^^eVh|5?f+P>Q>))>Hk*BKK}$epx|E(;-0?4=zE$Q%A<`-Q?lYeFJx7e;?6S=fSmf=$HP(y#FqhGvWHP z7BTxIYH=+ie{TD$NH>dbJRuz}&6xdwr>~J2+~vuk`@ku$kbp<51@dAAWh2z}cq6rg z>ql$pgw&jB>%g^C`?ZYX{xvH8=frsJYzq;KYoSkhhImM7e`ssI;y!!s0Q2!wUMu(% z$#6H<)7c5b=O32)iCG!Y0iLL+I1wW@EFN=j7iBt4zZ2?Wpy1>b$+&}&;h{u<>=h4@ERn@=e6w@D(CO;sC*99OGzR= zmk5hZFxASem+Y@tgO*lN`xTL55_NEur%HcyMB2_gVDW@+OI?=#P_=*J_Se#aI=nyU zRml2vmR7~T!G;PPXasrM?qn_bjd2P*mX%9#w1YUK){R1f=PY92rnPPUJJG2!Fb^c{efrqAiB z91gLI?cs=ZqRb@a(1z4j1MB-1(sTzW%rW?G%!`Y3i#tZyl-{v=O=U_}-rh2SUXz(Z z*#z=);%z4^$E2M7qQni7&za{7D=I__NWGII8hG|92 z)}pq2b9IeHT#IGwOwjCQ@qS<@X50KnL(+6o&Lt$%W z=ps^Iwzb|U$n$cpi@?9XzNJ@LkxRFK^9fdzKU!e-pu{xo7_FwwE$p9l-jXB+`i@(-)j=7<0y#mOK!?AXoG4FLr$$ zl+A*oOj&kWG@&r?z*vu$bHQIF&YQ9iqsHl?YutuIoBsj%KP~dFCD8fgEZ~i;1SC@| zVGQAH_W9ZLziRi=aa>I}X^0!et#4$VNLU7Q<}s7g+|gQ-bK3I?946V-mDoUVf;VV! z8xR^UN*`*%OY#R+{}WTx+m=n9Qkp(EpyLNvc(<}{|HVJL3j3r*LviV^7h+&?0FjFQ zcS7zD!OzNpI0Xm6?O*Pq0K6UQhFB*_hIzRLI&2Lp5k-(4P{hi|v!ji@xba|I(U2&D z_3pMZZp0YS8Bf$!>kJSyB*;jWN#aAJD+BCbIr2xFo5W|lZYd-mmJh8Mk2K5f5-#D< zm4Z!d^U7CTh}X^b_YIROlSKNz2g&hC4zygd2pKaU^RGQbnK zHG18RIyxX}{pv5qp9vo_dNO&qRDwGPY_C1y)Q|x0=O>f^(CKG-{1EGqjnd$WbYCPL zgUD;7EpnN-yCV~aOZf~fB>tTE{4LvNhr)4MTP(wcG<9-ZgpT~$Z7*P4a+tzeqdkz% z5 z+2(d~Ol2(wq9Pt~OAGWqXh`37MGV^_Dgmys*D6w{-^`9NYdyE(eQz{7F*-e^GNF7V zTT-*biWuwe<+U7>z)p&XHu@2gwEWgYb~I1BwGX-@)?%Ru#=UJ7p~>>0eii2cpVR*D z8&neM=0#eEp|ioaLJo*pJ$B(a6K;I_71E+S&YF|5&6$kuQhFujMoo#gK&rK@00 z9-^d?Ym3mVc~D&wUUFb?_`l+LCfwrYS&(P**^@y~$pGw}vSFtlU9_bdpM92O%lYC$Q z5vX~ni;f);a%q-~3Dy9Ec}0^oqHo<2NvVvlGQHATCD1(e`%Shw?oE;1Efr}_{LM>G z?(y7_@X9J7e=$~4;`v^9v zGvCPZJ~Kb1g&&`$)ztc@BN(UvO9%mPm|084uy@G>2>qb7#eZ*AuWqbK%>hU{YLV#c z@zC}kcEY8i5o6_mfoXyiJc0v;LEp`m^_hpBx-(rd%uC zO?jWrFsY*aXC0miH$A|5I{$z&d>Q0fJ@_y64E;kGR}&snk7R#$@>dJpparDc&Kd0L zBr)CV3mU1Iy-C{uvWfzQg<=OJHxIT?v~x%Bs{TM`{^BV3iRIV18%vqju>txQ=>9aEjwM- zrp~Zeh$rL?Va@w2ZKE;N8broD$VBWMy-Gz{rH9g^F;{76pO~U7uY8=K<>fb--IU^= zOjilwzIMo^&q8miAxMT373pZkTMf}r@t&0TW?wLrcQ+f^BWA=Ob6Mqc%gbT)7HyL|CN+~?y$cx z`-f85T4~d~t0-Vz=h*Yf!oTCB@3aAi_LeeYv1dD?{h>!X$T5IO#S}Gi9RcfP#3Zs^ zVP}!1LJe!cZTk`W*{oZRs%rlwLj2|K@i#(uso5%w%UR?e?ky?jw#rzMFfA4XK*C%+Wz12)+eXvEC8jRNe1%xWs;A$g>5rU! zLfvAaKg^ibUghDW0-1lZ^8SfgMH^a&eyI=Trg&z}Dc@N;UG;B=`AZwrBX3Z6lo7X*Of5pM zw2RhAu6^->3O0m~%bB#Zkg>P+zfA75-5POrJDxK}^t;c{FNLQ_es9c-(K|gIRKPg-o=t zvY5h~?Q+=BTNqDc_zoSXNFPX`i}#OwOpM5XqQu@TxKOMG zh7XHJaN-m6Y6Tv}!{Q}OyM(w^;Uo@o1M!F{TJ^-`PbD-{+7EwBVeRoteg7Mczb&<{ zj)xxIUg^|dg}l>LmtnpA&r23&vr~;TBhxzsgwu#c-R`G5uJLG&0q0@BVoFYxWi4^) zUp4>Frbkq7N(MY+Y85NuLXB9nl_TE!Y6Xn=Z5q}8*W;Q3c=dD}W9tK|uvKAxgX?S_x*XbB5Oqv{#AxnS|TdJCq!)oLD9Ebs9OY z)EM=ezeKG?H@sz!U$g-iIAL4oi3q+b>X$S6-x&3p!7J1YTln7Miqnbyta|N{{v3*9 z1l!^I#=oGRwMg2RSx4rKSo(`{=%$?>3-9BsozSx}jW5xQ)|13<(2kBl;_$!Vymlb2 z1$87G*Ru0Eqq~t%ry#gn~5T@ zjbN@=?9%7?eY}3knn~KxAB;X_C3ijEREi0EBsOep-4g4oeh5U&s%qY z2f4p3_+R+^&B*`v7U@DBhl68O$JLE!La90~ul2dS;O@t|iY|eN6S#z1_JH?bT$PfW z#eDxwt>oPJ-e%CS6u-3w*sW$VJxm4nd&Mb4L)o7XEP2|Gapkn8pX0e`T?rLuAR(9F zC>hq8>bgp|+N@6Xb1NxGc|2{8O^PY8muP9dC57oP`diF_$QCIZYxRvN57Ln$o z(TZZ72DS0PLzzJ<{bKD-+E`SEZqWB~Em1jMxFIXn;F2G;Mxg7a9aewdz>DxuyjC(w zvqPP3E7~axw5i*?$LVnUM>GA;!ukKQ2tf~2gp=x3sFU+_J;^l#uZ?3NCPlIuQ$w#8 zTCiAQxwp+aWQ#9m6#_;QP|`(OwYqeO{iaHdCc(nB5(rQACd7oqY^sQMcIpq9WuxOa zII_NsE8yGNn*M}DQ9p-NkRLUkcz<)Q9H8H+X5bnk%8PGw9QpC|iiPNbed=Nc5`%5g z2d&!W z;}2z9(Nzvdfp?EuYe3D0+74RXbROk7?H3Yq@6e zMIag&VueHM+5=*kmd-;^iR6eHZ(y9tI-s{ps96%Ag_dsj4h^f;0Q*z(dn+W7yMvJl zHAQCgj;L%0!B}YM#JgyzXqb2pXabslW!6YUSYiBXkb|nmoukJyQ&2#+RHgYRGV10N z>YEP+u{RYRpZKt@f-{lJJqP5#VB*u#Mfz}D*)fa0Xmr8!)T)Y(SA2hy7yzN>ZH@vs zCg<&m1ERBY7oSq+73QV>p#0EqHP_q!?LnFkSqw7v{s^e)QG zgpYbsBf8*U?*hn;N7P#?3_tZ@1#^=K>hcwrt5goVEoSryLsmuVXJPTs*a-fE0Be&h z^>)HpBmM@@H*@(E`>V@XmBWKZ5^bD;RK^M^aJjt#0LNW;Ef-0!4+tM{hY&IpR1~+X zXA`9GgJoG!>)T#3<_hsD(^U_YOT9x`+XZFRdYM(E50_2DTvNWa_J0nV{`^zs|DtHL zj~#8FNfK?Z@`xtns81Q58oB@b@|u@Do-gESqO0ayi@WuGiwY!s+Y2d#UOv5BQ@4SI zyF1^kC5zo*3}D43erv2P(G6KU9r!xjK+>*id{FLCt+piOS25%}85IZrg;|464s;kv z3K#L*crBuE%eHQKTCU^y`B0a<<%I30A@?fgmJVO&Jbu_8x)0=-B-)|k?30pO;haeg zsE|?IewO#(QMtJ!3^pI+{VYY2ALjT`Eo==sr*yB9x*tak#gLk-M;XG|g ze3KiMCo1G(e8jX>dmcdZEqa(z0ahz?Gwk#VWjLyV{P_F@*Sd@3^_N+1=7p7Q>NW>^ zfCg^=XJhw2m&bqgk=Z%Jvmj3$2$79eC&xy_$*m>W_eUSfzBe)5`C1CLTZKby`@mvP z0@R+1=dE?p>1ns8>$VBy05tt`y2>}%o>qD+!D?3)3?d9B9Biy`ZbMzFu~#B3V`~Hy zW4uGxcuyVHj&``}cS*r`a5Tx}m#`zi)%C^q;qqT2R?Aq5qSf|DLIb5691n%vS%F#? z4*?*qL=QX0iOD!8oc5*?vg-DwiCyCDS zw^3p-Y_;trPoZPqXVN1e{+$UgW&(6!1l637*OEvO;Y5Ukbd`C4AVWrxG0?9In2_X` z(Bvgt?EMzIlrfjK)jHOc#p}i^`Z`O`EBDz~P4j($-+Q7545kH)P43@4us@M7>trvv zj>{7EUzHrz*&lCCLOr;@5dC670TDHsLC4m43GiQX5+C>|--FmxZZC}sa_NywSI%l8cRuQxDc%j6P zUk^zLJMG`s%E@U74h>yN$iBro$*@5X2rm(<(%Tdl>zrebn&9NT*tcZ*u;R9l@^X&V zJmDog-W2lZ*krq2K3*Yo#tE_8!&$4D%yp`R9RHGJ7LZ;FlL5wv7?uNt-i(sMhHV+@ zT$$deTIxL;QWAnS(<4(|y*L%Ge@I$D*kGD#f0h}%C&Pqs_ z3vM|v_jcW5wK!ozVBLMO5t_B6~8u3_C$xB0=ry{q&s~y zKeObumB2zpWvSkkNJg;6773VYzCnEe97PUk-jME9J@hWC2|dy_41<oVQC{%WaR$pM_FvMmJpn1WK0tVLstK!<7m$qf-*L>}ce4MHo&3c_nT^n! z$}35W`$@nkTd`7w6I``#uAjeW<8d?0F4IQFi;rYjho*mPQs*1guAHfl{p-FSqIlTJ z(oJh&JDbP{8;fw(LSd@)x0f_dgGEC0!Wh;5W-KEZ9;9(>C^>WYdecIc+@ez>BYIO( z{b`Q3;%K_fXg5c|s4D=PV|GRU66WbeU&{fR??(WY*ItjF4=YE#(H54!wpt4DFj?(1 z+|b>!Ot1Xt)OdL4o>0A`f4wbc`ks(SdR|WC^bcb*<1I1wtuq@mHpv5P9}y{T2fEz# zqK213!aE&fT`e=!S$x6_-#VM4;`zyG^A1}nEV@@_w>d~Z%J+<8xi90jF=B={gm|Ci zuWi=16>Bm`f)XE)?4p`&%?M1>%bmt34>>;#Cml!Jf?B@?X3D%JqzkSiAUbodEF5X$ zcr}bOfoky4ne_%G%7A=>g1(d_+*5Y28mvxWHNh5{!H;o{AvGa+wYEA`FXC2l!O$Q& zpXP5b_CTkLqZeCv-Ztd?qQ7}iw^L-gDl8eDP}Mv(GD=CYPVR%e8)3Xb!9%)Db4n{O zlLq`MJ=p>uBP}7Y9o>Z)ZO2H1n>oe6__jX7F)VSo!|6fw*kI>aGw~l?3w*A z!+Yq}C%j%d>1(X-Y5I=Zjmfsltc-xL;3@?dDsiQ#t>DUB&U^cjkos(x*;7M9_lc3p zSe}=5l@0KY_B6bQexcG{mub)upvL7cMa<*Ll%*CK>ZQ7$j<6N}KiIn9T-l7(> zzPzoFR#Ws`!f)x$^eq5w?RP(}N((3#wKt%zIGLRi5*(Z$%Ykk>#*`ao1-5)KQwdtl z*|#dvdDu`YZ|YkVfHws-3vK*NWPIXhe^rG)S~ieT_7fCUp!5hAdt{_w2*N2Kte13^ zIqK(Y|22_S$!8|3bj{})@D=0iTUwAWbUlz~*jbS0B1zry+(3r7+6CAZOXIOHz}d+C z<^U9CP9PXZmFO)BYMV@DzcFCmPnazhd!S?V+$7?e5n#dFwg6 zmXekPjlv@F)oNa9PaTIrDjaPCavaegoeEw;^xZdO z^$ft*F}KnQvD#iaH_x8xlifQncpa#SLtonYy7vNaP#C%ol!dahED0LXq(%=6Ht8!u z)>lgwUnwy~8(7!kmhg{&J}H)$*Nbh#9%|Z;`4#k(d6Wi?Ftj1{ii>wi6VECvpz(GI zVZc3c-9IVTUOAs4YSIhE$jN4=5`UJADv(DQDMQJ=r8OlUn>_-P7ZrY~%BR^yIkZ~u ztsgqO1&Lh3HABKaC`)aeTO}=|;uD?84L(wRn}6)>HIz=(+1DRG{VZQ~vt++X8O@U) zqOss4_i55bRS2vaq42C^4rz8^^+ zyt`3wqWWRO*!b^DkorFWvWp6^9dqog;Y#SJar!SrIGi=?0PYw=0gPqxTYWt`V% zHUA{fcAG+W9P=rv&@#i$Ug5LAla;^veq!aaBlUMiu1Z>*IdMa>IC)1rsv&}! zk>suQ-bpT%EOY`Hs9Ts++fZ2+G|~X?8C(u7auWY=t=BVg>}x5K%AdLH1g}ve{JNyRE^0fuM9j*|(OJcaCM>`>n=1X&62@Z>0&mIM9 zt&A0?Zd=06%TA}p_kG9-az{S=p=4U}JBsF0kNIFfRllDPtoS=w+P~gNFAUV$d*^SK&3A-i5~Z+-pia(t|_5d^)CeQG}iJLF+Chs#M{h zOz81Wfg!T%%naZJ_B4}Dx#xb;9C^n&0%r2G2{RTmae9#yS4W@g2rNc8A|3kvMfml z-)U6;ZArWQM8v5Spxxw<)%0W^$_Iy~mQ_hD{_VM}@RQ-tP z6ZwL+pT;pI1TmMdzIMm*y>x|iyHzFEu9VQ=QJdb=&%_TFFx$#=w)nc6R!=?Knn>Rk zp4Etu^-|ni7_y=?PzDlKI0F(h^d`?Rgk(VH529idE~Zt#G#MT8cq(sR|FS}KcB|d# zRh;4)<_l0I3Fj8`Vg}h})t+CD>7b;@aF*!pK4q~X&dWU+hLgFU_&6e=Jr$IK-)5Nv zS#eAbQX_?z^9;iHEGv%GGpTtg5Iw;*DP@bzB|?44oJ?=5TR&f#0uXC*qYcJ zvqZ4>-5Yx=Y^rhEZ+_*aRQA0)SOsOU2(~u<8f+a`G}%cZRs0&+D>4`}VqHD0GEB*X zYM>qG+giV~8;YnrrRkh;-ua_8CS~X^!@+hIg^;NXz7Vc{Vbr3;@_;pBa_N~|%AM8D zwIZuD-}Mi_$^s(7nq;)5=LB9<(S~dXs}l|eMv#Sn?LRlUouN2Z5foAc-6QQ1r6-V!&{bA(f%cG`-s|&e4V>?3+Q7|GvcZGQyp)2j5=ylUk0}3xc+P zUM!3V`kocA*-d7|Oe0~#c%F$iGdjMO zKQkbJcFpAJ3FYyTkot(F!K0=0`r`{BvA*nY#FaPCPyZTRs{))uwTau8Kewv})5pEj@-K#oMy3wT5+ zY;$!(Yr?I_Z=LyPVkOC!m3||FB?)M1A)W`jfugNfbY!#8&(`omow&As*?1!7i zM^C}ug6HagzSM%0&3{7rFM*Ym?DisyD%T@YGvR-E>&y#yb1DAk?GVHP17@yr=Pd^K z=cz*Qhnj9bqmA|4uYS zBR}Ew@IQ>ejrrOJ8f~gqjoNM>utT`m{XbN^i96Ko`^T*$w``S)td)>#Nm+-f++{aO z$TkzwWXVnjGm?;OS)wd6$ue1oklomK#uAf#U&kC_#2ZQJ=l8 zarMf)%M0ApM!%cmQG<=$9x>&%J8oQj3^tZ&pN*4g(j2hTw7rxHda++i;6nc@pp_O~Z?H5uk+xXNJxbk7%^Obgx`i_j-P;-IJ3Ub<9mKKHm@h zfsqTp@dgI8S)ZR6y6a^DeT<57%kgKpeNP-PpxB*J`;!$sZ`@Xh>yyP^9p1XBM%=Xi z-}_zSmo-+mXQE;JVvQav@1!{x98upFSk!;(rQFnEkI4iCsL{4?)K1v1nO**A*=rO^ zGuxhDYcMVvk^%7g=H6j86bA-nZDi7Bm8hayn_c>~aeyo@Hb>DIZh3;4Z2H}_k%_Ea z`K5h9HW{BAU#;@oFuBvQIf&TZkNtpwlGQYfotSFgw7VJb*`)Hx{1v4Hz&-U`Ktia?UxK*q>ofe0)4#DJCa*)VcWeR_@7Z%&8w0I>3+9dT?jWt=pnmJ1ogW~rR}dx7 zSQ)R5)1^BfvOS~2dF^tWTfhPzGrkws@4pXV-dGW+cO<=dqasNBGd=yZ%O4U)?0kB@ z3$F3|GRjeObLCOdNSe3o>c2BJD@T%!-s@I|)YeB?f#w7QKh*9(p&$J-VwXbI%rn}T|fPHL|7}V)yJhuGC0WVcz&MTJS){2>5 zj(yWZoL+_1ZZp|$D=?#XGeZrs9{o=eQWGEFy^c|CO-mDyEU>dSWVGQAD>l`_=YIwlfVULMyTCoy2x^krE7tYXt7DpMi zfLFyv=i#%2)X545CVs@C7cY`WL}6p}!du9EWjjs#LH~=2S%ND7P>G1BBsm>lTsj99 zu>Vpf5XZ3`v;|Wv#(uQgE^SQuJ`93qrKHT7&oInaZ=^Xk9yUQsrUOsVT5VDiZ4KS# z-3lrF^k(yYcIR`7yhS=n=mrW)ABx9$wW@$L#ILN#c+wuaC{pZ4+Q0+Sgh~EHSk2X@ zpro(3=k_C<^~~jBL~M%fYOP-z=5Ryp>(JB0G)r1|o|xqGx>;`RxT`>7OptmYOC9rI zE(ZD{X`5g7FEa?dG3i`xE1_MYQDTE{y2@~gCj>s)zq2RwQuK*#>vvsdwGk{=%X|PmF6Tih z%<~;9ZR+uLw=T9|6Fhv4%J0hq{&fK-n%IB?VtK~1*u;2m4a)$mC`qF?;92XK;E6w_ z|5fDH-xGWHUm_j<*z)b{`vB#XzX2G%@)$oycT{4NQql)HVq{hYAi%cpK6V#6@~pBC zhu9>n@L*Hk)_ihVwhx$Y0kx)*e)d6zgN8inoahSne% zgcrZHvzKVemsZV0rLI&L>$PscO^vU_rTN)%BQ|aq&`4SnquMx?m&i!#`Ok+^z{7aT zzp$WpQ36QFoJWPlWz_PPlbd8P{iBG_TX-~pZ%O77zT6iF zsBrlEv0uV+yfu8p^wO7;Enl+@8DQ{{F-<0}T z0J&s=P6be;N`ot630{aoO;;9S(h>*Q{zVAD-M7n?HYVjRyWW&(Gk*f_*MVFE(fTcr z!TPmg{i81&wb9I%eo*fZ{R`h8{B1N0b%?dUsr_Fy?#==gyj- zUd4E)60{l5)~Aa~JGxFMhg%x7|H{b2wR@N3$)g_IBJ^$(L3D6grPC>60JnBrHq!a& zc}!{WQ$Uy;;z4=HNx@+Ef0pk5v%h@cC+~h?zjr7e7@_&FAR!nUYism#$t!_hIW{_X zfLvfM6wXraY|U4CeV~CLhATbP@)n&ts5E~g>MPgf7aG5mnsl_+p<|W0<=a&8>-L0o z)Wt`RWi8!YPh^yn&?y-SB!v_6P>8DZn1E$M{&EyHSvsEB`HlFoB}$XHu73tDDj_Bz zkrv?mTVr7rR9Y#iLDH=j;@l8*aRPjF(rohW!ao2^T4yq^Ut7|OUlN!j=cI3T6P5x) z+~P_{uI3FA4XwSx$*y-1^Ihr&FZt8GK)NaN%-{FU>r|z~W z@@o`HC{~k}LpnpER>}ypAon!4ZFOH^EAKmx=OAENCrY}tr;oMVNWm>&BQku5*l8i{WIat*Xq$Hb2t4V|40lJ2w66!G01(q^kyFmADm)pq77+YCSQMFP#Djtv<~A+#P3&Ft$%O9|H`$zyIy$QCQOc`mmYu74 zQ;GTq_r)e1M7oA_4hhX&36xcnEP!7A>^IqZU*|6N2*8i{3MvtK1+4uDeUS=Aodzq) z!N%%*$4U|BM>a%^;Nj5DTg6=pb^GY>Jf*W=akr=sAR%!6pFVXr0369-4#4oZ z6hd0x8N?uZ{`0EEdcFn9gUHZ7i~~Rq9ya^gES}28hvyOmpTIx;e|8dAY{)fSv`)2- z2GtM>lmR+ioKT-Oh2({H&%)A2e%9d|kQ{&z2 z>gEE;0A?S5w>Iq+g3pi5HK*+&G~E5v`faQu-fUAFdLxdHYGwjjL$Zw)(5dsCgdys}NIkJhnyl}fv;Q^DNLNUVqP3G`&9 z{nrgmy+;>{j#>438FiFxHclr%vYv+?#ci=z>a{&8x9y*WjuL`NzVA4cOpe`Cd1%S3 zktF|k$OAVxsp9|s)4v|1I}Z4zq|(MuV_SCldIoJWNXk%6uG`#I{)H8|a$ikyKI0MT z8d&iz)?bY|oz*)Gki2Io={Uxeu45<8f5z-^U@ZW0;3j@ynC1?W@Xw2*kHS-L@R|9@ zP3uR_y+z|uco6G$RErW}q9ro?#bRx9%zw&Mu-$I9)4ni_gm?A|A}J6#op# z(#z2iN9(^654>xzQiTO?KL#+)r=bHEx(+G@=E!4WbBInZ{2l3~(JuJEtM}}D^ApIT z;WfMdAzfVNz2^)ZzUIZL|!(OduHyV8N4{Kx|d zoyx0Onf`DZR~k>eW`N;F0^fy?tPhyDFRgFveA`U5SnA}r<7r3EnLja0lCtzC)d?fy z*ShH$PUpHJR!=KBE$Uts=g>M*YajNUuTwxgC~qKje1fofC2UuTBbpYb6&WqmxSt7^ z8qsRq4k@o@o_yhmPnCj~X_eeztfQOc)jU73;$}7yL>m_Nx#IR7YD;;vHl}2}|6Og= zxB?t|m>j5?*?C-nWviW$^@p%oH$)XuW6;aDvnnMcfL2iH9|aaV7@J!2f$@GQKlrrrezm=CU_~dc3xq*@{?t`L5WM3@mK-}E`NRRGdv(9GSU7e5M$mo!$?G6Qwn1GOcHn=p8< zC%-I)29V5(pgmLirY~t9dGhg_)F^$2e(IgY`Ol}@E5?I?hcuZH#;CWC8m?Q4R|1xZ za$Y+9vh7CJj6tt*(C%`scrEQ%#9wYY5fOfqyCO~_Lh}v8F`wI;tb#^0Bhbo@Y%Xt4e{sF_rV1(07I&?=S z=DHl1MR>B{z__xKe+(!aumVoo&q#hpK6c0U2H~K`q&5QD`zA6W|6^KaYVK&YJ>1%Z zLck=OAZD@OrG8GSlym&`2Z$*IcK$o!63g=hDWJ_Xl~&+1CJW(q)ifUIkRigV%udEw zH^vk1Y5bV+a7AOGA_9`TvSQXJ0GQD}c2F()n^x1x`b>Z{vq_)x04m|otCbpL6mkYp z5rjQTJ#d-JfVRlxS**Kg7kaKp2q!T}tc8TvhFzuoY*K7!r`^ib0!96&k&6wM(C@|FV9i`CU z^XVb2yWOglQP;fAu1VH2bWTzGMOGWIMXjcM7F zkWlTy1c1pe@VTnexf^QvA|`t_Qj+&HwQ;~P1o$6}2=NgSPhGw&(_>R|Jefjn& z>xzBmCmqv&X4pkIo7!_zSVKgs1pc#&k3}UUSP>u*)iXz{&n8{;&@*+2&G>{FljogY zYTtaX@KKvf`BnMg{dbLBjQzUMr4qpG0}b-2(zMT@c}fIcv9a`$TJb?bJL7FtDg0&| zT>j;EX9GOgUV&p_3I2RG^iYp|O9l#) z)``c_Dw;vTQY$ZkG~HZ6xr{I@m(b!O7}Nq)0J5&Z*~PDD`)co}K+dR-F<^m5`^i4G z9itp89}R;*3F;I=hTe=vl>TAKsz$y*1DYuvbkH*(kb{WLB>A-pfIHsl6J-yjTI^MFn$mGpYFViv9`xr2#859p7eGUp`XOjX0&+)WVxd(cJe|h z6*nf)Ke5Pjs$9wo=|eBhLGTqellrE*)$LuGQm$Npj;^R5HTN&Wr}k49zK>peM>g#uH-Z9?DEg+YKIDBy8+Dn=k4SOorSNk9v1`T z72HRBsfgq1SG?_jw;Hy=v;jyHqznC+H>akr(=U$fe?9*MWoWxnpSvG`&nC$5qRkL; zdCcWvonH0>UTT`#+t{s-0=bB{DH-pB>|aMhjIU=6(u3suMoGtjXhoG`*P?XVkSa6| zX@c<9F)NEu?^7VykZTEC7#se<4wn=wh2tB3b|X*#8Ew_CllpnT$h($v=XaC*aZSGe z)9^7u1RzlTZtYC`U91gcd4gZZ6g{+(*F$iTK=_zzJ}z-Xb$_%1KVITeoOT0OHF;?F zn$)(K2(`U7yvuNAzi2>vbhz;y5qsg@V(mw(y0hOiM((KjJ$W0t92@{59H&R@VqMBmS0zNwt;R zZ1|is3r&T-Z5FY0kK^*{({b|jpr;**9UGRmr}MW)=_0{I(JilG*Gj_KScVr1)0Vl? z7E*h(EW_pxg?*53Mc?@y?DB8PXXJU3@t64@eK`CHnp5udBjmARBsBN55n1sc(wwl# zoKYTm_T(|>HdVOTsBX`&m-sI%ef~7&BN}0wJMH&BTT~iJ>1Kbg+pDE@0h6qIH0buI z*H`KC*IdT^b|co!nctDIdR3_V**m3|MnQv{F+MW!!`WTRo9y$A2eo{kD@5gVni52j z%^jyp_dC4bh-Nw-C+=&~PK)^O7yk$kdms`KfPDEd8%WguSUyn}A<8N&gZ6DCp70-u$WRbE(uumB3yFxztXx_RHJEs9->cp>{tSl|lRFsD|;QG5c#MGdso zu9om4|I5J$wlbq0z5z8gGdYTHs~HUYH5orJ-AgXtATVEHRpT2`&39`TIOxpI8?N9# z86)kxsLjMK`XUd}Y~zsTP*$YWx4{3Av>*8gTP{Q!P!sj8>wW9OwaS(_;iU<0G2@q2 z;yQLjr$P&3S|8>jUv$V|&StqoKADapHv4=yaAA4~b{W)V@SvYT??Aw@3w0Uk;;5b3 z?i&^Z*!z5(ce(*R$n#ez?FxZ&D3$8rGXiM3xzpEkk92&$C+EmJ(os=5rmEY7d z9<`HhRic7wVyMbu#sJ)4S$^8(ub7Ni1n5fvg}FGUu?=+JBck14z0VX{rf3j zvmopGSl1^jOv$_;6@(c*rw6Xuj?=*+gBPugMq@8a&*tc?)DGL#gZ$f`-v0em@eJUaJO5 z_GT$=IJ{Ankrnf>v}~XYXj1y<^Jy^4x;@?H)3`Xnp{vw%6rw_a5GT{4Tyl+FbM-us z#4ryhz!Qpc$^1eRlJ)rs4zzqbg;((Cdb}m*bv(`e=odlWW?*1%K<-ER&iC1>0w z%b$L%gwL=WH(V>l9)tcj0~?zKh?)x|MI?Qo`<>O|vvms9kjxrIjLfq9cc#@~kBoBD zBJnN;5?lYJ;5OjUWJqZ3c9&Z#C_W-3L%?EAktV*Kae371?{Z!A;)+TiC|)af+B9YD z)8kcZlGn?qUgGq!MfaEaz~GI;F*;ZN+G|-5s7c`RnqpR}dKlQVB8Vaanh#{!ym-C9UK1Ci61O?Md}`M_;q#U_ zJNwXzhL5x_lh*v_T>rsCfH|dbbgW{*7t3t4{}1uoYnN%W_TZ{gxcO%7N2p4Rkyi#epRlUQZCwPG@4p`&@J^+NcR$Rw`lp{f`+jw)sJ!)NDS6L zoOozInA23tH%gB=L^G1`jR04B26BY_2o|?%e>X>2^__vlw72Ky%4;Fp$F(prz4zh5R~Rp#0!;qh^k5sOoNuN0 z!=b4?5yj>h=o!k{CyEfVgnu^X@{*4Hj-;&7|M6Ibe@j7m{}#-+6!ZZZ=}d5w^gHM&p)3ct03oY(X4Pj z`MP4wu=go*qBy-y(2b)UwFdH`@-AbkMvm`{NZB9gyBF9qE@f+xJVS@Iy8GE>N)ZA4 zljOWtZD_?m({s96f9SQ?F7k$LyeFc)I>9MXkl`y&SLg4{e%^(H4SC4#?|(rx9jF7Z zcTAJB)peF$>1ryDsM1rHBI`nxNym7p^Oi%>cMqTO#PJOi?D7@ot zR&AKmN4JIaJNK)Vdb%VFW%+(qW}C+jJi6J{6|eOALYH?4>s1$yjEU8Z;jj;WD&t*d z{zO%jZr7oKk#V1;s|W z2fWyQqz^e>d%rYN5hsocmXSG1P?jY)FP<(s;_Ju;I%7LoFSlCx8xxSdDS*6)Y2a%J zo6_m-uNbM?NmWcuwDP=6YcPHpIL1sWg>0*PDemgO2~V&~%?o1)q#WekGjFu>{5sbR zO>4@)m$nB7wQt~d@{!8wS=zbN%f-i}9_MB^ufpsG9!+()SuwzX(TH0V!^1GG&+pc5 z#gXeSc9+q!eaZ7y)GX44w}P?E5mMs3CH$2sbsg5x{(Y%u#FA)obyU;{6TwR;J3mB@3DMz@WYT_<`3=S8I(-a(gz zYkrVb(umXfwg1F}UI0C2tbH6PYkQy!ASWU88((yAm_{P6J=RPZ(K@=y0oG_heCE0P zc^0H&ljcV>-ypnMm5oYA?OlB0amX@54v_^+0a>oy8}59=ar5>rzZnj{IlrFo7WjCg zZBSF_b`OBFo~}H?7`z68ed+w4Q)QY06_%!6K0OfBVIC~CA`PWE<&NS2db*)HWBi}= zsIiCp`$Z1gy=`{C`BQwRVxaQPexY&xNV=Y)3o_ipwP~;j^?tfXMf8~08})@oqY#`v z$yN$b*#E)$SzN__vMpT0ZBDNjrvsxqtiu#Ya)C5_&%D(s{pkv%)_M(i@9Xuy2sp0_ zj_`WEy4lFI6l=CqtNDhwS@eQqXk*d}ZcRT?r>;sH!1s0gX*}oA?#~6D=nGn1>356Y z9HprR;fZpAmJJkc!_%tyeRneR5t}*F%N7{Douyu0WH2eIJ!u!7Pi!o;q!#+K&RCNS zr@6JSnnPq)R4LOaNK8dAmtuNB8$zGBXrqD=l1BBRFWHL0h6 z=i%G%&!4v-h+uZ4kEJ~q|z3k&`%k>$kWcjky#)Hdq z5^iqV{)OJG`z$y?(b40Xz@fA26NWl9!lK=l((KcU%FdTtD)W3#n z3T7D#n}5AUHUU4@KZ7uSYw}p%w`K0(;;A)y&D#&US|g4+@t&sbcP}-yL)isKbSepY zKt7-AmIW$JA~mraqC?Tq#Y@6+=}G(|HM{=BJ|WCroy}b*c6^@>DQxQdB)Xa$sj^kC z`06w<7^LJyJPYTBU;nc^JaR>h`jHjL|@dfW6Kj!T{eSON5=p z4G6f`e3HZ*F%yF3O2$DSpe-_S^|?{-21Jkyjr^;;=h#VND}bjaU~)G&AurK|O(x>eI2yVojshH4) zBs{sdZMEfsDNw9-I0dWGPrc((TCcb>g6go~iIE!h|^Sza2< zn(W)So=KYpA!f0^6B2!Fmt7P~yQH+Y#@v6Fvd(^u5?L&g`FhAR{=aDacR-X#@TyDe zU2L2no0y)glENmZk=CPTzl=mZ@hhTFkP{9aggiB2h?1JW2JZNV@Kb2&VTgaQzzep|PB14WDJV?(u*{{Ff1)NB$i_@|orq9+UQ_lY;)rul0HB z12?N5XksF0RqZYl+wf8ddXV*r_Qms)?pfGnb9m#fzh5#0JH5B`c{_#!8!f)a)D*9B z23O4ifDEmD>&qKxKli7QPd>>N^q|^zYv&~}o>S0V=JoGQ_L~a$0>$(mmci0VnZvCl zpHa|%W+=|LT!&L}iIBIS$I6?&{=MmjB-t;03MKzfeNW!&+JF`4W8ZaF_?e7;hUZw3AbhnRIiTBB@h=g@HtXz|#ITx(m z|EbwR$)If2x>IhBI~m^t|7Y?)v?dumPu(p`n9gj>4A`K*HVhu@{b*%#%eddzT_P9n zHfKjI^w;oA^XUVm9ehb8%H`rmyDfA^9z$eT%%}zatblHTg^dYA{M!g8N zKRhXR$Ndf7nnXVOtXOO_*CLDQv&MESO5G{N+MxVIW*B8g^ymDEy(jvV=mv!eSFzxn zszuedqE)roYWiVN&PZt!IDNJ3ZRRWaZ$}877xfc>73dc+pAW0fn7SvH08Vhg9s*U{ z>&q`&O#?XXI?y(Bh0$a^96JY z)Ga-)P$+caxvtvzz2$P76e7nY?QcVEIiKH4MW$ia}fn^Tt94{$c%`53Th z_6ZP1;9{LFC4%O^vqxOv(UBE;RrUjuGVA$d{=*XQL&i^?hD2UH&jv%45`V~nJ46z` zG=giudiS*Oi>CUo3gq0v%qKI8f7k6v<~4{u)?QO?lfy}3uL`eftow|BSZ61w{~Kj8 zfsHYf#4}SA`)%+|s5@Sv@0QgTE}s~6S!_u19KjpaPJrNz@&~*PK}O3}?Kqc`PZUjM zr0nw+6|&DSLTyh`>LVMeaFC7q5*M*v>a8RYjlMw+Nc6xp&#dx}Z zYa)Y>>_x2B|bBhvp@TAKV1fIbcYb|tv@jGXwzpfsL&Y38~swS*2N0=OtXb8 zY1}1S=GLab#mLB5saqU0<4 z5zb)$cT_@c$O`QJ^z!A}yanznc^;dzlLh{5>yY)qpime7aLb?$xw*0x55^T0oFN|Z zVOM9He%D+hfzEbaB)}?@7;OMk-%TooN2R1qkL@S1r=~+nGAPPEp7Fz1XY!qfDyPHs zP-#2ds-o`d`o}T!|5FUu?BIPOYk7t7_&6oDRfJqI742iv({$N0V^cuaes;Uf%XWRS z143wIQw=D|dqk&|sykdc>xI zWkW*=RAP!#R*m&LEiW^3JAWGvm`k8XxJKzaciYv|&(x9;vgh|T#qt_l5mn*{%B`XY zDAMmH-QL$<*Q7B)+N&@gJgVU~?qcTkGNWGKn?wuh8Exq=rnW6b-Ni=hEPVF39%g@egNGUPpTUzf_aAwb`TLi;=b?pf?}X)>zBAtH z4|CR+NnEL23VS6^(FEb3k=>KUu2p(8+Jp5^+M z+Ak{7-gaVE0&>cyaLoBg?Ui5i7Kdcb(cSEEtna<#(#c@ z{cv(v*!yTS89wpsf;C6KcjqSN{#F9vG2d^~OyZ?h(?aOt4{hdhNarrh z5r1eiE*dq=?2&f|J~D+NY4jd6fBEugV@REAXyxj#wq^NdA2aqo4{`ZMQQ%l>CX)c! zwGd(XV{~@$fVwWvYD6Nx)7dt_@(rva^CR9aL5X)aF6RB6)a^s_*0&>#X9lbyWr0hN zzf^8tXc8Aw8ieU%;EmTr8^R7^g@1})ijF? zCQ~_8p87)phY7ad#W#jvp`m|o9w}W2bz+}Alt{WD!HGWo+d_gwO8sjY(3|Rp&Oq&> zt=w5d!Ba<^5wx{?vEi<-z+Y_pe0)Z>D-Rb=pWB5R-C;p_g&ipS!@OXx$qDW17Bt1i zO}*l+SdBCBEAXdR_&-6vDisf`!dG(1;xjug&w$-`nPK~Sfp z(|0kgGS7d(`}w!NONbQW;+QHulRHc(Q<&I z#S*Zpvqfp`;ut@#;E%04M>%%LO4dkK3>>*5VD`FqeyPliRnu@SR2OY=L__99n4df*Q5&n*_&lyf8r zI+c(b;s&N{ww<$*uYy#lU{!s0&ZsfVkM``~^Bm}`MqKhqHD>qT9{|gdP2d6YiSLR84~|OXL_R*)Jdt{E?!jG8d8cyEVI$kX7FkNQc%>S*8gpH3uQ@rK z)m(If5Fsk}UgYX}S8BZKH(Y8ZZul^l4Oj0<(AVy1C0+#e_2W22td?l|!FZ(0e$EFG zdSKV9%5T-Vn=rE#c*^U8KbV|xWDeRl29PghqUMROZ_uD+>at1-j|;vq4o z3d~$H0e_ZAA(=BIksMc;LISMmpICV>Zg22f$QiLgszOz>6-vj7s8R3A1jm zCh_?}6r%N_$JqyO+&B*EtRr<$Zr=q!MmZQyTg!Mcag^t?wStb3m4+u{pHUIJn%4ju zmY`4j-58R4!3nky&e@Cy&>RKOWp{FmP@mOIt896KUzj7zMRo$-HD8t@y z-i@K7M94hd*NEsz1pO8Kc(VPCYRI>|SQ^pb$jfN1uv?~x|J#Q|(7v5;jQUKGiSIHn zSzJ;MyGVm`Q&j}1$tcG$X&`k;C5`a~@;C52>tb66{8t^GxokAppW*hK*yKV@-Nm_1`P z@Jb<&>Sp(LjpOvsML!(iKPwToXDD_Qe`1osrd6({!gj0?4J%LMSxFl{2CbT zD-D`ocQzNS7=3*AXet2t9H-(f*Ki=%0?g}H@i^d9g)$0=ojW7-kHv$G*Cz*b)F>OykxO}Y|FjZBTSZi_oL z>?zNdxt3(b;TR3Gc{}04T~ULf`YAeTr@OygP`DA2kQe{dr5AcwZ#jVBdG zYn6{@mWnAocmqc|jA1Qo4Yd+4f%@8U?7@getkj~v8gB+U zmtT|Z9cXCmi=5~i0>(hiU8f| zA3295x&Rqn-|gMCF3$D0Tn!$Q0tpE$3)tPpg%$rm?e@H&8_WU@V*)?$ZFZD4rI0xv z**Ks=rm$*8vjpwRNE)N(I5pLC(teTNjSjZP1?-kV=4+SQn)2WdhhnFccimkYn^njQ zhg6p^1BNblbqiGoI7n^+ilh}1!>WpRq|T_(BOWOnSl_1}{*J$x0b7K+*gZ3qu5;Jm zmlfb$b6dOU9}yvvISi6#Ix_wo2w)0Jw%WPCV?T=zhH>%?$xA$7Bu3#%`i;FVG45(T zfSCT!s5(iD)X>Ze9&6gC}J>NV|B%4^j(b0kQ*Zj zeep3&;jZ_Eh9SPzDch@@;J4YVR~y?^|zw6Ywx@SLr=%>f~Dm@;h za9r<VQ0AH-BpR{L%=x3wpRs0(r6o=<=ma3Y@OJFi3eIBHbSa; z8~89X%;%bvT<6z+No&BrJrLF={_mhos8i@)3@gmUoOI&z%$}#YA4U~kbgc+zA5#B4 z7@pCpXW@$fG7?h#{aMHQckJZB*?y5N>=y`&df=Ki-f>WwjHOd%VnafVasoR>5)Nsv zd8u;Xw8a{$(5AjbB|I8-p(vnAnG^23fl+m>p4t~oZV)r*VLzvC_;hLQWZ1Rm7j*fG z0w>vWg=jfIUl)XG^i04ff5htJQ2UWyP+I56LxqnH0yj);ECs0qu5ucy<(ktvfay5t|lMzzX2sw}k4w6KP5FC#3&*ZGu?PQ+myFCw*wZ2YFwp zvAT<08T>vKBbCd3bP(PqQV030vAX_zUnCA_eH6uSds5rhM&rgCO=dG$em-0PKK$g! z3igZM#UD>-_z?nKcoh8V_dC?Z^}f!+@@az#JAW8?u6zw3$QYI;t=u*yhv$qra2+1G zbH%O|kQZl)8@t z5!Mf%f-T${3!FSXsg<=X$BgT|K)d3RBEr#)1{TQjq`c__G-4q9=H(_6WZ+HK^NRF)$nq0)D zu9VYAo{GZFM9YomLhylzRZcbc<-TqJ@FfwrrKWCQwFW53O(L5IZm9XO`wNDZ5i;*Br`9)lng9~*Qx4EzFr$`(2B$U@$`A|mx9;< z7}QV*N|q<%FM%t+N!V&mzCC){nge=%0tw}RCHxo4_<(j^Tnig0IwFYx4B~xXpvgN5 zIRas`Hf{&8PN&)_d^2poML|w8O{F+)z=0U7P{hhLPeOQ5cMcmaqCH`HP=C6wK#I*> z7r1&^41RA871tLgaU@_=k`QR4f#eInz^lY(y6fMkqe02om$4HZ7cf4`UFb5Hn_Eh~ z1sGIlT&m^dU=4Y2OVsQNO{!h;*wx)3CPKE7dwmCF5D+iZEZc+or&tr`X9i8e&#hEb z%||C!D%zy%PU-v#_6P^9TqLAVDyV?^&iAju`@Zx`Sl5_c3Hnue8spt$Rlwdk5!xeOKeRoTuQ5T1BRuJfTD2Z_zv{M*3T0)j z>1iLd{P$9WQcsFtz+PhteBfbbti*H~Co(z#S222!93fJQp*HjsQFD()pY|;jY>>eR z=G2O$Zv4nn-xc5n(!VbNc3%Q*8fnbiQM~v?8AVo0!!vcVPUdSu48!|<7iG(jngR2^ ze>3u}Ap7@vdr~2@Q$vEL38HH+x=d8Eo`oG8O{?J++OwXyHF*y(ZN4{#0)V2$#ecPe zQRuwn!$dJgIpJ5y|A|O?l5^EMSpX_Njv``E1nPrv2S#>EfLqI2G>R*)umq7n`l^3!z`)j7)iIZ`KNyEKH#+-1cs zekixarh&*GN1shff4r}PcD&GM_i;?LAA{JG>SWe< zE*V=X+6@QSb16n+oPPq|g7}s#PkaXaB>A!}J6!AaP&&mvs{AKzhx?_jjL7qXgl6a^ z#PwU?$FZT)o((?&E_qbuplpi@r~qpm7A)@`g;%{}vR-hs6}g_--r3h(km0b&a>u)-0l3y+b1uw|bYr{)!tbh% ze8Y{m`vONLk%U%p*yOa%4C`H%M8Vt+IIYcJ*kfcNir-9YhAHor!375BudD5;f}TJj z(%R%Zz_G@1mq3w(#Pn)vK^;l5^jQr&4SHb~wGX~G_1s=h)W_MVsxgRJtw5W4(G+69 zV6I2)$pIA3VfqFQ;=1l4loo0|7aoFk$8EwT@Z(nlEwoQAK9dOAe)|{M*gh&vp;nR? z%imj#{f?JlwcFeUOT!tzT#ib%g(ev)E^l#w;Cr@jMKmw9GBj}Pm`?t`Ek5z*)ZAP{ zUzG5GF#eH(PTBi=-AaREw|GrifHP&ML`!7u&>z0zhR>fuxkABP^-D*w>aLK<)*^`y zr$%Sxr$6ZO2M_Xl{ApuQPAlm@KNNd<_o%G0)gRr)e`bw`KT|92Z~L(muxFx$`2)#P z0!TcoxxcOoESi(xU$Qtfp}!Xh8Qe--a|CK)Qq%m`aVAUns;;GVk*cUb$ zs)_tUFBhSTdu<}YF(M)#ID2UNLWp5zEMz6P*VkA=BosY^3QQND{^k`5{K;P)yByHd zCvnPc)*94575WdZGioD4)a6ar=F3&V=92gTUL?PUG@X-AGFY#N6+u={~S1l%9B>S_-Afy>On$7Du?-v1q+e4QV6EZB?M0l zALFaUbXoaqY&-15FN#sad}W2Z(ByF2lPhln>JD>mg&u{}4*3PUT;@BoUKSz4i1=12 zSxR+B?22$#D}a0)=CD$~hKFVP7^i3eR zxDrwZ3M}85R<(nR2HsK&I%TK+?e+3FzlX&V#Aa!JEsRXw`)=^MVJ=E0;5@yF=xl?J z7N9p5E&L$1zdn4e6|&5YiH0t)3+~zC+b4dTLA_Kr1ijbm_t1MvUMw00!GezOcy8^4 z{yL&JMS8lF(YN38CmlTgsOo@!2+S*FOzTOgZDd?L^bJY5h-gadS=t0!iN$!j3mGZL zniM-OkBSQGrI(YHfy7IThsveJN9#p_t`)YP$sj=|H^hw7*Kp+vawx}F$veXx%L$rj z)8;25H@|q-qOY9CbqsUc>(%9q@Mj%EkkrGmLG2~kH#2=0Zu_n$8J(@5 z(8DT?F$moMoUV9f4+hbn9iTIq1QASEesK|PwBMf{8b*NpKU}?wKhypH$FC&UbuCm1 zIjt_0t{he&VytqNO4@Z*&TL8Ld`j4`ErcXg%F1C&NQgO;)0~en=d-pEa~hjD?7ZJ? zU7zpm_q+Z6hu8b{dOjbI`{VIm7F{k80-XLB4qDnZ*7^PGtt){zss+4?E?t(OvJUah zZ-?$yEZ4-%TCrN*T<*u~3~b^niWfJe+-m#}JXcPwzE2I#puL8xZpOjq8UY_4-jEPW zkXdIoy*->6Ws#_v4{GYxb3_jkQkTs!+m%#Nd(!v#QzFYdo$OwHNn5|0ZB>_FX=Is1 zer-3HuPjpQVGjw*D;}TTmUszt|G5kDAEa6iV+F@iB`nmFG`P!@fw@Lpr6QcLPXYB;@Y>naT)DR^P*Al>=C;K&DB z$EvjWOGOMM{`fU%UIar*EA&zDwPq%MTt6Ke51VREl8&MjX~^QpChHo)-Bu>x7R(f0B-x&qchc2R@5+eHSid zWb}3D8&vBZqT?zg1I}yuH>hWP=%py1pMNWpzWq-TXQ`t6?e*!)dKd56?EzC1r3W5i z6kz2?i{2(O4@Z=1L8R8UsYl zJl0j?Y|%`ad37hPoJtvyzj1LnJCV7H#?PBG!zdvGFxq)U+qbvn>&cn)zQK|`h@_9= zOH({<_99KZpjke8Bch`^d%@#@IIt~c!h=t?+V6Wjac%SuB|?<}B;_!Gn9n4aFkIoa zi8I4h@_rTX=KsQ;wwjh)wrpKnKfT8^)qji5F)IRxYS&Cyw57u@o;V`C@gV6u`s&6`siWvP1cu$=W9;# zn(TCYwpc{UlNDZvf_tF`A>P2EEem+*s$yh(43Kn$n-D#fqAAUZ#L_MmDJZT?swJ^= zsxo%m^!e^p+WY#N0k<>`tWbjNq#?Ljml4%VK8}SzwbAua< zv#o5f_e-I!w+kjm+Kp;*A1x1#b9uCFL!p!|@{qkZ1fPac-KXHo44XkCCL~n9+MUb~ zRjrQy+w;DPDY3sDpgTx#;8Yo(!emkpZXINQZ;sy_FinyI$=*f;`NZY@=qq#Q?-a@` zjZsD_XxPfGNX7KvZ8Z||GCQIvXs&q9nqw^k;xDdLQtxCo6q{Q#0MKu@8k7!3?raqF8=|!hE{~qR^wNawG*jHilMAALoL=9a%AcvaZa@xK)2Ak7myt#pF2)K)8L&pC_?a3rKqI31p!+tGD?C55y#8Q03ve8sC6nW3=Ba z((fwamRTE}bnPZ^xL5l$1AB|VC4zro$JC^R#C<9{TDRUc3}`w7=S{D<4-34l^$ zd<;D8mCviy3&aMwNg>6lBk9LvYmesDv}l#T`^$3Pu`^^Lr&7QGV0C}4*X#?^jXIK? zuiezO^YvD(=xGl=P<#65A?2V1;Pmuu;zPR%y(~dyG_6<>;cyaWJC!83;EF+0B;yLU z&qK9Zv1gh2shiWHS5vWIVn1hO2}J|;JK@FIaOR#(i$cl?Ah2$Q7pwA*jc-`T;^t;KJ_!$rYj#xV?K zgs*I|`w_k%ZKyq+-wq_%hGA4nim27aho&(gwLggV{xf}~+K$ozqP-rlC=INV)EC$! zt!qnvotqODAhJ@~n|QaUq|sl_N7*-3mmiI1GC~)JgW}B%d(d;2F8^AT6HrqXGpBl= zyj#9+|5Z&S-@|BdVl;jmVnem38@kKp+tDYjf7~(0lbhnNZ9ephXz)INao%vr?5G-U z!V(M1^ zyAU0QD$ns?w)Odz6waMfIZ~Ukk!dBoXmo$%^E5l<+T1zf3^zxK|M(09 zHC$xLVp%1&|6Py)S$;cOue(5lrBtR9_%*|yOMr0YO%?2m69*FV!cOG!>L^dUeHven zSloDF3laRD__gS35S};BiFl*<6e0B6cQ^~un{%NvKHv}`SXV#34bhDScUlXc4WktMGoz>JfLm6(VXvS_VJQ3yITat9lFF3MiroxfN=f3M1=PV_Gj zk=)M^zpK z)$%|WQ}09AXnk5gO;wASj|ER$Ot2;Y6Aka|E?C||KT{EV;<0Uc+ZV500U^%r{dLyC z)Dg~s4#_zWS(q1YjNK$-S!fMpA7Bp@A!qA*2bOns5)boVlUsY_6j~B1o~aNiCi)~p z`eJMghe0WsK-p~?0RH;qhU)ffD%hAaO;kU+(e0W>fGI3LJb3vK>rkzF#{dF}$s z6F}OZVza8je@!s8?In)*JKM3HX&y`7+paSg8|1oh4>Nh@X)!GQeisNUUdr`^QPMT< z#lCIXQdwQR(yq!0M5Mrca& zB5bMGRV%c$AND_M@XlIAsCw_GGCb1$oq3H3@zxJ0i=NWLrM$w+`Jn!6Vup2}^TMu6 zJe$bBGqjMhQI)cxgvwh~-P=Gx z!WV^Rr5V!L`gtD(-l4s%Ss;7MsUeRhMiz+sEgJAXMt0xg19^PFMeRu)S>OGa$Yq-i zjYET-b=*s%5f$4C(uTABV{|m6J>b@5fSI6<=44#uAN3oz>_qC;wMl@Ck(tSoFQUoA zje6B2)GvuYd*M2-gl>q&x9(0}Gyxbs|LA5}z%08QJ`t{B?Gx}o)KE3IWrvE7s- z%x98IA2uP0EfuUMuy^p0LbGM>ZCMa}t+l|DePEEKA8X}CHNmlyQgB#=0<7fY*|H?_ zure~GY6_pBb>^CDE>jZ#a#~~#t0S8{+%$0vMzpueCxy*REufk)fz4K^XoQ+~7{YBV zGjt+G08RU`NM#Uay*P;)3t6J?y6Q3`-b*;&16%x_z|-M(yYuA)tFpHTRM0OEbEaxE z&E6@l(=(z~=!+|(rJUA4eGroQeoeb#FtOp08+tDM#Sey;lwIJIA4q$;h*j>S3?U^o zdlN&=+?!zzF}1D9wD?;lGkh{d+E5!@JAZE$d9o@$E^EenLdJOxbN|Q> zKS<55%Ri~R3Y?U7!fX}5S-Zv{?`_H1i!EBZsHsnvHgmPeE9R$A9nGSgKgolq68&J+ zV@Bbc8d}{ohjJmkT10PQ;|()sq>%A9q!+5LY=Lcmbkl=h8cxVUK2L_vogtP_Zemxi zxE>~;zY(vm=bmr>#{|1D@*auy)L2LvIZkf4rh4=xlW7>z5JaZwFPN-wc^<1y%^jfao-kt9RuD&jIp@&tF z(Xi2CE>e7f;cF7viWp8Ud0g7*Me(SxVI>v#+vqA?yqR9lB~q>>Ndg3o?Q)lTWgkM@( zQ%2u0a*@;Fzn67lS52x6qMh8UO9lp#d}il)N`e80`?!-&V}yT@&N_K(($1t1x)M0w z<$Ud`trH;2)cP)DMSpt%F=?{dwtf;5KzSD_<293H4ec>!2V7X7I;I~XzTd01txm+b zTkeOk2c&Uvis@o$bcgm_`sHQW$BQ{~w96mb(%0kB%Mr=FV=r z{8nA#$t8En&*@v6;<}cMK`+-$Fyua)TJIttX#iA%@rG_jkys;q2L{ z@CLcM^Lz(YZ?^LbVT>swd$lij!zanw#m#-|=3}t@Psx^XpP$3g&&w-Zw+M zs_V%Ks6S&KOvr_bjMO=W$b%sf_!0Wyj+jbbrY0^!E7%^Y;@1K-#fVb>|O}}LlWrTtbqr=Ys2KX%Zn3(e~>d|A^z#KM7c}l@bajsBZNsa zcF9^U|Dfh+voe1TUH#?Vkd!g@U379oXFRH^42y6$X_j%Kkwps{VSS%#cxz{=gf4Mb z;D42XoJ_}7WKpY&wY^MXV(uksosztb56qj~2o?=gzFVg+T2vnY4c`|yE1pq{Q@;2y z@|pO_YwbNz_}b5ct6LT@lSKBCy@9Yx0ft8B7nd~t70#I56#;4imoO$bZq|jv${le; z|3sGiC>w7lVFdjnoqZS9@M=`X>l-4~LWXFpIs`8Hm-Aj7)rb`V}qEM|v=a{U<_ATL+Z8 zH16jt@AmDganq3-|4o(amEi!kM|k5FW`a&0$D2`Rzx3~%s-exDn(4`feD2@TsloON zeh%d{aAmJ5lB>=X&5l6n;acV@b9xYR%NJ+N3r%3#Ajx-zl>QP#)ZL;&Q%eq!#y#D_ z+uUFB>tD}if6$|K*K=1I`uue9a2xExrz8^`AG;S3b~fgq?ci}KrE+b|1>{FcvJE*r zFF~&03ADC-?mpUn*1!e__i-0nJnf`!`3VWxVOt~7Bc_0Oxing`9P#VIU{1q}x!WqN zxgmbdPg~yl1Q|F*Y~1QG5$#r#(?8Td=EDOjrCg~qtj<#=4qAUu)DP&|2BwVSCD*3+ zW*;#0vV7!}9qX3MR0LG5fRp&MAEA5)L7haU_)vq(#t`RjguPZtJ5^iX?{mRqukUFH z-;jQRBn6qH44ne0d?bYNcI}4n7c~{o`!AAGM!O3<=e;QBlca@)+nw@e=jp8lp0kN5 z&oIA13*lsV95!GU`Mj=c$DMjbm0R-A&xG*hhx0r9g$}dl)tO1+dGH7|O9xOVY*Oc~ zb`myD_*VMYe%E7eNC)Q1gD&p{<^KqbvaQ&Bf}ys^`4ztH7-%SI8j`PIbQdgtP^rr| zWn?3!pl)@)sijCB2NO6)q{*5oofc>nSjPJBkL4Tu-6B2oy+|!>Miyb>1Dvc_$fA6k zhy}pjkr8X3ei%{s7i%kBPQ8pw#_hPN^gZ6m*Y3l*;Ww6cacp? zkPB7Xb~DIp;=#q^9m3TbM%I*7S`5o$z{`ZSLb?NpvDIo!onmpDo9XAE2i+iRxmDl2*}>@B{D?7ue0-_W!TO4S7sfjPGef(-u&zDDrbavhR3-7s7|X<1WkQjo z6K%p^#1?HWUsaVNFznf3>EJZ?#z05d5J%een0L^T1n9i2fj%QkI*xjwUh*CQjGP`< z0BWyG_q3`1SlNADX0Z znOIs(#>#3ReHFWdkZMB zA}wCY;U2S`?FMM=oKS|p823Lx5p`b$NSCu2@vrxwDw1qx{H&{JKVC5TLoBR8#V9>i zgp0nr8L8;{v9^M%MaVg+%bZ0{t2=qWimLEdetLp5pgI-&>ueE#&1C`iWN`#ZQmdGp zgiH=#b-I+?NN$-EhoRoUKHp){Xd627&Hy8gq>0ON+kUGeeVF%VI=`~o&UW`?r2*%e z>r9e0PkZ0@x6z8}S9gy_)Y*$bjz26=I5i0WC%QjM<=9)^_~5|aC%9iH3uEsXo2#lL zPd3~H)v&;fJd;nJUt}!pH{N0*;zfWfLMd&T&k&S(i{XXA@VS;MgTWg8a_(}s5BuS_ z;i7mZTj5boSATeI5(^}Q}`XEWtHZQgOI$e)N|SF zrz?uYVobz};aqy9WUL}@bn*$O@%fSkWHYcpKPW-b;o?{0KdjFV_>TIns`9>M*sN2A zvSoKR*_ZYU`c37S*@?ZorluTKrx{uJagOw*dAG?ilXt|qSV%x%-*w1bcVir0PJgA2 zOnE%goPgL2^7_U$Kv>V5{ija`P~|4JkvF7WMjIM#-aEhDVgjhL1Pdn>D=OneQRrA3s*0HOQ12^omn>^;w3?sA zzt>TQd9Uos{Hi%ZJ(v(z%Ip{JzNe13HCk%FA-SI}ha9YzwPkBnqE2iw1W3<3@USP|v zkqZ+ElDj+GZ#(@FVmlaUeK)Z8Gc^IELDdQU_ObrsHZQXEKBS477Y!5)_?x-k)-238 zkI5_Y;_v8~PX0wkRvfSK4OmQg2-%4In^?kF2Akk3eHW#J?*cOhu!RAPy05h$pi_Q3 zX6P51-L^uldwE-jY-E_qe-WV)m04S%0Lqp860?d#DmW(OnXE{R~s%_$Z#X@F9BY1g@_KTGRF787j2bu4=STTeUq{ho#sx zr&`w_J=WayV+VcN1CCy*d{bAc<^s<@R@XHSk{x;$(!e1t29Sy|dMu_A&k<8QMIbTE ziDP+32Q`@Z*jES)=_Hhq3s9$S6uizX_`Mz3+L;brUwuuJecG#a&nf$LIqUDVoJqqJ z>hcq++fRiN#qwnZi?A{V|1+JopGQ#iZ%(RyU>QWF{VumK?ZMaF)>4)Eh*xQc&TSQJ ztbPn@UF!A1oqw9^qQ^l$vlzMgH_tpQ&W+l({t=CK@O^#DU+vW>bl4q2%)0sKz|3Ut z_k!hZ;qjtC&j9Bg31wY-c0gi{+5E^hFu=xXSdSH@SAl7{t?QcUDl|eP_l*WK_)8?d z=rWV!^OaaZ6!~Jf=dZ^1<@i}Y=^|MAaFgMfn_g9SR05WB*Xgmz z4)uN&iLj5tIWfyBT>B~{Avf%?t85@ACtyQq+DnM>#E2$^ zphF@7O$4}-Hhq;YSCe40!n_zO`m)p*0i4f{sH=-^$FEYQYmd!+oSKp_nRKIPuM+n_ zgSaw%8SR++)CH~DpNOA_(<$l8dX3De7CnQnWou6IpwlxGUf`wPcufzj{xMXO-z@Ui zQrj8WL|WciO5b@+9+&=?B=5WbOK@-U7dt{zfoFVKYrUy`iadm?63nOEgCTUvadJH9 zyzQ1PvQlt3$#wqSlUb?UUlK`AO4%`W^S4-2W;){1d^%YR=Y3Q?`;#eT}Z6#6E>QDwBL-g?-X7>&B0k6*T&pL8Wh^=JU$MUS5(LqjY zviC}G&Xi>j!^@Ff0{?Bzcy^X^Y@n63_kTnWx~~l0Rp`m@x;(L04aoIo50 zHka*M0bghT@{j|0sTz{wcg?~E&BAEOyTR-Eg&JGO{|6x^%n9OsKcpJYf}tWpH(~ie z*G#69*T=EJ+b076y%G^F2PiT@60>GgCrIrP0x4|N$s#+uemT=?`$!WR57+1AcOLWD z+>VCQ0G~^DA(NWR$|5NhHI(W$mbiZzt(8s*ET;zz&gNwpZJuzHxUG&F81vzw221?! z{5JwBG~V`rUe)gGk5l}c8Bln zQw}c{>$D~;725j>6N!5tOsOMNaa!AEBn=|s)*#y3$%x2B*EV_`x_i(k+G(!qR8tSO z_a7uK4jmZz8CC>uZuQW}u)_KhyzU2(GDomT7r(b+`(^kf3}-WlGn@2=htwto z?nPVAK^*?Xf&m2dJwuptRdrwBpnpC;|D+nwh`zho&`UC62R@Q&E?73|Hv{`0Dy>Lyq}pzkt7_EY z;f1`fj!t*`?mP?igd$)RgFc<@4)1lAcXV)rIZv2<7ebbfH8+~M<*nR@{TV!h*1{E@y)J(2IZlwJH0AXv3_%z*ij>dn!bVzq!0BA$04- zM2!Im+RvpBeU*N5qe|uCexvs`Cm3z2^vI7Ro9Ew-aR8hD6pdIBEJyb;^cS&v(-E`l zb+==UC4xRgPwC)nBJk3ipwvH*!Nf=NqB007>CZImjU8?emfH{1!nY5xr}c8barrO0SggXATz9nn zLX{&i-v%=~0vB|evjPc5x}N{ku8myP-R#JB_Sw1(cV4!<)!N-L{sQ^rY*SWWUh*5; z`xmaiY00K7Lm8O&}N`R$wAlstiR^x+xx*qh5&5-`wV6 z_tj5b8nq}$t$yHREUQF{T=LmR?3be(z4Fmdlb9g|)kauWDInG_qDi0^g?0HhLJL@* z9A@?zIRv^v9ALQCRtLj$K+Go@)t?MU72Ee_1G#Yt{K(JTtSo-EJjjUtRc1~lC3sV> z=W@1SQL?v2B=@XU%IsId3!5TiprGHZN~Ij`H6NnKMNd7%;VcVH<-WjvGQ0{iwq21p&WURJqUvl)mmQO8fhyz!6lkKdxxWH<=y{lD1SXIK{T%6_fa}|=#MQv<6ADlRR zCnV%VebHyXxj5i-u?HgF^?04h41aiv+Z6R-z)zdM7uwUCOOQxCxfK*qUSpb9G<0-r z`e0MQg(o-NLxUR6$b-|ORix#)3G=G!;A73a9Ix7cxrRlzb*xRR7{#jL7m~Nj`xSMj zVd7N6v=0e_kOl9uYLpC1bDM%~X8rg&hkW7lB^XE0OkqMcwCnh)29b=}vu$#p#r9N2 zl*~b1-aF#R&)+|1p_^r3BgW8enRTohgr5>N+!p3F%81nCzLvVT5{}`ia@x$4!u?n` z>(bo@jTjL)T)5kI9q>f|4Bvk+*bbqrPB-D?msw0}!w@+Z9QqMx0Zv+`^r{joV#-V|XwqK)N&9!J?$Sl|@d z_Pb#gro>dBFBrb)XUA^S^FZFL%TE+Y=Vl0up|blNFZOA|Kj-Tt3YcBZbS*Hd$s*Db zopOfMkvP>SN9qaAmY2Ia$Y?Pzy41E^AaG-o3{00|VUu%`_g#b!9Bwpx%yXQ?fY{bW z(us{n6EcD!(tq!1iql;*RFLRn9RyXo=%g{9o=KnRzC%i`^|SYk)~X4lCyw-r4Q0t+ zhO)yYVfqoVp$r66J-Nlc!n=azQPWM@#^|x4GE`S!Q^AG`&1Mydfi3O4p4$=_F~L;v z6R${LtPp%pLOoAlWxPh>zE5Jt;qS&in9-2CpEYaiz!RfCcWa)Pq4hkI?Rk!fe}uUS z2>;o!YY*8_0oNizP@1^0?u2Fz;=+2~_nR zP$*Y+R`I%k|ulg;~QZhx+T zwVXBHlafi>#lTcDc$nAAwQGi(ic4Cm#l7&d)ij z%;;gmk?4wnTX2-32ELp-fTO*GWAATvMB4y+PZWl=za26198&Tm&E3$733z@M%j|7n%>RrprXwdeFLMWF9|01I3* z)@JmAhvM;U#Z2YnEs+0~^h{{qdeoexnzVdCmZY@Jk;czH9_JXh((u4H_slVse-B|s zQ=Y;bFV{vZ-`czaFtj;RU!{mRZ}c zb!L>^1k22OMARv1LHH=hRjIp=yP9SGT=X@-P%DO07||UO9_mv~2^>mU|J9FUE+LHk zZ5g7&HBrQ{0$BfF577lezK(7H-vyiy4<8an?oQ8d$M`NGyKei>jqEyvKBh&;ALCP= z&!5dxh9GWLNO1!vO|G@XE{7)obQDgyRXD%S-GZ8iHGJUQSCAP6ImJ>Pyry{gKsnHPjkC+R_}Kkxao@tjwkt{oaQ zQ>I5e>u3U*r~Fx;&&1nR*Uv8Tjx(R=TH}vj-mST<+|f$g+R9_8d-f|JOc{)XN>XN!hsrH1XF2qC&W@(G=?m#%CHUPo+h?y z869w2AsDYh>>TpjF&%sHCF+Z2K)&}8s#I>)D7yI1A7cN6lRU~+#ud;!65lJ_`ZXzn zn45d{f%dFF`9`_!BC)u|%jblrkm z9sk=blFV$u43z?1Yd^CBzCm0?C504ggZGRq`~=cs4OvM;{JJ~u4y%Cff~pU@e<07g zzeA=*k+UrV_tg%u;|-R^^l*B_lvCyoW*q`+PP&JfJ@nPdXeaG@o#AtaL|CcReg-M` zFv2UKx=KL~XZU|&=Eo2X#s0P5lcQcpzqy=WS&cydrc@i@ywQ3tbsf655!t`MsMCHb zd%cCU6TuN<3A6~?uu_G($o*}q_(pT&+n^C$e?;h}Tcod|+QI*=GnOf+q0u@1&OqYW zYv60U?yt&_B=QYW6Goj3S5$?r|9=;*^-+iuG21MP-#R4PeRD8T&{2_DQ?;yM`zs456K;vn6Yz^>h z`fITGfVbE+gR9$_T~n!o+b@NSnwqTStnez(N#ab&lcPtz1iYa5psPh22w)B?P+m|ju=UTby71jsl@BB|!yl{dd8G~d0 zh2fE`eQT>7!GcRlb@!t_Y?sTEY}ygN-U@KhfB6*F^}3UEkG-H#gz<;0T6S z-D#qI2j`^kot;=!DmkDcpx=LO(ogIvvtJ+OmKvy|6HAliL9{sB*AtIl1E-7k-7yg6 zn11Lh8OM~|TrB=i2+C)6Am8D_EUPzG)=xP4x3MTx3puY3=wzC&5nppORqzLHN1XE_ z>C694fHeq+zjCzMN`Ff8Tu z`5uL>CglNZfUL9oJVG4cTnKpJiFBMhW_+;YBR+5gY_fPt-O&K@#ux_M2MG%LmCc#~-Mz5A6qaK6hcq7kPJ#Jh= zfCZ_+=lkKh^L%66w(w>uEt`OO>La<;xMF;ciJ*P!7oZ+wQ<~9JE0h~st(l;S-TTp- zSH$T%e@PN0=!51SO2g1XtcuA#Q%8q5@)7_HAXJt#wKdL&cdcTYxCCaEq=xTKs+J30 z2yQQ^+$sHQjBIJ9_KdRA-<ytZ4cDKN^?1fg}g;_hM=gjq7 zwOM@NSVO)>S{ZBLc9w}L8Q*~8F+f3UGpG{!b?jQzaw~|r!Oo_}0tGTAeLHp+%dN=j zQ{^IMkP%&b+T8+P>iwm%kr}?nYRkgHZbX!ZNPKetGW@y!WAy`(Xjf|GPkY3c^keYR zCx#}7E3E!~tkzPwDxSPjk7C2R{-59blzrI)Njg%K;66PM>1dp`$I|pb)CGOs>+)RR zXZVS;>2iL9gg*I>!M-|*{$<+s)b!V*m?TY@byZaJjx8A@|65P{kVNY(!@7+1ez{nd zhf7oOVnqg$j=VY@L6d^XLzWiZvZ;J(3j3a2D zU5D!<{wu|K(ct%2GH%hA{%FBEC=7FO3_0<9S9#FluBy#9{})BEKm9M%|Fg|(Ke>3P z2eJ`w-1sD83MgE4gK(fskiVdQq*>bObiCZFO|=)gsE{|1hQS+oRyHNvm@8!3;z8pE z_`fOv><3%9m3$o;*Fkcs=`CXth3&|DJip!A~tPd8{@>TcdZ=d}wf?(JKqy zpJiwH=OdSq`TmL_Hgq*Vy!!{!SoKvQ8Ybb0)+wrj_Y;r~5wO_I$7_r)$|5TOWOSG5 z>a3LO2e$sI#aL^?o^enJB0=VCdzWAgyflKA_zOf!F2AsVI;-Dv&4e2lJw@pXYzY^m zJb9v6M)@=A5T|#xBkfy~zxYD1h4EQ(HdXRnMmwf_v#vEcvLmwn@~z2(n=*z7>)ta^ z?deLeJP;p}YuZb>^c(387<78B6L8DKgqhtaapwHZkyf2T&E@ntRL7a9_0lxFMF|)` znWt9d46li}yQd|-Xt8JX;MR`p^z}MVKKARwp>0>p({3T(=z9YX>=d81?e$;Ygc<{! zDLera2mAB-g=pHP$w?bKKVYiB$cHunX1PEH8%h?oEjx-Ar)zH^&dX+KIt>aVd#ron z-y$}PZ7xmuSsp#~o?Wfwkso@0h@pr$XTH*gc6n8#kw_;0t4JF#`7eR>|1*`R`f`!t zh7`y%H5zG^`{Y_3A~7VmtAw#cj6V&T)o%NuWfVpg!eLFX$P`Wu|Lnzk z$~BV2CepXtw)1y_Xd~NmS0(qYEzSv5b*5_V-v5{eb}Wb!Ogq1ihj!FJ!X#u`PQpyk zt6zk*oxw`th%-%ajVS9HbO(`9fA19DX!D0Ur|p6)uE{5Toqpjye2q-aY-qtmzu2-#!Jkiiz`1tR#uhw&r@zx$-YsPuV3M54a)<5pSx3DDT=+uR`d?_|M zD>0%&^3u13S?~Cw>^}D>z%powavlQ>#r|1K#v~2H?Gw{Z$%y$o1_7GeTHr!ELak}i zFq(3`MFs$=`A7wC#^6WRNgp2CiBpL~9Wt#A#gPz}H*erYSKaNM_c7a##3HQ$An$pM zB5Ghp7h#Q_n|={`;R_>+;Mns>vK9HpdkXG<4-?dTM!ZrFeIiUWmoY#2eI*8zh>D5- zGcA8iu6_V^Nqku;6)kQLp5veB3B2k*z?egdALXfy>3WINklD@|?OJNuc^SybMtek) z$MO3gURBvwABaV}@_1holGa#nRw5Lko^nRhbqk#m=SxX3YoosD&_C=vXCDEo9Dm)a zc1fS8G+H$1xZP<&ew<3mIp)XO996(ml0E0Zc=1*QdLtP>DT}l+A!#RW zx)wfJg`R!krrQ20$G!a{MDYBfnMZ;-q^&C#@aj9k z$hjNvWz$ua^Ud}v_pt{!A#+<5yYkT)HGZvT%;-DG!VwvGHn-hcwIq0Ig#)1rlSDri ziR^iit7tcNS|CMhnc6RW;C0F>q<5nwn%#d2J-%Ab`H*7&q0*BNq8q((-Tj2r;!7DU zWZJ2B_R0|gj>2iuN3{9cCeZzA4_T2XLwl1Rww9(_&k@~pOUU03_Nd zRSE(pWvxv;f9z|AFkQGX7$>#4%XEga6#k__ASY=`SR?u!S$gyE7*gn*^lT1!mM$@b zt`n=|AjpIzC&KoyK5WX_Oh@oBe*$r2sM%ftN z9VJ|pg!;YbRJ4XFvZ)r3$~Y|RX6S63=o$HYAS11kpwpr6G-5-4gscOev9o?ME-uIu zdpUBW2X_L8&poppsjIr+H_(DRbj<|-sEVVpsNqWNvuehxmN>=#gNnz~Bu@4J5sU*^ zjXTd5Dc!dc}C$G5xs68Zk*|`pw zq}&J9rXgq($O>eQ@4bFS?GZ>7-^|0WtFOQ+aZP?)29ys_fcaaHOJywQZMUSHV)u7{ z+Erii)=w=w47lmP2bW2cWv|;;qkekGbHcg~GT2cI<U2d!0nz_6Vr2 zcXeMUWxEnf=%JE{whCsqvNs~9n)>+RK!oW#x7McFH#!njbNH`&E^znfCISSah;!Xe zbA(gRCMI|8B@0OFs=(7R5zR;b<2ieHjfvm85)@ndM>o6RR%+!_smOFZOh5w`VP@4Bt zO;{^I5%*94j%{Fqt` zPbp;stxbWMv|XVWRs0LF;*1i5A8h4RGJHd|#@gs-RP9}%Q&EBe(-Et(vd)vx-UCyA znh5a_?H+^Mk%%QkkqajL+QTaJ^}r>^Lpfjk9)PXO&VR%3E~i~5E?T5>7sHOUEkRQ) z$(4*58G(M0uE*L3$pWNKwRWPv4WE7Q8+=TIBJ)f2oClOX-suKiEHtxRHjFRLJd(>3A*;ka$@ zSZwba!|-SPRz;Tw9A;4i=rfwVa<2-vs9~|^Gd>TNm(5F?pf}wtpM)LQ`qw;dv&YTV z_*aTwR+o{t-KixTI_nOs4E&vvvh-U1Fkbv9;dBZCXq$Veh*0APLCv|^Ao(BwWVS!d zi!+W1cW60>_TPtND1$m_{LoK2m#V3938i%>VZidk|6r?@HG5>M;&KZ|G+`OJ9ZezQ z!0sVr!q&t_AS}*p_P>-A#xo%b-a!1s&7|)BZ^8^OhhW7zbz}(6@V}LpY3T5FWIl7o zp`9h~;!eirq1Z`$O3cIA{25HMR{gj(Sf^U^?vCS#4Jj5i9_u>($mD2>jKv5WVrO(9 z68$|n(mO|NI6%eIf zCP7q|!KwH=OtG4p#OlOl$%#cf|17oos+3!Ewh;)k2VN5CbGoXcII9*;xmb}09USa# zm4fgW4HbODaOXo7EY7L=JIkS~zpN!Z{5mgua4!X|l6VGWF4BTmJ4oO-jm(M|;2v(+G;UlYcM~V-zg4(t0Ybh}za%!I z<9BSsAQR_1FuqgkwTV$GJ$)U=cJYDwyfgOf`nl`tNQf~MwBPR0bvZ@ur)b5wkK($C zQBEg8B)k@WwR!Adczd$_ENX7WGyF6$^at@;^6xw|erNJSFJ9rs%H-VMT!x$}PLt58 zwHo*8Vo5I8hpI)$snnlE9vQL`7~tdycZ24~5Y}k_md^*2I3@F@vLX8E=8grd8@zx# z4O!n`S?3a+H{0NwNzSbos@Jh))j`O%%tJZegnHeCIS)Y>sLxzw8Qs-bV;w`oS+ zuh!0Ke6*ZXkpo+5&5I}JYhp<+&!SFmMXPKd%Ov~?%nMHZSE|TGwt1%cq)x8Py$~fv z15y3{3!G*2-0ZqX&wf~4RmpJ&10ip;)azmj*doxImC+9WdYy=4KD+yJ7vX&Nd|==I z?)S06hslPAx+Y>a`2El7%RQ=DjySzP<70p{#sB4-ho})+az_Jx`lieL1D3w@y4j`iO6&>J^RU*TgACTN znBfkb1(DYqTCNF=A)%_>6??A+gk^>sf5nFEW5jNQ{3k@wv&6E$gg=DBu(TJLUGYgD z^mWKT#|z1G8U_tnuiqtE?rh`{*S1Vww$JlYRG~}ddc4s@cgE2ovwaBX{znq za+=!XWNU5a@ack*xVf}r$6yL*70c;rtvZH1c-Sne|H>@;B^ z+bRY59xj-7^PX9G1IKK*(npV6UlCnq!WS?RUT-b`uuy?)>c1=s{%6AZ_&)~12Rg+# z>_0G|l9`n6V9bLI(;nghHy%w#v3KIWzu&o78W%^M|DyMA1i6kD6YyGLd| zpuFD?JN|PLSrNoI~(kT;tC;|xY1=Kta9yrPDuCdD9-fCz|`s3<5UK|zt;A=Jsl$A8KxV?4RnTJyT*%#t&|_A$;C@S(gtXN3Xvt28~2RcxKC`<1ruJKw+Q`KnXL zR^EmIycau$wuFdQs{pO{8(^4ef(DMc`NHaP|3%*d`U2^DIkv9Tr=epf@}u}6HEyJs z7Uak)Rf6m2E34ym{fx+PfQ@Z`5JCsgTE%vlRFsGk@FT5r2*7C`{Vx7I(sdMj4w~MnEgs?7TYo5%`EPA1?j0sw;VpKT!suB z*2`a8HZ;BAy)qqeLKLUuyl*BL9Jyf$Gab52-U=j|Y2r@tLW$cl5*{&w6~@GVhM#PW zAQ|9CYR2pJ5$fg}#woAG{1*nd6ejYtmJ@>gF5Q#a55F5CFQNKm#F-NYMWF1`FW2{; zg>YpR*VsoU1L}o^(CTvDq%id{o&Zw*I=i(o7QXnDusY|8o09nbQzRkULP5pNQ{H0%#id+7ata5#@@;boiFPN*D3x)$z(X@>4nb3X?NhDCC(0{32&e{1>sPN3boBZyL; zc48q)pTzShy2$ZAuR1Ai3gayxzm9CF@S6tR?o?ij=S8!|A|s%39?PZ`sd7zB+Q1b0 zrL3_Y)isKK8$&RHmYd(^z&+WCjk(iNirgP%zFHg>b?Q$V+XyurNqrjfl%Xic#c`%v zrM#Mu>qCcr)g&b89D*$RpDYR9W~K%deY1Lc{7bGVn4(#;ynRu*tr_VoWw2_7Ix2}1 zRq&o#2{xchVgvK7Fh`N{3D=ZDex83@`Y}S$4Bm7($nsXRwFWy}{HpeNfJ7|stv&5r z8DRC9x2t|2k+59ncp}S00I+ZiT1uL!4T0O=`9YNxna$>)p^p%wR%uvAw}0{Lg27&H zSB`9r?ut4)aeT%DZ0mfj=y^G5D~{?-P?3Sh^4s+x4+E;pTJvUb1X>{Z*}k|Plr05F z`j?pXA*{c!rt5SZ#n}i{^a%_tH47->&<)lsFYTt<~ehGX^&zX+4ivcrJye@QkCch3%9zSm>f7O z9c?GBklHo}(SjyHsTU=;HR^(Re~(8O4gCBP)O!|Mm-yUm?Ag-~#KfK69|y7CAMVOU z+kMv9D!vdC{tX$#`W2Pac-o@%<8xWAxbo&1)2*09_C+jf`48Ep!)jYx5x|U>^p;K* z#m&uvy_wLlK1&w`#RW&3vL$)<3jGAF$F}d7!EAOqf*lRz{NVDdLZryA-OjV`7x+ZU;Ex=hu1mjo=na794=3XootQnIS1nu$r;Rs2c$}V-dIgi z?Bx;7qe2=gl6?B*UezuA$4K+9GhI8XM|qM6Pi0_rD(o>t&;1}(=aH+k!GfUn>IX%e zFCb^ML~R8rJBW-gKGT4!IffJEK&UbCPdvUPr)Y^+d zHcU$&*MocMui~29h?CBo_C`_3SF%{O02FDN^VY|8w3Lq@ZU!d6*GF7zO9%c1@-h}m z+V9_4GJ3^=N3EW6r;1(&gB~~yGSnV-EC}Oz^%HWOT;@k^@GRQiq+6bt|3hNk-zBk( zXD#-2vilpAMMPE$@}7^_rBg16@Ft@$87;~n`_*cJI&aObP{2C*;3W6^d1cLNC1>6Y zM5>GVKiBMVHJ_djLl`q!P=t3KfN`(efv4^|XV=5d)#CvP^XbwiUADQe^N!2C9!{)O7hX^OW&C5z4c zr?+c84mQnB^s!?yO}c0@klIv?UBRd1ICT(WMpv3$u-qLM$9q=^3V{yYM3mpC@F}r( zA!dqPsMaaqoVD={a>E74Z$VchoBNMZSTPm`8+yZ{HQmP|WxN+h`=qJt;@up=TIOG% z85tan%AKF-AKMp4&8CD6-F{DuOYpSB+~2dI$ob}M!corS8c?oen2E|zf1#DDee6Be zadBw2Zf07Td_qD2>Dklq*G-~!srZi;^CvjdZ+G`3T4YM;M-&V`$N!^27&3S)3Q$`b zp6DqhULNpdx{WU^?&)9CyRD+Z=i!Vf;{@V<$yY!D-VG`|c_q2#3Yb+{whH{l!|SU;Be=JTAh`blbJyYZ)4WiA}_u5zL}7q|75_cX;EMeZ7wlI0Bp4fR3A z4tiqTo}YvuD_WmC>FaetK?}rsCxO{Ql@{8Lv!A!{Bi>P!b<%U^Uf2ELztsH@)Mr8Sw79k==im zPAwzP)W*q8TtKS}6Q8PB|9PocW&Ow5d!C%0+un$~fPOlDX5YE>VXdH14q#)_ZI2KR?y>51kt+k|_wOD{VvFXov> zKM~*aPuku$H_jh3ITh6N56EDXKkdaMndCQQO#r}jo_PY7#D3l@71PCe*Dou5U6T1i zt;5o#zs)j9481=8Fga+hAh0WOyN}Y5iOpsH?wDB5Ebx^#_V&6r4l2VU>;Ycel$Y2t zQ4H&ouc!=Yzj%I*oQ=O^p5xezav>@c5{i^qt37?8`soQYP4_)nP1A3H5954fLv&8& z;77}nOrQ$+k82h|T8JPt<9!E2IHcC+zg9DLXVK^zW+hBN2b9>~E(``#g6a zkpzAn?JwB|)Bvx`NKWnuCWNj7g(^~a#KDM*0tGO`$hb}I$v-47-1zfgCvZUAlKs>j zMHI?><||Ef_F%}t+y5Rxq0WW?F9`~OBbX5m{uqxk?M@D>vD|c5n0WquaBAs>HSL+o zS7B@&$oj-XZ7=j_JVEB&|A5XrPx4Og0KP{_?lc|m2(!@S)`_zCs+6R53XM@3O@5il z_!y|fddJ8!^}k2yzZgSfEPa@Bj&WK|XU$D|-2g11A%CvvIj2l5DUSN~MgXF&q#|Jb z&_60;fkV%BIxpMYJI5}fI^Vag(4n<*rBL@_cyw)uz=7a~1eZ~9oQkZQ2k~oZW*FQF zz)L2k6b7$vs~jz;cD_gsJha_Bwcsqru`F+&o?l7Q*egF=xf!Chhi|fkl(HH+90Bl7 z_;*0g`z+SK1!IqKXG$F7T!^D{S1mE8M7A4SI}M(!7W~Os>dsmIiXJ9x28CvRo?p^@ zLvk$!>@bi#O=7A77B1g%>&m>T$`Gvn%;Ew-bvhK-|1p4Uw^cfz3Pwb#y`5|HL^ zk@`eI?NvhXSH>eq{8`n0t!>zG^r$Fr~EP`Mk>B;;@xH8`5M zC{I+ZdaMo~bu(~_mrrsluGi?aF zyiv7?n~~d{1&V#g-fcer2c=j-2hb&L@~vP;k@7>ACs#p&x2|S6!um5@F z4D~793lx@_tN;PO2u~`0Z_@nlNoDs?oy80wh|)>TVQ~f(pKkv1%JuyCmHj-aJA@J@ z&xKA5kgUjB|`t=K6CBhtAn zAC0b|jTgrY{1+<5xs$Q1%W$q&G;^>OCVgEp;FrnPfMH6m>dXKVWH*q21$`VsFSLBL zmPhKUbW$HE2i%VwlZQ&r$w-DT6uErgS8qpb91!dhG`{f2-cDS>urpmpwJQv2;PMf= z#p>4=s+ZLT*=dMSFQ_6v_&nuK;2POM6eR;(i{O(#3dEeimX*F*R*wa>KMq{}|EBtB~CLc3;_>yUH=~RV{>4thqzy$c z?$m8$KFyn?YDpVz@g08dJ~S})CJjdir1;Z6ITAjL9^l%AWh!0>k?>e)GtgQ5YK=_Z z_WG7OM)vg6iqU?52*7!3h%F~cq1yJ=+eq=tezD9Xd-p#pqkFwYOn_o zlXp?;aCj1(^SeBvf9;!GM0G<6X*Tr9`+=j0z|lx(;V^J-&z=u5z}`118fJAxhuez3 zO`b(BOfIF2c>GS@-08V2&;Go1l-rpYP~EitX@q;){d7+O&&){FbwcyOc~4UT5AU8% zqC8MF&tZmmT}Bj6yZ%xrwn`!UY`*oM#;~cebNv!u~k*Ex;}j?Fu`7g0sCqew)Dh1By%OekVBM^=cbq$ zm`U=4NLJ)@Brvdp-rcuVWwnR%)(Bfc3aD2%?EiK~YW6PBlk)mu1t;MMPQR=#4l>rL z1i1U!*^{oX{bzV%=T&}H9C7IEvoJJ?5?89GjFr5)f4j3Uu%TZ}Fzzv9`Wn78l@FM| z`T?4&z8w*@ohC(lZK3u=j;HM*CM^2Hmo4e@!fVbLt({j^S8S{pMIwu}^E;r$8h;Lp zIx7<&v#Sa9wKASabf0dyOyRD-T8P|fxg2k5kSGT3Xi2=Y;-r12X|uk6HZDmXN@#B^ z-yeW{XtD7p}=(ALss7+DiBP6a4h$XXv08%8gJ4d2%e=VvzJL zIFpQ{e{}3wc21X+@X+ux@Qr*p$Ur9CCNke!P%@xJM0NosrLt%z`-eZ~C)}G4RP~)O zvH3x!hGS!gcz_sWKp%H>i)GhjdvIPcW@_xps(;WuEn$}=t^`Bfv%m~D*G`T(v&%Ax~Je<7&ZIK%(TEuT2|TqAbg?x z&8>Kp+&z`{S^SbD(DM_nxG1*gspnzCHai4ek&eE{0W;C}1_W)iz99d!-40sKXxvW8yeQC>y6)YXUL@Z1OQA;V-{uyYu+MU6hZ_ zLQXNx9s5#$Vq9F|_k{#w1Mz%Ow53$p3dAB6TI7-lO>6~xQ{Ndulf{h@lhkwrPMON4 zJ-kdEn+tC($`DUCs2cte=<;F6aygwWZVd0tgLisXz_W1JLNsV|=grIpToNLaBx!Tk zs?6kxFjv-E^h|MIZ_kWf8l>fVSHmHG-)>iJPV`x|j69Fcvd$6!tJa+{#^`QgN`dAb z{_y&HIwP0ViqO@V#y@DI3XlV9Eh6ztu}N5ctVOz*Vz+VkxPAZo8rQmh83pRH+Lmj zLCO0MhaESm1THRm6fnsXPjn-*TRl&zBzFhr2$~*wyo0*4k_4D2O#3yq9WH9K7@vf( z)6*{R;NdbJOh&`~W0>1V;75dFtJ*|8JibotG1Djiv;Hl(B|i8e8v8R|kxk-bf5{Y| z>(C-)C;3k7ytlB0GYG_*HeA4b|HwZ7t~yQEopjU341y7&shB5doQkp-{4@M~vu2B4 z4GfDUYLo4_3jfJVVv9xoS{;WN<2oeDs-VfBr<=kD=Wk7y?Wku9vaMy;y3XRhld(mK!1H@hi{UDRgKMmR z)nhlnyJLW)1Vr}kqS27~7*23D9d1(z@^|a8jL-PG$aAXlRQih6 zFmm9L8lW0Z8{@BB>Wk~w`;!51__^EEqo3*?_ntx5feF%}z6Z(T%fZjYGvU%`u7C3E3S^sE_k0zJu)PvaUT7dfi8pki7ZlA9P3i~SeCIlXf9LB*1mdSSQJnDwViGphIqBt zILZ~+&|9neaadm{Ezq`8<)q)?20Mjwrl1Qpi8F&Dzs#U7?t|7fcVJm))sTNnbTzq{ z_sz#}9O-yw)^+!)VSb_cQ&`pI6Kw;vc3*u`pycLdNaENg`W{DnXB-ULUdBSXipO7y zUWV_1I!8Yg$bBdBmW4w1lX)K6|GKej zxjkFu4XayuqOP$&fN4tEU%_!h%&UDuX)^&TH4y4?CEE<~KbknD{O%~P@kly$9XmwJ z0K9TWioOm1;Dq-ibA06{vmqNsn5Tq$ns7@S7ty)2w~$n^K?wDAfA{5&<3bR4$bCzz zj;{XIn(XHz+7ghvkp`rWh>~PAYUyi^ZprIZHGYARK$)`@3ZmKb*f}QIi_CR~eWAw; z6}fjIF?Aqq_KODBcBBr>pg6%~R+3%j+TGzC@XALR{a17=kNXNW{&Y$?Z#n`*DI;bx zABqOCba7Pear(@kt-Y^2RZ@5RVIKdk^MFPKI7JeG!oDMo$l$B@mfwb1D9?4yzZ=h& z^C(TPE_-$hK4&gk*b;Gmu;t?6t-b}?GU7|U?4M{Mc=L}q4B{AS?mv~*!-^i2Avcn-$#N z-$(O3Ft)T1nWz@OkqMEQPq7{sm8jR5g~!1Ed6E!n3cJ6wTgg><=2b(#n5bply9{e4 z0bA&W!BKy!4T;+XU+XTgoL=9#(Im{1o@M))*Xg-)PvuojD6_=^yW*+8sM#EtX(6vf zQqh0Gzs1!_+k=!%Kd45Z?7jk~YvHP$p<2Uy;H?b}ZrwDL@K^#!m%+Ku`~9#7!8?7X z=hFoA$-w!R{N?}P+Q!x}VZoyCrpWMHP4oYXX~&R9*3a;9J(M~&2sM_rLQN$uriK&U zlljYiUi6>78%?@p?0pktNQ|Pl7>&0=x z1)z7>`ppgZxt-^rohCS~EB1MB#W~jd=+#v%tTRDIybiZFiBm<(d$&G6{A0tDrXSP# z=`&iZx@*HnBe8Yh$A;;LYC$(4A;*5XisK#%_ole_R234Kquy&R=8t64%~bo4Fz3@*q3o$9z7Fv z2Bot%YpcHKr>yaoG}3bYhhMBY)zzkDv5zy+@lg%V^aTSJ3Vc2&ZKma|XmE8BS`C#< zgIk$jA6^=>EZs4#-sy*OY5h=cH+Ns60HOYL<&U!ZS16X-6#it3;Z;}NJ)y20%>H8( z$p^Bz?hqjzC*$c7KBn{cgleceq#94LCS`LXs8oBnR}u%d+9^t{m9avjW)>E?G(k(V{)8DAOG?s~xKp)Sc!JQn+*&QrDjQ8q?w zV|u&-yZX@;Pvr!7wH+=hm%w6%wuo>?fNFWX&tk{$Tx$w7OoslE_&O1bKD?)fA<3uA z&UN8bijJI&@b2oLFpq0A-BRrG(G z+5A%zwqZY)wf&{0e%kLwB&+#VfdrOtVCBy3NuHR{qwCP@_c5@teG4sSpr$=%xiKDN zhixcWx2ALjzY8PE1UDtP_-GRlZdv#Re^eOVw?|urqw}Q)$qS3;lkbC6G2g9QZR;>$ zlD56puEKS0Lwg~p;k1Kq=YQ~AM-O=}+O2vel-RtC&F*o)5_9R6hm6nu0%2^k4`-{o zfEsfbc$7Gf@!fq5*v(sLmdzMpi+Po*LbVk}@cS0C2EG|nz(gHncK9Cd)h6T?5UZAI z{ha`Gb*XJBA^qX|aMj7v{~Y2Wowq;~jnSkhgV$f6tg$Qrnw@c$Du@Db6DLM8NjcIW;!cK&7<%Z~43k==e19n+>*mei zT?CsR#k_*f{*3Ng4p?^&SzBAwPGDXEr{ZVo89WFfFLQGpPE)cz7PBdwBrPiU)NDtL zyt*{UZET?qynIY-gjW}PDTvgThFf_2s;j?V(H+f?4w#y?*mAYzPP8qS)BS9g#SRz__P=8^!b>_@urB9QQb zhaP<0YcdO}D1cd=h0BlBOktfKtYFprz;2IdWpaPEp3sIKIO!3!$S-;cS z=u^C_Y|M%(nQ%9M*f1)zg-}NSnhKg#ZCwj>Q{-e-I8@+4#i=soax6YqKfTZ{?(2@J zZcZBA2vo82W~N|=4jP$8ID%Lq#wM)ZinCRWbMFG{^zT>C_{JiNI^Ow$06tl^1_mD4 zvlLt5wV0?uouI_@z^;O5Z(k7HNwd`jVmp@+*eZtw^;xn`d6dqbL9c6qwu-CX_UcnR zGL0{>dTY`h3|hooD{yKbVN)er_l{{^Ej=bT9$0|k`(^h@DEz1q+{N+Xk(|0&{gAoz zSmp|>uel=|3E%(FToNApBb-ko`YqafG4eBX_}9D);`hT#ou_h)y=gy841$}_=%`?iGIHMUar%i&Ud+P;Ep zGC<`+1x#LYpo$&8s22lO)_r?zyqvUc&NMTba3lC76YDzwovB&~gh$#QbT%1k{i>># zM@5GN1P{OJ^5F?pM1f#NPicj0;n5;uKv&lmT6}?*0oGqHkjwPJ&JT$=G0eIytGI8- z_aB%0yk%yDFL8y_)_~d^iJAn?TWg8m4aFr1CcKk4aGd);O@b*G76a+86=fr~%>u}Q zxb9Y=?`!>@q>PJ!_fj2~8~Ztrwwgtn0uZ#Z%P(Ai)P1_I{k56p6NfE927J^J95+qI zK8ly#kxA|^BlAe+5z<)u+V@&s0SLEQ9=0yR`GeGXVLPH-1B**c*!xw;z)Xziz+F>7 zwKm`;>A)AoKJxFSxwY#m)z!)!`x1h(@mCnd1n6Qw+RgeGduE;oM)TxWA4vaB&ip!# zaOB$yG@Hd+cW{&E*#SWZQ;3TZeyC?ovJ-> zAu*9IrbnU>U-gh?Gq9ZCc9ffrpYaB4JuB6p)>lk$x}j}cSp)0YP)RX`iR@Y{v@IFC z??(^f&!V>!djy-bU|-oAm;2xD*5Hl}cRp;wJz(ASYe3uwU2))UtGR355%iFwGchbw zkEGEi*+*SV^IoUUF`sg;vM;7W5%7qEUlxDpd-*_Ct2Nbh=GnJ_*ye(S1`NYCY?!D| zIb^!VER6GN>U*HcH7ft-H(S5bij5kse>puo8@4jr*1}-4Xr0jDcx_JJ93)lsHE$mE zAS>6rm@Vax0C0PFH!&V$0>XUn-)GKZGSeRG$2e&#MjFB z7jJblUD>l$`SCfC|0HodIgyvG9r#y|mFhsexesI3d`jM>U`^^K z4Bc%Gl?4OI8ROTJo66ve)(P9!yn5R=_7)%mUXZ9M@z#S9k}LljHhFxsCAVH4dx5xo z@@lw6E|wn3&)DOCeJXb=QDq}N#j#BkR0;3}C%;z?dx5eNNaGFHI_OhRvJ~RB4>-~k zT>aQ}&MSLBbd@UWj;@0Ltg@TKOl2J8Dx&=?-2iII4nB8v@2z?Lu(!jcQj}{L`V>dH z}lz>0Gu6s-8(er{Vvlf_PU<^uQi18 zr7DZ+(p=Ter*P*M60wi_b<(w=9a@=fYYuuBzhEc(*yU03LVrt2CwT4Md>_nZcwqo> z>^@apllJJ)&;SKm@h*lL&e9yL(hNbc?zumoU2>ReAaO}CX7zcFPtY&JHo>4Q7E z3c7QaCrm$4>t9t~2eMEO&pY1o(~^5g_Tl!RLeZ&FqyI5KqCqWnQxcosc-?6IB1<&k z+G(OUNti7RU%jpj)B`|&-~L6S1eKh)Co$GXBe@Mzsr;z!Z^-^Pc3}N(6TB#ZY z&zos_PhRFU$1jZ4y3D-OTuKZdFC;m4=biN^_m*$DJvO~KcL*ye;gOoDn3O`bnW!mY6sFk?%) z`&FHlTtJ;st02m2yS`CP>$fnx^{K%IGRap0$tUDD-njNDlPcY9G%SSb^88@#L5$%> zggd%P&N}n^Ld>isNWdbMNzV*PCL<)G{-W1ZU|sxr& zF(|vP4H^7)lT!NxFEH#(_qDqQc(P#h`!~NlSmj`^=vsnsKj45*8+?6jU@+h&Z1^y> zwb8RfOe#auxqdc9lXJL~-?EMl(y1vv{#z$(y(VZ@(8#kQEBF=1wgiyAJ;@D|kvL{H z3#w2DVR{AOJo)1$JMj6mnV+naiU=xmsF-;cH|f;{Uh`uU&}+LY%mkKz+SIsSU{{HF ztH8Iyu=3noSxvUzMBS+A;LFvEDQXH=loh5Ymlhn+rGn>BnFQTPqM!t7(#peNTi`%e zlV6V*ID*+D(qwI=2T{o;z2pDq{_>Jm0KC3n{b4tI?kj(3z{By_Kf0CvgEI*GuiaVy z6f8_Sb0q0XzyRbZHJePCVXlc(%Z&A7v7wSj7srS8=?lxGQIdT{Zbt@6z*ntlSt>P@ zS}22%NjJZmsJ08+lzwvG+d%xShC(mkw#_v8^h>;wVGz>mhZSo&Zri^;`_r_Q=hY=x z^*+&|c=Zd|>faG;whImZVMm6 zlNQIt{f4*BRr%t!R4I2>PMhLOe_>149mF#Mb)H4m*f)?h+8~Cd1bNrbQ5L4Ae?`M% z>}`Wgy9x|~jBbcXC#DQWl8@&AVsq*`ali$Ntb<>cD$B{OrQHQscK+o;;$TYEKx?ht z33SnMDyuI9kC8IEv-GjmsA%fR&b^qiXXoPr?V^g_@6QZm`o)s_UVo2XOsptI>fxm-4U{TVdei$8=-U;vG>ziS0KPhkHE2{I-dCRz|n)o^N#n;+> z#+15w!;E`>8wU633qKF%!7QalC?U8x7HlsCI|b8ESj^C0Z+i10tXan^%+l#mGBiLJ zo&9;k8(o+Jwe&b^Iv#MbfILBVt$6|Rpv7+|Mjel1=!4uHu@?%is$m*(tc=Ga+mLnc z)>`kjHj`-exXe*!juFp`=lNLc2(Y*7EEpg1w*zFt65}2q5(Lakm4_W|q#nmbC#>-Z zZz1imUJpVEp)Ba+IJdXqWj9s+Z$X?+e_i?ecjmC8(RJ>zNbJjL1JVoBqR~*XGg}Ri zRt$iu8p(BQmX)|I2GURA{?=6|Ko9d`mw|BgkS^}HUmN0S9MDfZo@G9DfT21? z*uttWRchWEZRGt>UpFew5j{x+5TM0(E6T$GxDyRo3aY$3h}bU1txIyLcY<1Gvzsp~ zS07l@Vrp!d@)99r8)0_;%rtp`!ud5&-rQuOVdhDopIl0>sGBcs?%P<`;qFB?T>vM@ zYc$^=XS~$Yj=lM*x(9Nu@N%Kv^vnLnHJ%RAlK2#%1y6w%)oY8L{_vb2c$8LoW{mMT zbQ>d5YYpL`M_f?}$ZeeSNLVA&Z=l)FV>@6OEcJP+%u4~ab(AZv7I$!{#C6`&+7pp- zvCDM@I69eGb32`9ioY>qgfDgoB^ZUa^K6j9?B4M({BVFsO;Gx`u3{U^i^;B|9S5+x zlMAmQ(NjwN?%7i9WT2vO=AQzWndgC(pwO#Ui!yYXT?g=I@L;p8CEeb)pe7qtIbZjz zjKf^H=d^*+eo2j+paR$RU`(Iq{Oh!3yz2`9gcOYtnND$>9d2^ndR(FNt9At5*?i>I zDV=G<%(7PnuuUH&x*&&?zG25HQrm2<` zz^wS;@;z9m3v>GTtb3PG+2jqCdC#>HN^o_T5XCM;3H6_$TuB182Kx33TfezQry}X< z@cJ`Od*)?MI8Uw^{eHIDbr_#<#8DOdHnC^>mw1k+wFVJZ;4PkMY;LcGp?5-w>f0$!e{lQm6g7@rlx zW70wg{yFgM&?Cu1rz2ixFh77n?*_kAwZi*oIaHyyt-URrccRnRahlj;+<& zgjnQrIForG<`P5ty|hN$@_V!tlXm@ZWl{(6({uQwSmw@~8EiSWeluss0}*PRc&sn* zyhoiqJ5+Y|8#}OY`mB4|@yj20!mwCb~LWV$A>X~>;L)ZszZgl9; z@V19S+N^Jh34)#11Ml)*CEyH)#1lg+v+?r?u#zvxZR*7;TjwI(fDivxQ=d1%tbQ3RX zeOdxE0M=M)(Z=9kGtWQ*%uG(z6!ZiJ-oF^$n7PcJd>ql<82hyMDV}VPZw<)U0_&;0 z
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

BPb-?x37uW@5v@{-+j!|{WuwS9A> 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�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

Bza;@c~WsRee9stlYiJrrN(khdQm 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

pDX&q+Sza28c+(9k_l`cWZCDt-!}}16M%bf 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%0Ae$$e)#CJl-2%WY^ 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

Gv;kka++d)eRN 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̮|BsbpE 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≀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 literal 0 HcmV?d00001 diff --git a/src/components/ReplaceVersion.jsx b/src/components/ReplaceVersion.jsx index 5d11e9f..8fec741 100644 --- a/src/components/ReplaceVersion.jsx +++ b/src/components/ReplaceVersion.jsx @@ -1,5 +1,3 @@ -import React from 'react' - const ReplaceVersion = ({ children, url }) => { return children.replace(/VERSION/g, "2.8.0") } diff --git a/src/enterprise/index.mdx b/src/enterprise/index.mdx index 00b4621..64ede6f 100644 --- a/src/enterprise/index.mdx +++ b/src/enterprise/index.mdx @@ -6,10 +6,10 @@ route: /enterprise/introduction # Enterprise -Over the years Kerberos evolved into a mature and stable session. Lots of people and companies started to adopt the system, and requested enhancements. Every -solution has its limitations, and so has the Open Source version of Kerberos. +Over the years Kerberos evolved into a mature and stable solution. Lots of people and companies started to adopt the system, and requested enhancements. Despite the fact that Kerberos Open Source is stable and feature rich, every +solution has its limitations, especially if you aim to scale it. -Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it is not scalable if you plan to monitor dozens or hundreds. Although Kerberos Open Source ships +That being said, Kerberos Open Source is perfect when monitoring a limited set of surveillance cameras, but it doesn't scale well if you plan to monitor dozens or hundreds of surveillance cameras. Although Kerberos Open Source ships as a docker image, it has no high availability or fail over functionality. Due to these reasons we have developed Kerberos Enterprise, which is suitable for scaling against your ever growing video surveillance landscape, and makes them up and running in whatever situation.

@@ -20,14 +20,18 @@ To provide our customer with the high availability and fail over requirements th ![architecture kubernetes](../../public/images/kerberos-agent-architecture-kubernetes.png) -Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute them across your nodes (VM's/Baremetal). +Kerberos Enterprise is installed inside a Kubernetes cluster. It will create pods/deployments for every surveillance camera you want to monitor. Kubernetes will scale and distrubute these pods across your nodes (VM's/Bare-metal machines). + +Nodes inside your cluster can fail or crash, Kubernetes will make sure the Kerberos pods running on the failed nodes will be deployed to healthy nodes, to make sure the monitoring of your video surveillance cameras continues seamlessly. + +By having the power to add nodes to your cluster, you can anticipate to the ever growing need of surveillance cameras. With the Kubernetes tools you can monitor your cluster and get into the details. ## Cloud or on premise -You can install Kerberos Enterprise in whatever cluster you want, as long as its running a Kubernetes cluster. This means that whatever security policy you have, you can run it where you want. +You install Kerberos Enterprise inside a Kubernetes cluster, but there are not limitations where this cluster is running. This means that whatever security policy you have within your company, you can run it where you want: on-premise, public cloud, private cloud, etc. ![architecture kubernetes](../../public/images/kerberos-agent-architecture-kubernetes-cloud.png) ## Licensing -Kerberos Enterprise is publicly available but requires a license key to operate correctly. A license key can be requested by contactig **cedric@verstraeten.io**, to have more information about pricing. +Kerberos Enterprise is publicly available but requires a license key to operate correctly. A license key can be requested by contacting **cedric@verstraeten.io**, send an email to have more information about the pricing. diff --git a/src/enterprise/installation.mdx b/src/enterprise/installation.mdx new file mode 100644 index 0000000..b4e7ca0 --- /dev/null +++ b/src/enterprise/installation.mdx @@ -0,0 +1,170 @@ +--- +name: Installation +menu: Enterprise +route: /enterprise/installation +--- + +import ReplaceVersion from "../components/ReplaceVersion"; + +# Introduction + +Start by installing a Kubernetes cluster. This can be done on one of the hyperscalers (**AWS**, **GCP** or **Azure**), +cloud providers (Digital Ocean, Scaleway, etc) or on-premise in your own private network. + + TODO write tutorial or create link to tutorial. + +# Installation + +Before setting up Kerberos Enterprise, some configuration needs to happen. First thing that needs to happen is setting up the RBAC permissions (Role Based Access Control), +we need to do this to query specific endpoints from the Kubernetes API. By default these endpoints are blocked, so we need +to unblock them. + + kubectl create -f ./clusterrole.yaml + + +clusterrole.yaml + + kind: ClusterRole + apiVersion: rbac.authorization.k8s.io/v1 + metadata: + name: pods-list + rules: + - apiGroups: ["", "apps"] + resources: ["pods", "pods/log", "deployments", "services", "endpoints", "nodes"] + verbs: ["get", "list", "create", "delete"] + --- + kind: ClusterRoleBinding + apiVersion: rbac.authorization.k8s.io/v1 + metadata: + name: pods-list + subjects: + - kind: ServiceAccount + name: default + namespace: default + roleRef: + kind: ClusterRole + name: pods-list + apiGroup: rbac.authorization.k8s.io + + +## Helm + +[**Helm**](https://helm.sh/) is a package manager for Kubernetes, it helps you setting up services more easily (this could be a MQTT broker, a database, etc). +Instead of writing yaml files for every service we need, we use so called **Charts** (libraries), that you can reuse and configure the, +with the appropriate settings. + +Use one of the preferred OS package managers to install the Helm client: + + brew install helm + + choco install kubernetes-helm + + scoop install helm + + gofish install helm + +### Initiate helm + +When you've installed the Helm client, we need to use it to initiate Helm (also called the Tiller service) inside your cluster. +Tiller is what they call the server component of Helm. + + kubectl create serviceaccount tiller --namespace kube-system + kubectl create -f ./tiller-clusterrolebinding.yaml + helm init --service-account tiller + +tiller-clusterrolebinding.yaml + + kind: ClusterRoleBinding + apiVersion: rbac.authorization.k8s.io/v1beta1 + metadata: + name: tiller-clusterrolebinding + subjects: + - kind: ServiceAccount + name: tiller + namespace: kube-system + roleRef: + kind: ClusterRole + name: cluster-admin + apiGroup: "" + +## Traefik + +[**Traefik**](https://containo.us/traefik/) is a reverse proxy and load balancer which allows you to +expose your deployments more easily. Kerberos uses Traefik to expose it's APIs more easily. More info will follow. + + helm install --name traefik -f ./traefik/values.yaml stable/traefik + +./traefik/values.yaml + + dashboard: + enabled: true + domain: your.domain.com + serviceType: NodePort + rbac: + enabled: true + +## MongoDB + +Kerberos Enterprise generates configurations for every surveillance camera that you want to monitor. These configuration files +are stored centrally in a MongoDB database. Therefore we use Helm to install a MongoDB instance inside your cluster. + + helm install --name mongodb stable/mongodb --values ./mongodb/values.yaml + + ./mongodb/values.yaml + + ... + +## Factory + +Kerberos Enterprise is managed through ann application which we call the **Factory**. The Factory is responsible for initiating +the deployments inside your cluster. These deployments is what we also call (similar to the Open Source version) the machinery. +The Factory also provide you with the tools to update your machineries easily through a web interface, monitor them, etc. The factory +is the central portal for managing Kerberos Enterprise inside your cluster. + + kubectl apply -f ./factory/kubernetes.yaml + +./factory/kubernetes.yaml + + ... link to yaml ... + +# Test out configuration + +If everything worked out as expected, you should now have following services in your cluster: + + - MongoDB + - Traefik + - Factory + +It should look like this. + + $ kubectl get pods + NAME READY STATUS RESTARTS AGE + factory-6f5c877d7c-hf77p 1/1 Running 0 2d11h + mongodb-55566dc65c-xgmns 2/2 Running 0 4d13h + traefik-7d566ccc47-mwslb 1/1 Running 0 4d12h + +## DNS configuration + +When deploying both Traefik and Factory you had to specify a domain. In this step we need to configure your DNS server. Look for the +Traefik service, and copy its External IP. + + $ kubectl get svc + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + factory ClusterIP 10.0.10.175 80/TCP,8081/TCP 4d13h + kubernetes ClusterIP 10.0.0.1 443/TCP 4d15h + mongodb ClusterIP 10.0.1.0 27017/TCP,9216/TCP 4d14h + --> traefik LoadBalancer 10.0.10.97 34.66.138.141 443:31683/TCP,80:32053/TCP 4d14h + traefik-dashboard NodePort 10.0.14.209 80:32044/TCP 4d14h + +Add this External IP to your DNS server, so it will resolve your domains: + + - traefik.domain.com (change to your domain) + - factory.domain.com (change to your domain). + - api.factory.domain.com (change to your domain). + +## Access the system + +Once everything is configured correctly your cluster and dns, you should be able to setup the Factory application. By navigating +to the Factory domain in your browser you will see the Factory login page showing up. + +![Factory](../../public/images/factory/kerberos-factory-loginpage.png) diff --git a/src/enterprise/releases.mdx b/src/enterprise/releases.mdx index 2abf615..6a7971e 100644 --- a/src/enterprise/releases.mdx +++ b/src/enterprise/releases.mdx @@ -6,331 +6,10 @@ route: /enterprise/releases # Release notes -### 2.8.0 - -Aligned machinery, web and KiOS versions. Too many people were confused by the versioning. - -#### Web - -* Videos displayed on canvas were blocked in latest browsers. -* Disabled reboot and shutdown. -* Disabled upgrade process, use fwupdate shell command instead. - -#### KiOS - -* Major upgrade, solved many different problems (list to long); not possible to upgrade from 2.7.0 to 2.8.0. -* Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1). -* Support for the Raspberry Pi 4. - -### 2.7.2 - -#### Machinery - -* To optimise the cloud experience we've added a proxy.kerberos.io machine in between. -* We've changed the S3 storage scheme (class:ONEZONE_IA). - -### 2.7.1 - -#### Machinery - -* Resolved deadlock with livestreaming while restarting machinery. -* Revert logging library; enabled log rotating. - -#### KiOS - -* Updated firmware to latest Raspbian (raspberrypi-kernel_1.20180417-1). -* Resolved issue with WIFI on Raspberry Pi 3B+ - -### 2.7.0 - -#### Web - -* Unique session cookie, which allows to open multiple web interfaces (e.g. when using docker). - -#### Machinery - -* Added live streaming feature for app.kerberos.io -* Upgraded logging library: log file can be max 5MB, and will rotate. -* Better logging for cloud uploads (failed information). - -#### Docker - -* No longer need docker-compose, we merged the web and machinery containers to [a single container](http://hub.docker.com/r/kerberos/kerberos). - -#### KiOS - -* Updated firmware to latest Raspbian. -* Support for the Raspberry Pi 3B+. - -### 2.6.1 - -#### Web - -* Solved issue with persisting login configuration. [#111](https://github.com/kerberos-io/web/issues/111) - -#### Machinery - -* Added Pushbullet. [#139](https://github.com/kerberos-io/machinery/pull/139) -* Cloud upload was not longer working (hotfix also in 2.6.0). - -### 2.6.0 - -#### Web - -* Add a cloud connection verification method. [#112](https://github.com/kerberos-io/web/issues/112) - -#### Machinery - -* Add background color timestamp. [#128](https://github.com/kerberos-io/machinery/issues/128) -* Send instanceId in AWS header when uploading to cloud (necessary for new cloud app). -* Better support for Chinese IP cameras. - -#### Docker - -* Bug: Autoremove old images/video within Docker Containers. [#104](https://github.com/kerberos-io/web/issues/104) - -### 2.5.0 - -#### Web - -* Added Chinese and Italian language. -* Resolved issue with INSTALLED=true. -* Make latest_sequence available with basic auth. [#99](https://github.com/kerberos-io/web/issues/99) - -#### Machinery - -* Provide an IO service for publishing events to MQTT. [#89](https://github.com/kerberos-io/machinery/issues/89) -* Optimize recording with H264_OMX. [#83](https://github.com/kerberos-io/machinery/issues/83) -* Implement throttler for Io detections. [#96](https://github.com/kerberos-io/machinery/issues/96) -* SSL version 1.0.0 is no longer accessible in Raspbian. [#109](https://github.com/kerberos-io/machinery/issues/109) - -### 2.4.2 - -#### Web - -* Typo in french translation, causes the web interface crash. - -#### Machinery - -* Resolved major bug in livestream: memory leak in stream class. [#94](https://github.com/kerberos-io/machinery/issues/94) -* Capture health verification: check if the chosen capture device is still grabbing (and didn't stalled). -* Extra logging when recording with raspberry pi camera. -* Make sure the cloud upload is functioning properly, after an upload it's verified if the files really exist in the cloud. - -### 2.4.1 - -#### Web - -* Show warning when system is disabled. [#88](https://github.com/kerberos-io/web/issues/88). -* Hull selector in basic view not always working. - -### 2.4.0 - -#### Ecosystem - -* Enable/Disable force network mode. -* Enable/Disable auto removal media. - -#### Web - -* Upgrade from Laravel 4.2 to Laravel 5.4 [#70](https://github.com/kerberos-io/web/issues/70). -* Fix bug with heatmap radius slider [#84](https://github.com/kerberos-io/web/issues/84). -* Design tweaks toggle button (remove outline). -* Disabled possibility to timestamp video when using hardware acceleration. - -#### Docker - -* Fix SSL support [#4](https://github.com/kerberos-io/docker/issues/4). -* Auto removal if disk is full. - -#### Machinery - -* OpenMAX IL hardware encoding for Raspberry Pi camera. [#83](https://github.com/kerberos-io/machinery/issues/83) - * Optimized live streaming. - * Optimized h264 recording. -* Basic authentication for live streaming (username and password). [#80](https://github.com/kerberos-io/machinery/issues/80) - -### 2.3.1 - -#### Machinery - -* Update for kerberos.cloud: pushing content-type. -* Change default configurations. - -### 2.3.0 - -#### Ecosystem - -* Support for Raspberry Pi Zero W. [#8](https://github.com/kerberos-io/kios/issues/8) - -### 2.2.1 - -#### Ecosystem - -* Upgraded FFmpeg and libx264 on KiOS. - -#### Web - -* Add Bulgarian translation. [#81](https://github.com/kerberos-io/web/pull/81) - -#### Machinery - -* Bug: IoVideo crashes due to a memory leak. [#70](https://github.com/kerberos-io/machinery/issues/70) - -### 2.2.0 - -#### Ecosystem - -* Added support for Armbian. -* Raspbian: Async requests causes session corruption. [#78](https://github.com/kerberos-io/web/issues/78) - -#### Web - -* Bug: Issue format instance name. [#57](https://github.com/kerberos-io/web/issues/57) -* Redesign settings page (better UX). [#39](https://github.com/kerberos-io/web/issues/39) -* Possibility to edit password through web interface. [#63](https://github.com/kerberos-io/web/issues/63) -* Support for viewing videos. -* Update radius of heatmap. -* PHP7 support. [#60](https://github.com/kerberos-io/web/issues/60) -* Welcome/installation page. [#60](https://github.com/kerberos-io/web/issues/60) -* Translation updated. [#74](https://github.com/kerberos-io/web/issues/74) -* Privacy mode. [#54](https://github.com/kerberos-io/web/issues/54) - -#### Machinery - -* Output as video file. [#60](https://github.com/kerberos-io/machinery/issues/60) -* Bug: System hangs when a wrong IP camera url was defined. [#48](https://github.com/kerberos-io/machinery/issues/48) -* Run arbitrary script/program. [#31](https://github.com/kerberos-io/machinery/issues/31) -* Bug: Weird colors from RPi Camera. [#64](https://github.com/kerberos-io/machinery/issues/64) -* Upgrade to OpenCV 3.2.0. - -### 2.1.0 - -#### Web - -* Added PhotoSwipe for image overview (easier to browse through images). [#45](https://github.com/kerberos-io/web/issues/45) -* Added reboot and shutdown commands. [#46](https://github.com/kerberos-io/web/issues/46) -* Added logging view to system page. [#33](https://github.com/kerberos-io/web/issues/33) -* Added labels to check if machinery is running. -* Added error handling if web interface isn’t working properly. -* Fixed Heatmap.js fail to load by ad-blocker. [#42](https://github.com/kerberos-io/web/issues/42) -* Show additional information on the dashboard (streaming is opening or not) there is no data available. -* Settings page is now visible on mobile (+ changed icon). -* Fixed sorting of news articles. -* Removed links to assets in the cloud (.css files). -* Design: improved layout of login page, async loading of image view. - -#### Machinery - -* Added configurable streaming port and quality. [#41](https://github.com/kerberos-io/machinery/issues/41) -* Added new algorithm: Background subtraction. -* Added new heuristic: Counter (for object/people counting). [#42](https://github.com/kerberos-io/machinery/issues/42) -* Added video capture, which can be used for debugging purposes (replay a video fragment). -* It’s now possible to mark the images with a timestamp. [#36](https://github.com/kerberos-io/machinery/issues/36) -* Fixed blocking streaming socket. [#39](https://github.com/kerberos-io/machinery/issues/39) - -#### Ecosystem - -* Fix removal images if disk is almost full (wrong path was defined). -* Support for the Raspberry Pi Camera module v2.1. [#3](https://github.com/kerberos-io/kios/issues/3) -* Support for the Raspberry Pi Zero; updated kernel to latest Raspbian. [#3](https://github.com/kerberos-io/kios/issues/3) -* KiOS GUI installer. - -### 2.0.0 - -#### Web - -* Add simple ON/OFF toggle. [#24](https://github.com/kerberos-io/web/issues/24) -* Added update strategy when using KiOS. [#23](https://github.com/kerberos-io/web/issues/23) -* A system page which shows system information. [#20](https://github.com/kerberos-io/web/issues/20) -* Heatmap on dashboard page [#19](https://github.com/kerberos-io/web/issues/19) -* Added live stream view on the dashboard page [#2](https://github.com/kerberos-io/web/issues/2) -* Fixed bug cloud syncing [#16](https://github.com/kerberos-io/web/issues/16) -* Fixed broken settings page when space in instane name [#16](https://github.com/kerberos-io/web/issues/16) - -#### Machinery - -* RTSP support for IP-camera's. [#21](https://github.com/kerberos-io/machinery/issues/21) -* Verbose logging. [#35](https://github.com/kerberos-io/machinery/issues/35) -* IO-devices are executed in a seperate thread. [#28](https://github.com/kerberos-io/machinery/issues/28) -* Live streaming (MJPEG). [#26](https://github.com/kerberos-io/machinery/issues/26) -* Execute multiple instances on a machine. [#24](https://github.com/kerberos-io/machinery/issues/24) -* Override config by arguments. [#22](https://github.com/kerberos-io/machinery/issues/22) -* Move S3 upload to machinery and remove sync-s3 repository. [#16](https://github.com/kerberos-io/machinery/issues/16) - -#### Docker - -* Added Docker image (x86_x64) to Docker Hub. - -#### Ecosystem - -* Add support for Raspberry Pi 1, 2 and 3. [#1](https://github.com/kerberos-io/kios/issues/1) - -### 1.1.0 - -#### Web - -* Support IP camera's with MJPEG stream. [#3](https://github.com/kerberos-io/web/issues/3) -* Introduce new API methods to configure the machinery, using basic auth. [#4](https://github.com/kerberos-io/web/issues/4) -* Optimization of loading image and dashboard page, completely redesigned the retrieval of images. [#5](https://github.com/kerberos-io/web/issues/5) -* Optimization of settings page. [#5](https://github.com/kerberos-io/web/issues/5) -* Timebar gradient only works in Chrome. [#6](https://github.com/kerberos-io/web/issues/6) -* Minor CSS fixes for responsive layout. - -#### Machinery - -* Flip/rotate option for capture devices. [#5](https://github.com/kerberos-io/machinery/issues/1) -* Support IP camera's with MJPEG stream. [#4](https://github.com/kerberos-io/machinery/issues/4) -* Introduced webhook io device. [#5](https://github.com/kerberos-io/machinery/issues/5) - -#### Cloud - -* Fixed problem when syncing a huge amount of images. [#1](https://github.com/kerberos-io/sync-s3/issues/1) - -### 1.0.3 - -#### Web - -* Optimize performance, new datastructure has been implemented. - -#### Machinery - -* Memory optimization. -* Removal of images older than 3 days have been removed. -* Start machinery automatically (delay has been removed). - -#### Cloud - -* Resolved file exist problem. - -### 1.0.2 - -#### Web - -* Timezone on settings page is also used for the webinterface. - -#### Machinery - -* Added extra timezones to timezone.xml. - -### 1.0.1 - -#### Web - -* Improved error handling (date search). - -#### Machinery - -* Improved memory cleanup. - ### 1.0.0 -#### First commit of Kerberos.io +#### Factory -* Camera support: **USBCamera** (V4L), **Raspberry Pi camera module** (MMAL). -* Conditions: **Enabled** (turn on/off Kerberos) and active **Time** per day. -* Algorithms: **Differential Images**. -* Heuristics: **Sequence**. -* Expositors: Select a **Hull** or **Rectangle**. -* Outputs: Write image to **Disk**, trigger an **GPIO** output pin and send a **TCP/IP packet**. -* Cloud: send your images to the **Kerberos.io cloud aplication**. +* React application using the Kubernetes Golang SDK. +* Possibility to add deployments one by one or in bulk (Excel). +* Configure machinery deployments: select a region of interest, specify recording time (pre, andd post recording), specify time interval.

1#$=iRx>8&`wPL4yx4_9Wu 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

4jLGc4jL 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