From 8c2efb1da52fe2235b47a89f2c6031751dc5f7a2 Mon Sep 17 00:00:00 2001 From: <> Date: Wed, 24 Jan 2024 16:48:38 +0000 Subject: [PATCH] Deployed fe562f9 with MkDocs version: 1.5.3 --- .nojekyll | 0 404.html | 341 + CNAME | 1 + assets/banner.png | Bin 0 -> 36320 bytes assets/favicon.ico | Bin 0 -> 4310 bytes assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.5cf534bf.min.js | 29 + assets/javascripts/bundle.5cf534bf.min.js.map | 8 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.12658920.min.js | 42 + .../workers/search.12658920.min.js.map | 8 + assets/logo.png | Bin 0 -> 11026 bytes assets/stylesheets/main.f79797b0.min.css | 1 + assets/stylesheets/main.f79797b0.min.css.map | 1 + assets/stylesheets/palette.2505c338.min.css | 1 + .../stylesheets/palette.2505c338.min.css.map | 1 + contribution/index.html | 402 + index.html | 516 ++ list/index.html | 1328 ++++ search/search_index.json | 1 + sitemap.xml | 18 + sitemap.xml.gz | Bin 0 -> 226 bytes 49 files changed, 9893 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 CNAME create mode 100644 assets/banner.png create mode 100644 assets/favicon.ico create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.5cf534bf.min.js create mode 100644 assets/javascripts/bundle.5cf534bf.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.12658920.min.js create mode 100644 assets/javascripts/workers/search.12658920.min.js.map create mode 100644 assets/logo.png create mode 100644 assets/stylesheets/main.f79797b0.min.css create mode 100644 assets/stylesheets/main.f79797b0.min.css.map create mode 100644 assets/stylesheets/palette.2505c338.min.css create mode 100644 assets/stylesheets/palette.2505c338.min.css.map create mode 100644 contribution/index.html create mode 100644 index.html create mode 100644 list/index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..e48a976 --- /dev/null +++ b/404.html @@ -0,0 +1,341 @@ + + + + + + + + + + + + + + + + + + + + + + Awesome DevOps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..6dc8b2d --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +awesome-devops.xyz diff --git a/assets/banner.png b/assets/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..ea39dace5e8c5143eb3692091bb07b6d27483d36 GIT binary patch literal 36320 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 IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/javascripts/bundle.5cf534bf.min.js b/assets/javascripts/bundle.5cf534bf.min.js new file mode 100644 index 0000000..eb0280e --- /dev/null +++ b/assets/javascripts/bundle.5cf534bf.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Hi=Object.create;var xr=Object.defineProperty;var Pi=Object.getOwnPropertyDescriptor;var $i=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,Ii=Object.getPrototypeOf,Er=Object.prototype.hasOwnProperty,an=Object.prototype.propertyIsEnumerable;var on=(e,t,r)=>t in e?xr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))Er.call(t,r)&&on(e,r,t[r]);if(kt)for(var r of kt(t))an.call(t,r)&&on(e,r,t[r]);return e};var sn=(e,t)=>{var r={};for(var n in e)Er.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&kt)for(var n of kt(e))t.indexOf(n)<0&&an.call(e,n)&&(r[n]=e[n]);return r};var Ht=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ji=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of $i(t))!Er.call(e,o)&&o!==r&&xr(e,o,{get:()=>t[o],enumerable:!(n=Pi(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Hi(Ii(e)):{},ji(t||!e||!e.__esModule?xr(r,"default",{value:e,enumerable:!0}):r,e));var fn=Ht((wr,cn)=>{(function(e,t){typeof wr=="object"&&typeof cn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(wr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function f(O){var Ne=O.type,Ue=O.tagName;return!!(Ue==="INPUT"&&a[Ne]&&!O.readOnly||Ue==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function c(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function u(O){O.hasAttribute("data-focus-visible-added")&&(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(s(r.activeElement)&&c(r.activeElement),n=!0)}function m(O){n=!1}function d(O){s(O.target)&&(n||f(O.target))&&c(O.target)}function h(O){s(O.target)&&(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(O.target))}function v(O){document.visibilityState==="hidden"&&(o&&(n=!0),B())}function B(){document.addEventListener("mousemove",V),document.addEventListener("mousedown",V),document.addEventListener("mouseup",V),document.addEventListener("pointermove",V),document.addEventListener("pointerdown",V),document.addEventListener("pointerup",V),document.addEventListener("touchmove",V),document.addEventListener("touchstart",V),document.addEventListener("touchend",V)}function re(){document.removeEventListener("mousemove",V),document.removeEventListener("mousedown",V),document.removeEventListener("mouseup",V),document.removeEventListener("pointermove",V),document.removeEventListener("pointerdown",V),document.removeEventListener("pointerup",V),document.removeEventListener("touchmove",V),document.removeEventListener("touchstart",V),document.removeEventListener("touchend",V)}function V(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,re())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),B(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var un=Ht(Sr=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},a=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(re,V){d.append(V,re)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Sr);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(O){throw new Error("URL unable to set base "+c+" due to "+O)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,B=!0,re=this;["append","delete","set"].forEach(function(O){var Ne=h[O];h[O]=function(){Ne.apply(h,arguments),v&&(B=!1,re.search=h.toString(),B=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var V=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==V&&(V=this.search,B&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},a=i.prototype,s=function(f){Object.defineProperty(a,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){s(f)}),Object.defineProperty(a,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(a,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Sr)});var Qr=Ht((Lt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Lt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Lt=="object"?Lt.ClipboardJS=r():t.ClipboardJS=r()})(Lt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return ki}});var a=i(279),s=i.n(a),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(F){try{return document.execCommand(F)}catch(T){return!1}}var d=function(T){var w=p()(T);return m("cut"),w},h=d;function v(F){var T=document.documentElement.getAttribute("dir")==="rtl",w=document.createElement("textarea");w.style.fontSize="12pt",w.style.border="0",w.style.padding="0",w.style.margin="0",w.style.position="absolute",w.style[T?"right":"left"]="-9999px";var k=window.pageYOffset||document.documentElement.scrollTop;return w.style.top="".concat(k,"px"),w.setAttribute("readonly",""),w.value=F,w}var B=function(T,w){var k=v(T);w.container.appendChild(k);var j=p()(k);return m("copy"),k.remove(),j},re=function(T){var w=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},k="";return typeof T=="string"?k=B(T,w):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?k=B(T.value,w):(k=p()(T),m("copy")),k},V=re;function O(F){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(w){return typeof w}:O=function(w){return w&&typeof Symbol=="function"&&w.constructor===Symbol&&w!==Symbol.prototype?"symbol":typeof w},O(F)}var Ne=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},w=T.action,k=w===void 0?"copy":w,j=T.container,N=T.target,Me=T.text;if(k!=="copy"&&k!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(N!==void 0)if(N&&O(N)==="object"&&N.nodeType===1){if(k==="copy"&&N.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(k==="cut"&&(N.hasAttribute("readonly")||N.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return V(Me,{container:j});if(N)return k==="cut"?h(N):V(N,{container:j})},Ue=Ne;function $e(F){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(w){return typeof w}:$e=function(w){return w&&typeof Symbol=="function"&&w.constructor===Symbol&&w!==Symbol.prototype?"symbol":typeof w},$e(F)}function Oi(F,T){if(!(F instanceof T))throw new TypeError("Cannot call a class as a function")}function nn(F,T){for(var w=0;w0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof j.action=="function"?j.action:this.defaultAction,this.target=typeof j.target=="function"?j.target:this.defaultTarget,this.text=typeof j.text=="function"?j.text:this.defaultText,this.container=$e(j.container)==="object"?j.container:document.body}},{key:"listenClick",value:function(j){var N=this;this.listener=c()(j,"click",function(Me){return N.onClick(Me)})}},{key:"onClick",value:function(j){var N=j.delegateTarget||j.currentTarget,Me=this.action(N)||"copy",Rt=Ue({action:Me,container:this.container,target:this.target(N),text:this.text(N)});this.emit(Rt?"success":"error",{action:Me,text:Rt,trigger:N,clearSelection:function(){N&&N.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(j){return yr("action",j)}},{key:"defaultTarget",value:function(j){var N=yr("target",j);if(N)return document.querySelector(N)}},{key:"defaultText",value:function(j){return yr("text",j)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(j){var N=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return V(j,N)}},{key:"cut",value:function(j){return h(j)}},{key:"isSupported",value:function(){var j=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],N=typeof j=="string"?[j]:j,Me=!!document.queryCommandSupported;return N.forEach(function(Rt){Me=Me&&!!document.queryCommandSupported(Rt)}),Me}}]),w}(s()),ki=Ri},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,f){for(;s&&s.nodeType!==o;){if(typeof s.matches=="function"&&s.matches(f))return s;s=s.parentNode}}n.exports=a},438:function(n,o,i){var a=i(828);function s(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?s.apply(null,arguments):typeof m=="function"?s.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return s(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=a(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(n,o,i){var a=i(879),s=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(h))throw new TypeError("Third argument must be a Function");if(a.node(m))return c(m,d,h);if(a.nodeList(m))return u(m,d,h);if(a.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return s(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),a=f.toString()}return a}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,a,s){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var f=this;function c(){f.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=s.length;for(f;f{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var is=/["'&<>]/;Jo.exports=as;function as(e){var t=""+e,r=is.exec(t);if(!r)return t;var n,o="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],a;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(s){a={error:s}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(a)throw a.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||s(m,d)})})}function s(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof Xe?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){s("next",m)}function u(m){s("throw",m)}function p(m,d){m(d),i.shift(),i.length&&s(i[0][0],i[0][1])}}function mn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof xe=="function"?xe(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(a){return new Promise(function(s,f){a=e[i](a),o(s,f,a.done,a.value)})}}function o(i,a,s,f){Promise.resolve(f).then(function(c){i({value:c,done:s})},a)}}function A(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var $t=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function We(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=xe(a),f=s.next();!f.done;f=s.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var u=this.initialTeardown;if(A(u))try{u()}catch(v){i=v instanceof $t?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=xe(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{dn(h)}catch(v){i=i!=null?i:[],v instanceof $t?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new $t(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)dn(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&We(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&We(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Ie.EMPTY;function It(e){return e instanceof Ie||e&&"closed"in e&&A(e.remove)&&A(e.add)&&A(e.unsubscribe)}function dn(e){A(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,a=o.isStopped,s=o.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Ie(function(){n.currentObservers=null,We(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,a=n.isStopped;o?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new U;return r.source=this,r},t.create=function(r,n){return new wn(r,n)},t}(U);var wn=function(e){ne(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Tr},t}(E);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ne(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,a=n._infiniteTimeWindow,s=n._timestampProvider,f=n._windowTime;o||(i.push(r),!a&&i.push(s.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,a=o._buffer,s=a.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var a=r.actions;n!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Ut);var Tn=function(e){ne(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Wt);var we=new Tn(On);var R=new U(function(e){return e.complete()});function Dt(e){return e&&A(e.schedule)}function kr(e){return e[e.length-1]}function qe(e){return A(kr(e))?e.pop():void 0}function Se(e){return Dt(kr(e))?e.pop():void 0}function Vt(e,t){return typeof kr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function zt(e){return A(e==null?void 0:e.then)}function Nt(e){return A(e[ft])}function qt(e){return Symbol.asyncIterator&&A(e==null?void 0:e[Symbol.asyncIterator])}function Kt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Ki(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Qt=Ki();function Yt(e){return A(e==null?void 0:e[Qt])}function Gt(e){return ln(this,arguments,function(){var r,n,o,i;return Pt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,Xe(r.read())];case 3:return n=a.sent(),o=n.value,i=n.done,i?[4,Xe(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,Xe(o)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Bt(e){return A(e==null?void 0:e.getReader)}function $(e){if(e instanceof U)return e;if(e!=null){if(Nt(e))return Qi(e);if(pt(e))return Yi(e);if(zt(e))return Gi(e);if(qt(e))return _n(e);if(Yt(e))return Bi(e);if(Bt(e))return Ji(e)}throw Kt(e)}function Qi(e){return new U(function(t){var r=e[ft]();if(A(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Yi(e){return new U(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?M(function(o,i){return e(o,i,n)}):me,Te(1),r?ke(t):zn(function(){return new Xt}))}}function Nn(){for(var e=[],t=0;t=2,!0))}function fe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new E}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,f=s===void 0?!0:s;return function(c){var u,p,m,d=0,h=!1,v=!1,B=function(){p==null||p.unsubscribe(),p=void 0},re=function(){B(),u=m=void 0,h=v=!1},V=function(){var O=u;re(),O==null||O.unsubscribe()};return g(function(O,Ne){d++,!v&&!h&&B();var Ue=m=m!=null?m:r();Ne.add(function(){d--,d===0&&!v&&!h&&(p=Fr(V,f))}),Ue.subscribe(Ne),!u&&d>0&&(u=new et({next:function($e){return Ue.next($e)},error:function($e){v=!0,B(),p=Fr(re,o,$e),Ue.error($e)},complete:function(){h=!0,B(),p=Fr(re,a),Ue.complete()}}),$(O).subscribe(u))})(c)}}function Fr(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function q(e,t=document){let r=se(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function se(e,t=document){return t.querySelector(e)||void 0}function je(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(Re(1),l(()=>{let t=je();return typeof t!="undefined"?e.contains(t):!1}),z(e===je()),Y())}function Ye(e){return{x:e.offsetLeft,y:e.offsetTop}}function Yn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ae(0,we),l(()=>Ye(e)),z(Ye(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ae(0,we),l(()=>rr(e)),z(rr(e)))}var Bn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!zr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),xa?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!zr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ya.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Jn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Zn=typeof WeakMap!="undefined"?new WeakMap:new Bn,eo=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=Ea.getInstance(),n=new Ra(t,r,this);Zn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){eo.prototype[e]=function(){var t;return(t=Zn.get(this))[e].apply(t,arguments)}});var ka=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:eo}(),to=ka;var ro=new E,Ha=I(()=>H(new to(e=>{for(let t of e)ro.next(t)}))).pipe(x(e=>L(Oe,H(e)).pipe(C(()=>e.disconnect()))),J(1));function de(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){return Ha.pipe(S(t=>t.observe(e)),x(t=>ro.pipe(M(({target:r})=>r===e),C(()=>t.unobserve(e)),l(()=>de(e)))),z(de(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var no=new E,Pa=I(()=>H(new IntersectionObserver(e=>{for(let t of e)no.next(t)},{threshold:0}))).pipe(x(e=>L(Oe,H(e)).pipe(C(()=>e.disconnect()))),J(1));function sr(e){return Pa.pipe(S(t=>t.observe(e)),x(t=>no.pipe(M(({target:r})=>r===e),C(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function oo(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=de(e),o=bt(e);return r>=o.height-n.height-t}),Y())}var cr={drawer:q("[data-md-toggle=drawer]"),search:q("[data-md-toggle=search]")};function io(e){return cr[e].checked}function Ge(e,t){cr[e].checked!==t&&cr[e].click()}function Be(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),z(t.checked))}function $a(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ia(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(z(!1))}function ao(){let e=b(window,"keydown").pipe(M(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:io("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),M(({mode:t,type:r})=>{if(t==="global"){let n=je();if(typeof n!="undefined")return!$a(n,r)}return!0}),fe());return Ia().pipe(x(t=>t?R:e))}function _e(){return new URL(location.href)}function ot(e){location.href=e.href}function so(){return new E}function co(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)co(e,r)}function _(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)co(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function fo(){return location.hash.substring(1)}function uo(e){let t=_("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function ja(){return b(window,"hashchange").pipe(l(fo),z(fo()),M(e=>e.length>0),J(1))}function po(){return ja().pipe(l(e=>se(`[id="${e}"]`)),M(e=>typeof e!="undefined"))}function Nr(e){let t=matchMedia(e);return Zt(r=>t.addListener(()=>r(t.matches))).pipe(z(t.matches))}function lo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(z(e.matches))}function qr(e,t){return e.pipe(x(r=>r?t():R))}function ur(e,t={credentials:"same-origin"}){return ve(fetch(`${e}`,t)).pipe(ce(()=>R),x(r=>r.status!==200?Ot(()=>new Error(r.statusText)):H(r)))}function Fe(e,t){return ur(e,t).pipe(x(r=>r.json()),J(1))}function mo(e,t){let r=new DOMParser;return ur(e,t).pipe(x(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),J(1))}function pr(e){let t=_("script",{src:e});return I(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(x(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),C(()=>document.head.removeChild(t)),Te(1))))}function ho(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function bo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(ho),z(ho()))}function vo(){return{width:innerWidth,height:innerHeight}}function go(){return b(window,"resize",{passive:!0}).pipe(l(vo),z(vo()))}function yo(){return Q([bo(),go()]).pipe(l(([e,t])=>({offset:e,size:t})),J(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(X("size")),o=Q([n,r]).pipe(l(()=>Ye(e)));return Q([r,t,o]).pipe(l(([{height:i},{offset:a,size:s},{x:f,y:c}])=>({offset:{x:a.x-f,y:a.y-c+i},size:s})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(a=>{let s=document.createElement("script");s.src=i,s.onload=a,document.body.appendChild(s)})),Promise.resolve())}var r=class{constructor(n){this.url=n,this.onerror=null,this.onmessage=null,this.onmessageerror=null,this.m=a=>{a.source===this.w&&(a.stopImmediatePropagation(),this.dispatchEvent(new MessageEvent("message",{data:a.data})),this.onmessage&&this.onmessage(a))},this.e=(a,s,f,c,u)=>{if(s===this.url.toString()){let p=new ErrorEvent("error",{message:a,filename:s,lineno:f,colno:c,error:u});this.dispatchEvent(p),this.onerror&&this.onerror(p)}};let o=new EventTarget;this.addEventListener=o.addEventListener.bind(o),this.removeEventListener=o.removeEventListener.bind(o),this.dispatchEvent=o.dispatchEvent.bind(o);let i=document.createElement("iframe");i.width=i.height=i.frameBorder="0",document.body.appendChild(this.iframe=i),this.w.document.open(),this.w.document.write(` + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Contribution

+

Contributions are always welcome.

+
    +
  • Fork the repo
  • +
  • Create a pull request against master
  • +
  • Be sure tests pass (if exists)
  • +
+

Check Git Flow for details.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..270d667 --- /dev/null +++ b/index.html @@ -0,0 +1,516 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Awesome DevOps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + + +

Welcome

+

Awesome DevOps

+

A curated list of awesome DevOps platforms, tools, practices and resources. A list which help you to adopt and grow DevOps culture in your company. Also this list can be easily used for your SRE1 team.

+

What is DevOps

+

DevOps is the combination of cultural philosophies, practices, and tools that increases an organization’s ability to deliver applications and services at high velocity: evolving and improving products at a faster pace than organizations using traditional software development and infrastructure management processes. This speed enables organizations to better serve their customers and compete more effectively in the market.

+

Benefits

+
    +
  • Speed
  • +
  • Rapid Delivery
  • +
  • Reliability
  • +
  • Scale
  • +
  • Improved Collaboration
  • +
  • Security
  • +
+

Practices

+
    +
  • Continuous Integration (CI)
  • +
  • Continuous Delivery (CD)
  • +
  • Continuous Deployment (CD)
  • +
  • Microservices
  • +
  • Infrastructure as Code (IaC)
  • +
  • Monitoring and Logging
  • +
  • Communication and Collaboration
  • +
+

Tools

+

For list of tools check list page.

+
+
+
    +
  1. +

    Site Reliability Engineering. 

    +
  2. +
+
+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/list/index.html b/list/index.html new file mode 100644 index 0000000..2408816 --- /dev/null +++ b/list/index.html @@ -0,0 +1,1328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Awesome list - Awesome DevOps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+ +
+ + + + + + + +
+
+ + + + + + + + +

Awesome DevOps

+

Awesome DevOps

+

Awesome +Deploy +Links validator

+
+

A curated list of platforms, tools, practices and resources to create, improve DevOps culture and SRE Team in the organization.

+
+

DevOps is the combination of cultural philosophies, practices, and tools that increases an organization’s ability to deliver applications and services at high velocity: evolving and improving products at a faster pace than organizations using traditional software development and infrastructure management processes. This speed enables organizations to better serve their customers and compete more effectively in the market.

+

Contents

+ +
+

Cloud Platforms

+

Public and Private Cloud Platforms.

+
    +
  • Amazon Web Services (AWS) - Cloud Computing Services.
  • +
  • Google Cloud Platform (GCP) - Cloud Computing Services.
  • +
  • Azure - Cloud Computing Platform & Services.
  • +
  • Alibaba Cloud - Integrated suite of cloud products and services.
  • +
  • Oracle Cloud - Comprehensive and fully integrated stack of cloud applications and platform services.
  • +
  • DigitalOcean - Helping developers easily build, test, manage, and scale applications of any size.
  • +
  • Scaleway - Single way to create, deploy and scale your infrastructure in the cloud.
  • +
  • Vultr - Easily deploy cloud servers, bare metal, and storage worldwide.
  • +
  • VMware Cloud - Run, manage, connect and protect all of your apps on any cloud.
  • +
  • IBM Cloud - Tools, data & APIs to make AI real now.
  • +
  • Stackpath - Platform of computing infrastructure and services built at the edge of the cloud.
  • +
  • Linode - Accelerate innovation in the cloud, virtual computing must be more accessible, affordable, and simple.
  • +
  • Kinsta - Create and deploy web applications and databases in minutes.
  • +
+

Open Source Cloud Platforms

+

Private, Public and Hybrid open source Cloud Platforms.

+
    +
  • Openstack - Open source software for creating private and public clouds.
  • +
  • Apache CloudStack - Designed to deploy and manage large networks of virtual machines.
  • +
  • OpenNebula - Build Private Clouds and manage Data Center virtualization based on KVM, LXD and VMware.
  • +
  • Eucalyptus - Building AWS-compatible private and hybrid clouds.
  • +
  • DC/OS - Distributed operating system based on the Apache Mesos distributed systems kernel.
  • +
  • Apache Mesos - Program against your datacenter like it’s a single pool of resources.
  • +
  • Localstack - Fully functional local AWS cloud stack. Develop and test your cloud & Serverless apps offline.
  • +
+

Operating Systems

+

Operating Systems - Server Platform.

+
    +
  • Ubuntu - Enterprise Open Source and Linux.
  • +
  • Rocky Linux - Open-source enterprise operating system designed to be 100% bug-for-bug compatible with Red Hat Enterprise Linux.
  • +
  • CoreOS - The pioneering lightweight container host.
  • +
  • OSv - Versatile modular unikernel designed to run unmodified Linux applications securely on micro-VMs in the cloud.
  • +
  • Atomic - Use immutable infrastructure to deploy and scale your containerized applications.
  • +
  • Photon - Linux container host optimized for cloud-native applications, cloud platforms, and VMware infrastructure.
  • +
+

Distributed Filesystems

+

Network distributed filesystems.

+
    +
  • Ceph - Highly scalable object, block and file-based storage under one whole system.
  • +
  • Gluster - Free and open source software scalable network filesystem.
  • +
  • LINBIT - Create, remove, and replicate block storage devices for datacenter scale environments.
  • +
  • XtreemFS - Fault-tolerant distributed file system for all storage needs.
  • +
  • min.io - High performance, distributed object storage system.
  • +
+

Applications Platforms

+

Applications management platforms, Containers platform and Containers management.

+
    +
  • Openshift - The Kubernetes platform for big ideas.
  • +
  • Dokku - Helps you build and manage the lifecycle of applications.
  • +
  • Flynn - Open source platform (PaaS) for running applications in production.
  • +
  • Cloud 66 - DevOps as a service that helps to build, deploy and manage any application on any cloud or server.
  • +
  • Docker - Create, deploy, and run applications by using containers.
  • +
  • Docker Compose - Define and run multi-container applications with Docker.
  • +
  • Docker Swarm - Docker-native clustering system.
  • +
  • Kubernetes - Automating deployment, scaling, and management of containerized applications.
  • +
  • LXC - Lets Linux users easily create and manage system or application containers.
  • +
  • Rancher - Lets you deliver Kubernetes-as-a-Service.
  • +
  • OpenVz - Container-based virtualization for Linux.
  • +
  • Singularity - Run the application from the local environment to the cloud.
  • +
  • AppScale - Easy-to-manage serverless platform for building and running scalable web and mobile applications.
  • +
  • Kata Containers - Building lightweight virtual machines that seamlessly plug into the containers ecosystem.
  • +
  • K3S - The certified Kubernetes distribution built for IoT and Edge computing.
  • +
  • Podman - A tool for managing OCI containers and pods.
  • +
  • Linx - General-purpose low-code platform for building and hosting backend solutions.
  • +
+

Internal Developer Platforms

+

Internal Developer Platforms (or IDP) is a set of tools, services and processes that supports and accelerates your software development, while taking care of managing the underlying infrastructure.

+
    +
  • Port - A platform for building no-code, holistic, Internal Developer Portals.
  • +
  • Backstage - An open platform for building developer portals.
  • +
  • Kratix - A framework used by platform teams to build the custom platforms tailored to their organisation.
  • +
+

Container Image Registry

+

Container Image registry.

+
    +
  • Quay - Container image registry that enables you to build, organize, distribute, and deploy containers.
  • +
  • Dockyard - Container & Artifact Repository.
  • +
  • Harbor - An open source trusted cloud native registry project that stores, signs, and scans content.
  • +
  • GitHub Container Registry - Container registry free for public images.
  • +
+

Automation & Orchestration

+

Tools for automation, orchestration, deployment, provisioning and configuration management.

+
    +
  • Ansible - Simple IT automation platform that makes your applications and systems easier to deploy.
  • +
  • Salt - Automate the management and configuration of any infrastructure or application at scale.
  • +
  • Puppet - Unparalleled infrastructure automation and delivery.
  • +
  • Chef - Automate infrastructure and applications.
  • +
  • Juju - Simplifies how you configure, scale and operate today's complex software.
  • +
  • Rundeck - Runbook Automation For Modernizing Your Operations.
  • +
  • StackStorm - Connects all your apps, services, and workflows. Automate DevOps your way.
  • +
  • Bosh - Release engineering, deployment, and lifecycle management of complex distributed systems.
  • +
  • Cloudify - Connect, Control, & Automate from core to edge: unlimited locations, clouds and devices.
  • +
  • Tsuru - An extensible and open source Platform as a Service software.
  • +
  • Fabric - High level Python library designed to execute shell commands remotely over SSH.
  • +
  • Capistrano - A remote server automation and deployment tool.
  • +
  • Mina - Really fast deployer and server automation tool.
  • +
  • Terraform - use Infrastructure as Code to provision and manage any cloud, infrastructure, or service.
  • +
  • Pulumi - Modern infrastructure as code platform that allows you to use familiar programming languages and tools to build, deploy, and manage cloud infrastructure.
  • +
  • Packer - Build Automated Machine Images.
  • +
  • Vagrant - Development Environments Made Easy.
  • +
  • Foreman - Complete lifecycle management tool for physical and virtual servers.
  • +
  • Nomad - Deploy and Manage Any Containerized, Legacy, or Batch Application.
  • +
  • Marathon - A production-grade container orchestration platform for DC/OS and Apache Mesos.
  • +
  • OctoDNS - Managing DNS across multiple providers. DNS as code.
  • +
  • ManageIQ - Manage containers, virtual machines, networks, and storage from a single platform.
  • +
  • Ignite - Open Source Virtual Machine (VM) manager with a container UX and built-in GitOps management.
  • +
  • Selefra - An open-source policy-as-code software that provides analytics for multi-cloud and SaaS.
  • +
  • Spacelift - Flexible orchestration solution for IaC development.
  • +
  • Atlantis - Terraform Pull Request Automation
  • +
  • KubeVela - Modern application delivery platform that makes deploying and operating applications across today's hybrid, multi-cloud environments easier, faster and more reliable.
  • +
  • Stacktape - Developer-friendly Infrastructure as a Code framework built on top of AWS.
  • +
  • Score - Open Source developer-centric and platform-agnostic workload specification.
  • +
  • Digger - Open Source Infrastructure as Code management tool that runs within your CI/CD system.
  • +
+

Continuous Integration & Delivery

+

Continuous Integration, Continuous Delivery and Continuous Delivery. GitOps.

+
    +
  • On premises
  • +
  • Buildbot - automate all aspects of the software development cycle.
  • +
  • Gitlab CI - pipelines build, test, deploy, and monitor your code as part of a single, integrated workflow.
  • +
  • Jenkins - automation server for building, deploying and automating any project.
  • +
  • Drone - a Container-Native, Continuous Delivery Platform.
  • +
  • Concourse - pipeline-based continuous thing-doer.
  • +
  • Spinnaker - fast, safe, repeatable deployments for every Enterprise.
  • +
  • goCD - Delivery and Release Automation server.
  • +
  • Teamcity - enterprise-level CI and CD.
  • +
  • Bamboo - tie automated builds, tests, and releases together in a single workflow.
  • +
  • Integrity - Continuous Integration server.
  • +
  • Zuul - drives continuous integration, delivery, and deployment systems with a focus on project gating.
  • +
  • Argo - Open Source Kubernetes native workflows, events, CI and CD.
  • +
  • Strider - Continuous Deployment/Continuous Integration platform.
  • +
  • Evergreen - A Distributed Continuous Integration System from MongoDB.
  • +
  • werf - Open Source CI/CD tool for building Docker images & deploying them to Kubernetes using a GitOps approach.
  • +
  • Flux - automatically ensures that the state of your Kubernetes cluster matches the configuration you’ve supplied in Git.
  • +
  • Flagger - progressive delivery Kubernetes operator (Canary, A/B Testing and Blue/Green deployments).
  • +
  • Tekton - powerful and flexible open-source framework for creating CI/CD systems.
  • +
  • PipeCD - Continuous Delivery for Declarative Kubernetes, Serverless and Infrastructure Applications.
  • +
  • Gitploy - Build the deployment system around GitHub in minutes.
  • +
  • Dagger - CI/CD as Code that Runs Anywhere.
  • +
  • Public Services
  • +
  • Travis CI - easily sync your projects, you’ll be testing your code in minutes.
  • +
  • Circle CI - powerful CI/CD pipelines that keep code moving.
  • +
  • Bitrise - CI/CD for mobile applications.
  • +
  • Buildkite - run fast, secure, and scalable continuous integration pipelines on your own infrastructure.
  • +
  • Cirrus CI - continuous integration system built for the era of cloud computing.
  • +
  • Codefresh - GitOps automation platform for Kubernetes apps.
  • +
  • Github actions - GitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD.
  • +
  • Kraken CI - Modern CI/CD, open-source, on-premise system that is highly scalable and focused on testing.
  • +
  • Earthly - Develop CI/CD pipelines locally and run them anywhere.
  • +
+

Source Code Management

+

Source Code management, Git-repository manager, Version Control. Some of them are included in Code review section.

+
    +
  • GitHub - Helps developers store and manage their code, as well as track and control changes to their code.
  • +
  • Gitlab - Entire DevOps lifecycle in one application.
  • +
  • Bitbucket - Gives teams one place to plan projects, collaborate on code, test, and deploy
  • +
  • Phabricator - A collection of web applications which help software companies build better software.
  • +
  • Gogs - A painless self-hosted Git service.
  • +
  • Gitea - A painless self-hosted Git service.
  • +
  • Gitblit - Pure Java Git solution for managing, viewing, and serving Git repositories.
  • +
  • RhodeCode - Centralized control for distributed repositories. Mercurial, Git, and Subversion under a single roof.
  • +
  • Radicle - Radicle is a sovereign peer-to-peer network for code collaboration, built on top of Git.
  • +
+

Web Servers

+

Web servers and reverse proxy.

+
    +
  • Nginx - High performance load balancer, web server and reverse proxy.
  • +
  • Apache - Web server and reverse proxy.
  • +
  • Caddy - Web server with automatic HTTPS.
  • +
  • Cherokee - Highly concurrent secured web applications.
  • +
  • Lighttpd - Optimized for speed-critical environments while remaining standards-compliant, secure and flexible.
  • +
  • Uwsgi - Application server container.
  • +
+

SSL

+

Tools for automating the management of SSL certificates.

+
    +
  • Certbot - Automate using Let’s Encrypt certificates on manually-managed websites to enable HTTPS.
  • +
  • Let’s Encrypt - Free, automated, and open Certificate Authority.
  • +
  • Cert Manager - K8S add-on to automate the management and issuance of TLS certificates from various issuing sources.
  • +
+

Databases

+

Relational (SQL) and non-relational (NoSQL) databases.

+
    +
  • Relational (SQL)
  • +
  • PostgreSQL - Powerful, open source object-relational database system.
  • +
  • MySQL - Open-source relational database management system.
  • +
  • MariaDB - Fast, scalable and robust, with a rich ecosystem of storage engines, plugins and many other tools.
  • +
  • SQLite - Small, fast, self-contained, high-reliability, full-featured, SQL database engine.
  • +
  • Non-relational (NoSQL)
  • +
  • Cassandra - Manage massive amounts of data, fast, without losing sleep.
  • +
  • ScyllaDB - NoSQL data store using the seastar framework, compatible with Apache Cassandra
  • +
  • Apache HBase - Distributed, versioned, non-relational database.
  • +
  • Couchdb - Database that completely embraces the web.
  • +
  • Elasticsearch - Distributed, RESTful search and analytics engine capable of addressing a growing number of use cases.
  • +
  • MongoDB - General purpose, document-based, distributed database built for modern applications.
  • +
  • Rethinkdb - Open-source database for the realtime web.
  • +
  • Key-Value
      +
    • Couchbase - Distributed multi-model NoSQL document-oriented database that is optimized for interactive applications.
    • +
    • Leveldb - Fast key-value storage library.
    • +
    • Redis - In-memory data structure store, used as a database, cache and message broker.
    • +
    • RocksDB - A library that provides an embeddable, persistent key-value store for fast storage.
    • +
    • Etcd - Distributed reliable key-value store for the most critical data of a distributed system.
    • +
    +
  • +
+

Observability & Monitoring

+

Observability, Monitoring, Metrics/Metrics collection and Alerting tools.

+
    +
  • Steampipe - The universal SQL interface for any cloud API, & cloud intelligence dashboards extensible w/ HCL+SQL.
  • +
  • Sensu - Simple. Scalable. Multi-cloud monitoring.
  • +
  • Alerta - Scalable, minimal configuration and visualization monitoring system.
  • +
  • Cabot - Self-hosted, easily-deployable monitoring and alerts service.
  • +
  • Amon - Modern server monitoring platform.
  • +
  • Icinga - Monitors availability and performance, gives you simple access to relevant data and raises alerts.
  • +
  • Monit - Managing and monitoring Unix systems.
  • +
  • Naemon - Fast, stable and innovative while giving you a clear view of the state of your network and applications.
  • +
  • Nagios - Computer-software application that monitors systems, networks and infrastructure.
  • +
  • Sentry - Error monitoring that helps all software teams discover, triage, and prioritize errors in real-time.
  • +
  • Shinken - Monitoring framework.
  • +
  • Zabbix - Mature and effortless monitoring solution for network monitoring and application monitoring.
  • +
  • Glances - Monitoring information through a curses or Web based interface.
  • +
  • Healthchecks - Cron monitoring tool.
  • +
  • Bolo - Building distributed, scalable monitoring systems.
  • +
  • cAdvisor - Analyzes resource usage and performance characteristics of running containers.
  • +
  • ElastiFlow - Network flow monitoring (Netflow, sFlow and IPFIX) with the Elastic Stack.
  • +
  • Co-Pilot - System performance analysis toolkit.
  • +
  • Keep - Open source alerting CLI for developers.
  • +
  • Globalping CLI - Run network commands like ping, traceroute and mtr from hundreds of global locations.
  • +
  • Grai - Open source observability integrating data impact analysis into CI.
  • +
  • Canary Checker - Open source health check platform.
  • +
  • Metrics/Metrics collection
  • +
  • Thundra Foresight - Visibility into CI pipeline by spotting test failures in no time.
  • +
  • Prometheus - Power your metrics and alerting with a leading open-source monitoring solution.
  • +
  • Collectd - The system statistics collection daemon.
  • +
  • Facette - Time series data visualization software.
  • +
  • Grafana - Analytics & monitoring solution for every database.
  • +
  • Graphite - Store numeric time-series data and render graphs of this data on demand.
  • +
  • Influxdata - Time series database.
  • +
  • Netdata - Instantly diagnose slowdowns and anomalies in your infrastructure.
  • +
  • Freeboard - Real-time dashboard builder for IOT and other web mashups.
  • +
  • Autometrics - An open source micro framework for observability.
  • +
  • Logs Management
  • +
  • Anthracite - An event/change logging/management app.
  • +
  • Graylog - Free and open source log management.
  • +
  • Logstash - Collect, parse, transform logs.
  • +
  • Fluentd - Data collector for unified logging layer.
  • +
  • Flume - Distributed, reliable, and available service for efficiently collecting, aggregating, and moving logs.
  • +
  • Heka - Stream processing software system.
  • +
  • Kibana - Explore, visualize, discover data.
  • +
  • Loki - Horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus.
  • +
  • Status
  • +
  • Cachet - Beautiful and powerful open source status page system.
  • +
  • StatusPal - Communicate incidents and maintenance effectively with a beautiful hosted status page.
  • +
  • Instatus - Quick and beautiful status page.
  • +
+

Service Discovery & Service Mesh

+

Service Discovery, Service Mesh and Failure detection tools.

+
    +
  • Consul - Connect and secure any service.
  • +
  • Serf - Decentralized cluster membership, failure detection, and orchestration.
  • +
  • Doozerd - A consistent distributed data store.
  • +
  • Zookeeper - Centralized service for configuration, naming, providing distributed synchronization, and more.
  • +
  • Etcd - Distributed, reliable key-value store for the most critical data of a distributed system.
  • +
  • Istio - Connect, secure, control, and observe services.
  • +
  • Kong - Deliver performance needed for microservices, service mesh, and cloud native deployments.
  • +
  • Linkerd - Service mesh for Kubernetes and beyond.
  • +
+

Chaos Engineering

+

The discipline of experimenting on a distributed system in order to build confidence in the system's capability to withstand turbulent conditions in production.

+
    +
  • Chaos Toolkit - The Open Source Platform for Chaos Engineering.
  • +
  • Chaos Monkey - A resiliency tool that helps applications tolerate random instance failures.
  • +
  • Toxiproxy - Simulate network and system conditions for chaos and resiliency testing.
  • +
  • Pumba - Chaos testing, network emulation and stress testing tool for containers.
  • +
  • Chaos Mesh - A Chaos Engineering Platform for Kubernetes.
  • +
  • Litmus - Litmus enables teams to identify weaknesses in infrastructures.
  • +
+

API Gateway

+

API Gateway, Service Proxy and Service Management tools.

+
    +
  • API Umbrella - Proxy that sits in front of your APIs, API management platform.
  • +
  • Ambassador - Kubernetes-Native API Gateway built on the Envoy Proxy.
  • +
  • Kong - Connect all your microservices and APIs with the industry’s most performant, scalable and flexible API platform.
  • +
  • Tyk - API and service management platform.
  • +
  • Cilium - API aware networking and security using BPF and XDP.
  • +
  • Gloo - Feature-rich, Kubernetes-native ingress controller, and next-generation API gateway.
  • +
  • Envoy - Cloud-native high-performance edge/middle/service proxy.
  • +
  • Traefik - Reverse proxy and load balancer for HTTP and TCP-based applications.
  • +
+

Code review

+

Code review. A few of the Source Code Management tools have built-in code review features.

+
    +
  • Gerrit - Web-based team code collaboration tool.
  • +
  • Review Board - Web-based collaborative code review tool.
  • +
+

Distributed messaging

+

Distributed messaging platforms and Queues software.

+
    +
  • Rabbitmq - Message broker.
  • +
  • Kafka - Building real-time data pipelines and streaming apps.
  • +
  • Activemq - Multi-Protocol messaging.
  • +
  • Beanstalkd - Simple, fast work queue.
  • +
  • NSQ - Realtime distributed messaging platform.
  • +
  • Celery - Asynchronous task queue/job queue based on distributed message passing.
  • +
  • Faktory - Repository for background jobs within your application.
  • +
  • Nats - Simple, secure and high performance open source messaging system.
  • +
  • RestMQ - Message queue which uses HTTP as transport.
  • +
  • Dkron - Distributed, fault tolerant job scheduling system.
  • +
  • KubeMQ - Kubernetes-native messaging platform.
  • +
+

Programming Languages

+

Programming languages.

+
    +
  • Python - Programming language that lets you work quickly and integrate systems more effectively.
  • +
  • Ruby - A dynamic, open source programming language with a focus on simplicity and productivity.
  • +
  • Go - An open source programming language that makes it easy to build simple, reliable, and efficient software.
  • +
+

Chat and ChatOps

+

Chat and ChatOps.

+
    +
  • Rocket - Open source team communication.
  • +
  • Mattermost - Messaging platform that enables secure team collaboration.
  • +
  • Zulip - Real-time chat with an email threading model.
  • +
  • Riot - A universal secure chat app entirely under your control.
  • +
  • ChatOps:
  • +
  • CloudBot - Simple, fast, expandable, open-source Python IRC Bot.
  • +
  • Hubot - A customizable life embetterment robot.
  • +
+

Secret Management

+

Security as code, sensitive credentials and secrets need to be managed, security, maintained and rotated using automation.

+
    +
  • Sops - Simple and flexible tool for managing secrets.
  • +
  • Vault - Manage secrets and protect sensitive data.
  • +
  • Keybase - End-to-end encrypted chat and cloud storage system.
  • +
  • Vault Secrets Operator - Create Kubernetes secrets from Vault for a secure GitOps based workflow.
  • +
  • Git Secret - A bash-tool to store your private data inside a git repository.
  • +
  • Infisical - Open source end-to-end encrypted secrets sync for teams and infrastructure.
  • +
  • Lade - Automatically load secrets from your preferred vault as environment variables.
  • +
+

Security

+

Validating, lint and best practice in term of Security on code or infrastructure.

+
    +
  • checkov - Prevent cloud misconfigurations and find vulnerabilities during build-time in infrastructure as code, container images and open source packages.
  • +
+

Sharing

+

A collection of tools to help with sharing knowledge and telling the story.

+
    +
  • Gitbook - Modern documentation format and toolchain using Git and Markdown.
  • +
  • Docusaurus - Easy to maintain open source documentation websites.
  • +
  • Docsify - A magical documentation site generator.
  • +
  • MkDocs - Project documentation with Markdown.
  • +
+

VPN

+

VPN, routing and firewall.

+
    +
  • OpenVPN - Flexible VPN solutions to secure your data communications, whether it's for Internet privacy.
  • +
  • Pritunl - Enterprise Distributed OpenVPN and IPsec Server.
  • +
  • VyOS - Open source network OS that runs on a wide range of hardware, virtual machines, and cloud providers.
  • +
  • Algo - Set up a personal VPN in the cloud.
  • +
  • Streisand - Sets up a new VPN service nearly automatically.
  • +
  • Freelan - A peer-to-peer, secure, easy-to-setup, multi-platform, open-source, highly-configurable VPN software.
  • +
  • Sshuttle - Transparent proxy server that works as a poor man's VPN.
  • +
  • SoftEther - An Open-Source Free Cross-platform Multi-protocol VPN Program. +as an academic project from University of Tsukuba, under the Apache License 2.0.
  • +
  • Firezone - Self-hosted VPN server using WireGuard. Supports MFA, SSO, and has easy deployment options.
  • +
+

Resources

+

Books

+

Books focused on DevOps, DevSecOps and Site Reliability Engineering.

+ +

Conferences

+ +

DevOps Roadmap

+

Basic understanding and what you should know to become a DevOps Engineer, check the roadmap here.

+

Contributing

+

Your contributions are always welcome! Please take a look at the Contribution Guidelines.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..8cbad96 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome","text":"

A curated list of awesome DevOps platforms, tools, practices and resources. A list which help you to adopt and grow DevOps culture in your company. Also this list can be easily used for your SRE1 team.

"},{"location":"#what-is-devops","title":"What is DevOps","text":"

DevOps is the combination of cultural philosophies, practices, and tools that increases an organization\u2019s ability to deliver applications and services at high velocity: evolving and improving products at a faster pace than organizations using traditional software development and infrastructure management processes. This speed enables organizations to better serve their customers and compete more effectively in the market.

"},{"location":"#benefits","title":"Benefits","text":"
  • Speed
  • Rapid Delivery
  • Reliability
  • Scale
  • Improved Collaboration
  • Security
"},{"location":"#practices","title":"Practices","text":"
  • Continuous Integration (CI)
  • Continuous Delivery (CD)
  • Continuous Deployment (CD)
  • Microservices
  • Infrastructure as Code (IaC)
  • Monitoring and Logging
  • Communication and Collaboration
"},{"location":"#tools","title":"Tools","text":"

For list of tools check list page.

  1. Site Reliability Engineering.\u00a0\u21a9

"},{"location":"contribution/","title":"Contribution","text":"

Contributions are always welcome.

  • Fork the repo
  • Create a pull request against master
  • Be sure tests pass (if exists)

Check Git Flow for details.

"},{"location":"list/","title":"Awesome DevOps","text":"

A curated list of platforms, tools, practices and resources to create, improve DevOps culture and SRE Team in the organization.

DevOps is the combination of cultural philosophies, practices, and tools that increases an organization\u2019s ability to deliver applications and services at high velocity: evolving and improving products at a faster pace than organizations using traditional software development and infrastructure management processes. This speed enables organizations to better serve their customers and compete more effectively in the market.

"},{"location":"list/#contents","title":"Contents","text":"
  • Cloud Platforms
  • Open Source Cloud Platforms
  • Operating Systems
  • Distributed Filesystems
  • Applications Platforms
  • Internal Developer Platforms
  • Container Image Registry
  • Automation & Orchestration
  • Continuous Integration & Delivery
  • Source Code Management
  • Web Servers
  • SSL
  • Databases
  • Observability and Monitoring
  • Service Discovery & Service Mesh
  • Chaos Engineering
  • API Gateway
  • Code review
  • Distributed messaging
  • Programming Languages
  • Chat and ChatOps
  • Secret Management
  • Security
  • Sharing
  • VPN
  • Resources
  • Books
  • Conferences
  • DevOps Roadmap
"},{"location":"list/#cloud-platforms","title":"Cloud Platforms","text":"

Public and Private Cloud Platforms.

  • Amazon Web Services (AWS) - Cloud Computing Services.
  • Google Cloud Platform (GCP) - Cloud Computing Services.
  • Azure - Cloud Computing Platform & Services.
  • Alibaba Cloud - Integrated suite of cloud products and services.
  • Oracle Cloud - Comprehensive and fully integrated stack of cloud applications and platform services.
  • DigitalOcean - Helping developers easily build, test, manage, and scale applications of any size.
  • Scaleway - Single way to create, deploy and scale your infrastructure in the cloud.
  • Vultr - Easily deploy cloud servers, bare metal, and storage worldwide.
  • VMware Cloud - Run, manage, connect and protect all of your apps on any cloud.
  • IBM Cloud - Tools, data & APIs to make AI real now.
  • Stackpath - Platform of computing infrastructure and services built at the edge of the cloud.
  • Linode - Accelerate innovation in the cloud, virtual computing must be more accessible, affordable, and simple.
  • Kinsta - Create and deploy web applications and databases in minutes.
"},{"location":"list/#open-source-cloud-platforms","title":"Open Source Cloud Platforms","text":"

Private, Public and Hybrid open source Cloud Platforms.

  • Openstack - Open source software for creating private and public clouds.
  • Apache CloudStack - Designed to deploy and manage large networks of virtual machines.
  • OpenNebula - Build Private Clouds and manage Data Center virtualization based on KVM, LXD and VMware.
  • Eucalyptus - Building AWS-compatible private and hybrid clouds.
  • DC/OS - Distributed operating system based on the Apache Mesos distributed systems kernel.
  • Apache Mesos - Program against your datacenter like it\u2019s a single pool of resources.
  • Localstack - Fully functional local AWS cloud stack. Develop and test your cloud & Serverless apps offline.
"},{"location":"list/#operating-systems","title":"Operating Systems","text":"

Operating Systems - Server Platform.

  • Ubuntu - Enterprise Open Source and Linux.
  • Rocky Linux - Open-source enterprise operating system designed to be 100% bug-for-bug compatible with Red Hat Enterprise Linux.
  • CoreOS - The pioneering lightweight container host.
  • OSv - Versatile modular unikernel designed to run unmodified Linux applications securely on micro-VMs in the cloud.
  • Atomic - Use immutable infrastructure to deploy and scale your containerized applications.
  • Photon - Linux container host optimized for cloud-native applications, cloud platforms, and VMware infrastructure.
"},{"location":"list/#distributed-filesystems","title":"Distributed Filesystems","text":"

Network distributed filesystems.

  • Ceph - Highly scalable object, block and file-based storage under one whole system.
  • Gluster - Free and open source software scalable network filesystem.
  • LINBIT - Create, remove, and replicate block storage devices for datacenter scale environments.
  • XtreemFS - Fault-tolerant distributed file system for all storage needs.
  • min.io - High performance, distributed object storage system.
"},{"location":"list/#applications-platforms","title":"Applications Platforms","text":"

Applications management platforms, Containers platform and Containers management.

  • Openshift - The Kubernetes platform for big ideas.
  • Dokku - Helps you build and manage the lifecycle of applications.
  • Flynn - Open source platform (PaaS) for running applications in production.
  • Cloud 66 - DevOps as a service that helps to build, deploy and manage any application on any cloud or server.
  • Docker - Create, deploy, and run applications by using containers.
  • Docker Compose - Define and run multi-container applications with Docker.
  • Docker Swarm - Docker-native clustering system.
  • Kubernetes - Automating deployment, scaling, and management of containerized applications.
  • LXC - Lets Linux users easily create and manage system or application containers.
  • Rancher - Lets you deliver Kubernetes-as-a-Service.
  • OpenVz - Container-based virtualization for Linux.
  • Singularity - Run the application from the local environment to the cloud.
  • AppScale - Easy-to-manage serverless platform for building and running scalable web and mobile applications.
  • Kata Containers - Building lightweight virtual machines that seamlessly plug into the containers ecosystem.
  • K3S - The certified Kubernetes distribution built for IoT and Edge computing.
  • Podman - A tool for managing OCI containers and pods.
  • Linx - General-purpose low-code platform for building and hosting backend solutions.
"},{"location":"list/#internal-developer-platforms","title":"Internal Developer Platforms","text":"

Internal Developer Platforms (or IDP) is a set of tools, services and processes that supports and accelerates your software development, while taking care of managing the underlying infrastructure.

  • Port - A platform for building no-code, holistic, Internal Developer Portals.
  • Backstage - An open platform for building developer portals.
  • Kratix - A framework used by platform teams to build the custom platforms tailored to their organisation.
"},{"location":"list/#container-image-registry","title":"Container Image Registry","text":"

Container Image registry.

  • Quay - Container image registry that enables you to build, organize, distribute, and deploy containers.
  • Dockyard - Container & Artifact Repository.
  • Harbor - An open source trusted cloud native registry project that stores, signs, and scans content.
  • GitHub Container Registry - Container registry free for public images.
"},{"location":"list/#automation-orchestration","title":"Automation & Orchestration","text":"

Tools for automation, orchestration, deployment, provisioning and configuration management.

  • Ansible - Simple IT automation platform that makes your applications and systems easier to deploy.
  • Salt - Automate the management and configuration of any infrastructure or application at scale.
  • Puppet - Unparalleled infrastructure automation and delivery.
  • Chef - Automate infrastructure and applications.
  • Juju - Simplifies how you configure, scale and operate today's complex software.
  • Rundeck - Runbook Automation For Modernizing Your Operations.
  • StackStorm - Connects all your apps, services, and workflows. Automate DevOps your way.
  • Bosh - Release engineering, deployment, and lifecycle management of complex distributed systems.
  • Cloudify - Connect, Control, & Automate from core to edge: unlimited locations, clouds and devices.
  • Tsuru - An extensible and open source Platform as a Service software.
  • Fabric - High level Python library designed to execute shell commands remotely over SSH.
  • Capistrano - A remote server automation and deployment tool.
  • Mina - Really fast deployer and server automation tool.
  • Terraform - use Infrastructure as Code to provision and manage any cloud, infrastructure, or service.
  • Pulumi - Modern infrastructure as code platform that allows you to use familiar programming languages and tools to build, deploy, and manage cloud infrastructure.
  • Packer - Build Automated Machine Images.
  • Vagrant - Development Environments Made Easy.
  • Foreman - Complete lifecycle management tool for physical and virtual servers.
  • Nomad - Deploy and Manage Any Containerized, Legacy, or Batch Application.
  • Marathon - A production-grade container orchestration platform for DC/OS and Apache Mesos.
  • OctoDNS - Managing DNS across multiple providers. DNS as code.
  • ManageIQ - Manage containers, virtual machines, networks, and storage from a single platform.
  • Ignite - Open Source Virtual Machine (VM) manager with a container UX and built-in GitOps management.
  • Selefra - An open-source policy-as-code software that provides analytics for multi-cloud and SaaS.
  • Spacelift - Flexible orchestration solution for IaC development.
  • Atlantis - Terraform Pull Request Automation
  • KubeVela - Modern application delivery platform that makes deploying and operating applications across today's hybrid, multi-cloud environments easier, faster and more reliable.
  • Stacktape - Developer-friendly Infrastructure as a Code framework built on top of AWS.
  • Score - Open Source developer-centric and platform-agnostic workload specification.
  • Digger - Open Source Infrastructure as Code management tool that runs within your CI/CD system.
"},{"location":"list/#continuous-integration-delivery","title":"Continuous Integration & Delivery","text":"

Continuous Integration, Continuous Delivery and Continuous Delivery. GitOps.

  • On premises
  • Buildbot - automate all aspects of the software development cycle.
  • Gitlab CI - pipelines build, test, deploy, and monitor your code as part of a single, integrated workflow.
  • Jenkins - automation server for building, deploying and automating any project.
  • Drone - a Container-Native, Continuous Delivery Platform.
  • Concourse - pipeline-based continuous thing-doer.
  • Spinnaker - fast, safe, repeatable deployments for every Enterprise.
  • goCD - Delivery and Release Automation server.
  • Teamcity - enterprise-level CI and CD.
  • Bamboo - tie automated builds, tests, and releases together in a single workflow.
  • Integrity - Continuous Integration server.
  • Zuul - drives continuous integration, delivery, and deployment systems with a focus on project gating.
  • Argo - Open Source Kubernetes native workflows, events, CI and CD.
  • Strider - Continuous Deployment/Continuous Integration platform.
  • Evergreen - A Distributed Continuous Integration System from MongoDB.
  • werf - Open Source CI/CD tool for building Docker images & deploying them to Kubernetes using a GitOps approach.
  • Flux - automatically ensures that the state of your Kubernetes cluster matches the configuration you\u2019ve supplied in Git.
  • Flagger - progressive delivery Kubernetes operator (Canary, A/B Testing and Blue/Green deployments).
  • Tekton - powerful and flexible open-source framework for creating CI/CD systems.
  • PipeCD - Continuous Delivery for Declarative Kubernetes, Serverless and Infrastructure Applications.
  • Gitploy - Build the deployment system around GitHub in minutes.
  • Dagger - CI/CD as Code that Runs Anywhere.
  • Public Services
  • Travis CI - easily sync your projects, you\u2019ll be testing your code in minutes.
  • Circle CI - powerful CI/CD pipelines that keep code moving.
  • Bitrise - CI/CD for mobile applications.
  • Buildkite - run fast, secure, and scalable continuous integration pipelines on your own infrastructure.
  • Cirrus CI - continuous integration system built for the era of cloud computing.
  • Codefresh - GitOps automation platform for Kubernetes apps.
  • Github actions - GitHub Actions makes it easy to automate all your software workflows, now with world-class CI/CD.
  • Kraken CI - Modern CI/CD, open-source, on-premise system that is highly scalable and focused on testing.
  • Earthly - Develop CI/CD pipelines locally and run them anywhere.
"},{"location":"list/#source-code-management","title":"Source Code Management","text":"

Source Code management, Git-repository manager, Version Control. Some of them are included in Code review section.

  • GitHub - Helps developers store and manage their code, as well as track and control changes to their code.
  • Gitlab - Entire DevOps lifecycle in one application.
  • Bitbucket - Gives teams one place to plan projects, collaborate on code, test, and deploy
  • Phabricator - A collection of web applications which help software companies build better software.
  • Gogs - A painless self-hosted Git service.
  • Gitea - A painless self-hosted Git service.
  • Gitblit - Pure Java Git solution for managing, viewing, and serving Git repositories.
  • RhodeCode - Centralized control for distributed repositories. Mercurial, Git, and Subversion under a single roof.
  • Radicle - Radicle is a sovereign peer-to-peer network for code collaboration, built on top of Git.
"},{"location":"list/#web-servers","title":"Web Servers","text":"

Web servers and reverse proxy.

  • Nginx - High performance load balancer, web server and reverse proxy.
  • Apache - Web server and reverse proxy.
  • Caddy - Web server with automatic HTTPS.
  • Cherokee - Highly concurrent secured web applications.
  • Lighttpd - Optimized for speed-critical environments while remaining standards-compliant, secure and flexible.
  • Uwsgi - Application server container.
"},{"location":"list/#ssl","title":"SSL","text":"

Tools for automating the management of SSL certificates.

  • Certbot - Automate using Let\u2019s Encrypt certificates on manually-managed websites to enable HTTPS.
  • Let\u2019s Encrypt - Free, automated, and open Certificate Authority.
  • Cert Manager - K8S add-on to automate the management and issuance of TLS certificates from various issuing sources.
"},{"location":"list/#databases","title":"Databases","text":"

Relational (SQL) and non-relational (NoSQL) databases.

  • Relational (SQL)
  • PostgreSQL - Powerful, open source object-relational database system.
  • MySQL - Open-source relational database management system.
  • MariaDB - Fast, scalable and robust, with a rich ecosystem of storage engines, plugins and many other tools.
  • SQLite - Small, fast, self-contained, high-reliability, full-featured, SQL database engine.
  • Non-relational (NoSQL)
  • Cassandra - Manage massive amounts of data, fast, without losing sleep.
  • ScyllaDB - NoSQL data store using the seastar framework, compatible with Apache Cassandra
  • Apache HBase - Distributed, versioned, non-relational database.
  • Couchdb - Database that completely embraces the web.
  • Elasticsearch - Distributed, RESTful search and analytics engine capable of addressing a growing number of use cases.
  • MongoDB - General purpose, document-based, distributed database built for modern applications.
  • Rethinkdb - Open-source database for the realtime web.
  • Key-Value
    • Couchbase - Distributed multi-model NoSQL document-oriented database that is optimized for interactive applications.
    • Leveldb - Fast key-value storage library.
    • Redis - In-memory data structure store, used as a database, cache and message broker.
    • RocksDB - A library that provides an embeddable, persistent key-value store for fast storage.
    • Etcd - Distributed reliable key-value store for the most critical data of a distributed system.
"},{"location":"list/#observability-monitoring","title":"Observability & Monitoring","text":"

Observability, Monitoring, Metrics/Metrics collection and Alerting tools.

  • Steampipe - The universal SQL interface for any cloud API, & cloud intelligence dashboards extensible w/ HCL+SQL.
  • Sensu - Simple. Scalable. Multi-cloud monitoring.
  • Alerta - Scalable, minimal configuration and visualization monitoring system.
  • Cabot - Self-hosted, easily-deployable monitoring and alerts service.
  • Amon - Modern server monitoring platform.
  • Icinga - Monitors availability and performance, gives you simple access to relevant data and raises alerts.
  • Monit - Managing and monitoring Unix systems.
  • Naemon - Fast, stable and innovative while giving you a clear view of the state of your network and applications.
  • Nagios - Computer-software application that monitors systems, networks and infrastructure.
  • Sentry - Error monitoring that helps all software teams discover, triage, and prioritize errors in real-time.
  • Shinken - Monitoring framework.
  • Zabbix - Mature and effortless monitoring solution for network monitoring and application monitoring.
  • Glances - Monitoring information through a curses or Web based interface.
  • Healthchecks - Cron monitoring tool.
  • Bolo - Building distributed, scalable monitoring systems.
  • cAdvisor - Analyzes resource usage and performance characteristics of running containers.
  • ElastiFlow - Network flow monitoring (Netflow, sFlow and IPFIX) with the Elastic Stack.
  • Co-Pilot - System performance analysis toolkit.
  • Keep - Open source alerting CLI for developers.
  • Globalping CLI - Run network commands like ping, traceroute and mtr from hundreds of global locations.
  • Grai - Open source observability integrating data impact analysis into CI.
  • Canary Checker - Open source health check platform.
  • Metrics/Metrics collection
  • Thundra Foresight - Visibility into CI pipeline by spotting test failures in no time.
  • Prometheus - Power your metrics and alerting with a leading open-source monitoring solution.
  • Collectd - The system statistics collection daemon.
  • Facette - Time series data visualization software.
  • Grafana - Analytics & monitoring solution for every database.
  • Graphite - Store numeric time-series data and render graphs of this data on demand.
  • Influxdata - Time series database.
  • Netdata - Instantly diagnose slowdowns and anomalies in your infrastructure.
  • Freeboard - Real-time dashboard builder for IOT and other web mashups.
  • Autometrics - An open source micro framework for observability.
  • Logs Management
  • Anthracite - An event/change logging/management app.
  • Graylog - Free and open source log management.
  • Logstash - Collect, parse, transform logs.
  • Fluentd - Data collector for unified logging layer.
  • Flume - Distributed, reliable, and available service for efficiently collecting, aggregating, and moving logs.
  • Heka - Stream processing software system.
  • Kibana - Explore, visualize, discover data.
  • Loki - Horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus.
  • Status
  • Cachet - Beautiful and powerful open source status page system.
  • StatusPal - Communicate incidents and maintenance effectively with a beautiful hosted status page.
  • Instatus - Quick and beautiful status page.
"},{"location":"list/#service-discovery-service-mesh","title":"Service Discovery & Service Mesh","text":"

Service Discovery, Service Mesh and Failure detection tools.

  • Consul - Connect and secure any service.
  • Serf - Decentralized cluster membership, failure detection, and orchestration.
  • Doozerd - A consistent distributed data store.
  • Zookeeper - Centralized service for configuration, naming, providing distributed synchronization, and more.
  • Etcd - Distributed, reliable key-value store for the most critical data of a distributed system.
  • Istio - Connect, secure, control, and observe services.
  • Kong - Deliver performance needed for microservices, service mesh, and cloud native deployments.
  • Linkerd - Service mesh for Kubernetes and beyond.
"},{"location":"list/#chaos-engineering","title":"Chaos Engineering","text":"

The discipline of experimenting on a distributed system in order to build confidence in the system's capability to withstand turbulent conditions in production.

  • Chaos Toolkit - The Open Source Platform for Chaos Engineering.
  • Chaos Monkey - A resiliency tool that helps applications tolerate random instance failures.
  • Toxiproxy - Simulate network and system conditions for chaos and resiliency testing.
  • Pumba - Chaos testing, network emulation and stress testing tool for containers.
  • Chaos Mesh - A Chaos Engineering Platform for Kubernetes.
  • Litmus - Litmus enables teams to identify weaknesses in infrastructures.
"},{"location":"list/#api-gateway","title":"API Gateway","text":"

API Gateway, Service Proxy and Service Management tools.

  • API Umbrella - Proxy that sits in front of your APIs, API management platform.
  • Ambassador - Kubernetes-Native API Gateway built on the Envoy Proxy.
  • Kong - Connect all your microservices and APIs with the industry\u2019s most performant, scalable and flexible API platform.
  • Tyk - API and service management platform.
  • Cilium - API aware networking and security using BPF and XDP.
  • Gloo - Feature-rich, Kubernetes-native ingress controller, and next-generation API gateway.
  • Envoy - Cloud-native high-performance edge/middle/service proxy.
  • Traefik - Reverse proxy and load balancer for HTTP and TCP-based applications.
"},{"location":"list/#code-review","title":"Code review","text":"

Code review. A few of the Source Code Management tools have built-in code review features.

  • Gerrit - Web-based team code collaboration tool.
  • Review Board - Web-based collaborative code review tool.
"},{"location":"list/#distributed-messaging","title":"Distributed messaging","text":"

Distributed messaging platforms and Queues software.

  • Rabbitmq - Message broker.
  • Kafka - Building real-time data pipelines and streaming apps.
  • Activemq - Multi-Protocol messaging.
  • Beanstalkd - Simple, fast work queue.
  • NSQ - Realtime distributed messaging platform.
  • Celery - Asynchronous task queue/job queue based on distributed message passing.
  • Faktory - Repository for background jobs within your application.
  • Nats - Simple, secure and high performance open source messaging system.
  • RestMQ - Message queue which uses HTTP as transport.
  • Dkron - Distributed, fault tolerant job scheduling system.
  • KubeMQ - Kubernetes-native messaging platform.
"},{"location":"list/#programming-languages","title":"Programming Languages","text":"

Programming languages.

  • Python - Programming language that lets you work quickly and integrate systems more effectively.
  • Ruby - A dynamic, open source programming language with a focus on simplicity and productivity.
  • Go - An open source programming language that makes it easy to build simple, reliable, and efficient software.
"},{"location":"list/#chat-and-chatops","title":"Chat and ChatOps","text":"

Chat and ChatOps.

  • Rocket - Open source team communication.
  • Mattermost - Messaging platform that enables secure team collaboration.
  • Zulip - Real-time chat with an email threading model.
  • Riot - A universal secure chat app entirely under your control.
  • ChatOps:
  • CloudBot - Simple, fast, expandable, open-source Python IRC Bot.
  • Hubot - A customizable life embetterment robot.
"},{"location":"list/#secret-management","title":"Secret Management","text":"

Security as code, sensitive credentials and secrets need to be managed, security, maintained and rotated using automation.

  • Sops - Simple and flexible tool for managing secrets.
  • Vault - Manage secrets and protect sensitive data.
  • Keybase - End-to-end encrypted chat and cloud storage system.
  • Vault Secrets Operator - Create Kubernetes secrets from Vault for a secure GitOps based workflow.
  • Git Secret - A bash-tool to store your private data inside a git repository.
  • Infisical - Open source end-to-end encrypted secrets sync for teams and infrastructure.
  • Lade - Automatically load secrets from your preferred vault as environment variables.
"},{"location":"list/#security","title":"Security","text":"

Validating, lint and best practice in term of Security on code or infrastructure.

  • checkov - Prevent cloud misconfigurations and find vulnerabilities during build-time in infrastructure as code, container images and open source packages.
"},{"location":"list/#sharing","title":"Sharing","text":"

A collection of tools to help with sharing knowledge and telling the story.

  • Gitbook - Modern documentation format and toolchain using Git and Markdown.
  • Docusaurus - Easy to maintain open source documentation websites.
  • Docsify - A magical documentation site generator.
  • MkDocs - Project documentation with Markdown.
"},{"location":"list/#vpn","title":"VPN","text":"

VPN, routing and firewall.

  • OpenVPN - Flexible VPN solutions to secure your data communications, whether it's for Internet privacy.
  • Pritunl - Enterprise Distributed OpenVPN and IPsec Server.
  • VyOS - Open source network OS that runs on a wide range of hardware, virtual machines, and cloud providers.
  • Algo - Set up a personal VPN in the cloud.
  • Streisand - Sets up a new VPN service nearly automatically.
  • Freelan - A peer-to-peer, secure, easy-to-setup, multi-platform, open-source, highly-configurable VPN software.
  • Sshuttle - Transparent proxy server that works as a poor man's VPN.
  • SoftEther - An Open-Source Free Cross-platform Multi-protocol VPN Program. as an academic project from University of Tsukuba, under the Apache License 2.0.
  • Firezone - Self-hosted VPN server using WireGuard. Supports MFA, SSO, and has easy deployment options.
"},{"location":"list/#resources","title":"Resources","text":""},{"location":"list/#books","title":"Books","text":"

Books focused on DevOps, DevSecOps and Site Reliability Engineering.

  • Effective DevOps: Building a Culture of Collaboration, Affinity, and Tooling at Scale
  • Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation
  • Hands-On Security in DevOps
  • Site Reliability Engineering
  • The Site Reliability Workbook
  • Building Secure & Reliable Systems
  • Infrastructure as Code: Managing Servers in the Cloud
  • The DevOps Handbook
"},{"location":"list/#conferences","title":"Conferences","text":"
  • DevOpsCon
  • AWS re:Invent
  • DevSecOps
  • ADDO
  • DevOpsConnect
  • @Scale
  • devopsdays
  • DevOps Enterprise Summit
"},{"location":"list/#devops-roadmap","title":"DevOps Roadmap","text":"

Basic understanding and what you should know to become a DevOps Engineer, check the roadmap here.

"},{"location":"list/#contributing","title":"Contributing","text":"

Your contributions are always welcome! Please take a look at the Contribution Guidelines.

"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..7f7d276 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,18 @@ + + + + http://awesome-devops.xyz/ + 2024-01-24 + daily + + + http://awesome-devops.xyz/contribution/ + 2024-01-24 + daily + + + http://awesome-devops.xyz/list/ + 2024-01-24 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..3b6676e6385503461feeebc57a6b395b9085d456 GIT binary patch literal 226 zcmV<803H7yiwFp1Ke1&3|8r?{Wo=<_E_iKh0L_v?4uUWcMfaY9bPt2Xg_=@#o8(l(TNft&O*_9oKQEK=-L*BzfS$CoC0k}WOVBD;XxlnzR%;5LhC9~