diff --git a/applications-tree.json b/applications-tree.json index 4f48ba7..0642a8a 100644 --- a/applications-tree.json +++ b/applications-tree.json @@ -5,6 +5,13 @@ "version": "latest", "subtitle": "Document management", "icon": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiByeD0iMTAiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik00MS45Nzk0IDEzLjUyNjJDNDAuODgzNiAxNS44NDY4IDQxLjAxMjUgMTkuOTcyMyA0Mi4xNzI4IDIwLjkzOTJDNDMuMDEwOCAyMS42NDgzIDQzLjEzOTcgMjEuNDU0OSA0My4yMDQyIDE5LjU4NTVMNDMuMzMzMSAxNy4zOTM5TDQzLjcxOTkgMTkuNjVDNDQuMTA2NiAyMS44NDE3IDQ0LjE3MTEgMjEuODQxNyA0NC45NDQ2IDIwLjQ4OEM0NS45NzYgMTguNjE4NiA0NS45MTE1IDE2Ljg3ODIgNDQuODE1NyAxNC4xNzA4QzQzLjY1NTQgMTEuNDYzNSA0Mi45NDYzIDExLjMzNDUgNDEuOTc5NCAxMy41MjYyWiIgZmlsbD0iI0ZGMDAwMCIvPgo8cGF0aCBkPSJNMzAuODkyMiAxNy45MDk3QzMwLjg5MjIgMTkuMjYzNCAzMy44NTczIDIxLjcxMjkgMzUuMTQ2NiAyMS40NTVDMzYuODIyNSAyMS4xMzI3IDM2Ljk1MTUgMTkuOTA4IDM1LjQ2ODkgMTguNDI1NEMzMy45ODYzIDE2Ljk0MjggMzAuODkyMiAxNi42MjA1IDMwLjg5MjIgMTcuOTA5N1oiIGZpbGw9IiNGRjAwMDAiLz4KPHBhdGggZD0iTTUxLjI2MTggMTguNDI1NEM0OS4wMDU2IDIwLjIzMDMgNDcuNjUyIDIyLjkzNzcgNDcuNjUyIDI1Ljc3MzlDNDcuNjUyIDI4LjQxNjggNDguMzYxIDI4LjY3NDcgNDkuNTg1OCAyNi40MTg2QzUwLjY4MTYgMjQuMzU1OCA1MS4xMzI4IDI0Ljc0MjYgNTAuMjk0OSAyNi45OTg3QzQ5LjQ1NjkgMjkuMTI1OSA1MC4yMzA0IDI5LjEyNTkgNTIuNTUxIDI3LjEyNzZDNTQuMDk4IDI1LjgzODQgNTQuMzU1OSAyNS4wNjQ5IDU0LjYxMzcgMjEuMzI2MUM1NC45MzYgMTYuNTU2IDU0LjM1NTkgMTYuMDQwNCA1MS4yNjE4IDE4LjQyNTRaIiBmaWxsPSIjRkYwMDAwIi8+CjxwYXRoIGQ9Ik02Mi44MDAzIDIwLjI5NDdDNjIuMTU1NyAyMS4zMjYxIDYzLjA1ODEgMjQuNjEzNiA2NC4yMTg0IDI1LjU4MDVDNjUuMTIwOCAyNi4yODk2IDY1LjMxNDIgMjYuMjg5NiA2NS41NzIxIDI1LjUxNkM2NS44Mjk5IDI0LjgwNyA2NS45NTg4IDI0LjgwNyA2Ni40MTAxIDI1LjUxNkM2Ni43OTY4IDI2LjE2MDYgNjYuOTkwMiAyNS45NjczIDY2Ljk5MDIgMjQuODA3QzY2Ljk5MDIgMjMuMDAyMSA2Ni42Njc5IDIyLjQyMTkgNjQuNjA1MiAyMC43NDU5QzYzLjcwMjcgMTkuOTcyNCA2My4xMjI2IDE5Ljc3OSA2Mi44MDAzIDIwLjI5NDdaIiBmaWxsPSIjRkYwMDAwIi8+CjxwYXRoIGQ9Ik00MC44ODM2IDI1LjUxNTlDNDYuODE0IDMzLjQ0NDYgNTAuMTY2IDQyLjY2MjUgNTEuMjYxOCA1My42MjA4QzUxLjcxMyA1OC4zMjY1IDUxLjcxMyA1OC4zMjY1IDUwLjEwMTUgNTguMzI2NUM0Ny4zMjk3IDU4LjMyNjUgMzkuNTk0NCA1NC4wMDc2IDM2LjY5MzYgNTAuODQ5QzM1LjIxMSA0OS4yMzc1IDMzLjM0MTcgNDYuNDAxMiAzMi41NjgyIDQ0LjU5NjNDMjkuNDA5NiAzNy4zNzY3IDI5LjY2NzQgMzcuNzYzNSAyOS45ODk3IDQwLjI3NzRDMzEuNzMwMiA1MS40MjkyIDM2LjYyOTIgNTguMTk3NSA0Ni4xMDQ5IDYyLjY0NTNDNTAuNzQ2MSA2NC43NzI2IDUwLjgxMDYgNjQuODM3IDUwLjQ4ODMgNjYuODk5OEM0OS4zOTI0IDczLjE1MjUgNDYuMjk4MyA4MC45NTIyIDQzLjA3NTMgODUuNTI4OUM0MS40NjM3IDg3Ljc4NTEgNDEuNTI4MiA4OC42MjMgNDMuMzk3NiA4OC42MjNDNDQuNDI4OSA4OC42MjMgNDUuMzk1OSA4Ny45MTQgNDYuMjk4MyA4Ni41NjAzTDQ3LjY1MiA4NC40MzMxTDQ3LjI2NTIgODYuNDk1OEw0Ni44Nzg1IDg4LjYyM0g1MS4wNjg0SDU1LjI1ODRMNTYuMjg5NyA4NS41Mjg5QzU5LjM4MzggNzYuMzExIDYwLjA5MjkgNjMuOTk5IDU4LjA5NDYgNTQuMzI5OUw1Ni45MzQzIDQ4LjcyMThMNTguNDgxNCA0Ny44ODM4QzU5LjMxOTQgNDcuNDMyNiA2MS40NDY2IDQ1LjU2MzIgNjMuMTIyNiA0My42OTM5QzY3LjE4MzYgMzkuMjQ2MSA2OC45MjQgMzQuNjA0OSA2OC44NTk2IDI4LjQ4MTFDNjguNzk1MSAyMi45Mzc1IDY3Ljk1NzEgMTkuOTA3OCA2Ny44OTI3IDI1LjAwMDJDNjcuODI4MiAyOS43MDU5IDY1Ljg5NDQgMzQuNjY5NCA2Mi45MjkyIDM4LjA4NThDNTkuMzE5NCA0Mi4yMTEzIDU0Ljc0MjcgNDQuNzI1MiA1NC43NDI3IDQyLjY2MjVDNTQuNjc4MiAzOS42OTczIDQ0LjU1NzkgMjYuMTYwNSAzOS43ODc4IDIyLjgwODZDMzguMDQ3MyAyMS41MTk0IDM4LjE3NjIgMjEuODQxNyA0MC44ODM2IDI1LjUxNTlaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNNzMuNDM2MyAyMy4zMjRDNzAuMjEzMiAyNS41MTU3IDY5LjI0NjMgMjguMTU4NiA3MS4yNDQ2IDI4LjkzMjFDNzMuNjI5NyAyOS44MzQ2IDc1LjQzNDYgMjguMTU4NiA3Ni4zMzcgMjQuMjkxQzc2Ljg1MjcgMjEuOTA1OSA3NS45NTAyIDIxLjU4MzYgNzMuNDM2MyAyMy4zMjRaIiBmaWxsPSIjRkYwMDAwIi8+CjxwYXRoIGQ9Ik0zMy4zNDE3IDI1LjU4MDNDMzEuMDIxMSAyNi40MTgzIDMxLjA4NTUgMjcuMTI3NCAzMy42NjQgMjguNjc0NEMzNi4wNDkgMzAuMTU3IDM3LjQ2NzEgMzAuMjg1OSAzOS40NjU0IDI5LjE5MDFDNDAuODE5MSAyOC40ODEgNDAuODE5MSAyOC40ODEgMzkuNTk0NCAyNy45NjUzQzM4LjQ5ODUgMjcuNTc4NiAzOC40OTg1IDI3LjQ0OTcgMzkuNDY1NCAyNy40NDk3QzQxLjA3NyAyNy4zODUyIDQwLjgxOTEgMjYuNDE4MyAzOC45NDk3IDI1LjU4MDNDMzcuMDE1OSAyNC42Nzc4IDM1LjcyNjcgMjQuNjc3OCAzMy4zNDE3IDI1LjU4MDNaIiBmaWxsPSIjRkYwMDAwIi8+CjxwYXRoIGQ9Ik01NS41MTYyIDI3LjE5MjFDNTMuNTE3OSAyOC4xNTkgNTEuNTE5NiAzMC44NjYzIDUxLjUxOTYgMzIuNTQyM0M1MS41MTk2IDMyLjkyOTEgNTIuNDg2NSAzMi42MDY4IDUzLjY0NjggMzEuODMzM0w1NS43MDk2IDMwLjM1MDdMNTQuMTYyNSAzMi4wOTExTDUyLjYxNTUgMzMuODMxNUg1NC41NDkzQzU2LjAzMTkgMzMuODMxNSA1Ny4wNjMzIDMzLjI1MTQgNTguNTQ1OCAzMS41NzU0QzU5LjY0MTcgMzAuMjg2MiA2MC41NDQxIDI4Ljk5NyA2MC41NDQxIDI4LjY3NDdDNjAuNTQ0MSAyOC40MTY4IDYwLjczNzUgMjcuNzA3OCA2MC45MzA5IDI3LjEyNzZDNjEuNDQ2NiAyNS43MDk1IDU4LjM1MjUgMjUuNzczOSA1NS41MTYyIDI3LjE5MjFaIiBmaWxsPSIjRkYwMDAwIi8+CjxwYXRoIGQ9Ik03My4xMTQgMzMuMzE1N0M3MS40MzggMzQuNjA0OSA3MS40MzggMzQuNzMzOSA3Mi41MzM4IDM1LjE4NTFDNzMuMTc4NCAzNS40NDI5IDczLjM3MTggMzUuNzAwOCA3Mi45MjA2IDM1LjcwMDhDNzEuMjQ0NiAzNS44Mjk3IDcyLjkyMDYgMzcuMDU0NCA3NC42NjEgMzcuMDU0NEM3Ni41MzA0IDM3LjA1NDQgODAuNTkxNCAzNC43MzM5IDgwLjk3ODIgMzMuNDQ0NkM4MS4yMzYgMzIuNjA2NiA3OS4xNzMzIDMxLjg5NzYgNzYuNTk0OSAzMS44OTc2Qzc1LjYyOCAzMS44OTc2IDc0LjA4MDkgMzIuNTQyMiA3My4xMTQgMzMuMzE1N1oiIGZpbGw9IiNGRjAwMDAiLz4KPHBhdGggZD0iTTIzLjgwMTUgMzcuMjQ3OEMyMy44MDE1IDM4Ljk4ODIgMjUuNDc3NSA0MS41NjY3IDI2LjU3MzMgNDEuNTY2N0MyOS40MDk2IDQxLjUwMjIgMjkuMjE2MiAzOC4yMTQ3IDI2LjMxNTUgMzYuNzMyMUMyMy45MzA0IDM1LjQ0MjkgMjMuODAxNSAzNS41MDczIDIzLjgwMTUgMzcuMjQ3OFoiIGZpbGw9IiNGRjAwMDAiLz4KPHBhdGggZD0iTTMzLjA4MzggMzguMDIxMUMzMS45ODggNDAuNzI4NSAzMS45ODggNDAuNTk5NiAzMy4yMTI4IDQxLjgyNDNDMzQuNTY2NCA0My4xNzggMzUuMDgyMSA0My4xMTM1IDM1Ljg1NTcgNDEuMzczMUMzNi41NjQ3IDM5Ljc2MTYgMzUuNzkxMiAzNS43NjUgMzQuNjk1NCAzNS43NjVDMzQuMzczMSAzNS43NjUgMzMuNTk5NSAzNi43OTY0IDMzLjA4MzggMzguMDIxMVoiIGZpbGw9IiNGRjAwMDAiLz4KPHBhdGggZD0iTTcwLjIxMzIgNDAuMDg0QzY5LjY5NzUgNDAuMjc3NCA2OC44NTk2IDQwLjc5MzEgNjguMzQzOSA0MS4xNzk4QzY3LjYzNDggNDEuNzYgNjcuOTU3MSA0MS45NTM0IDY5Ljk1NTQgNDIuMjc1N0w3Mi40Njk0IDQyLjY2MjRMNjkuOTU1NCA0Mi43OTEzQzY3LjUwNTkgNDIuODU1OCA2Ny40NDE0IDQyLjg1NTggNjguNjAxNyA0NC4xNDVDNzAuNDA2NiA0Ni4xNDMzIDczLjUwMDcgNDYuNDAxMSA3Ni45ODE2IDQ0Ljg1NDFDODAuMzMzNiA0My4zNzE1IDgwLjI2OTEgNDIuNzkxMyA3Ni42NTkzIDQwLjkyMkM3NC4xNDUzIDM5LjYzMjggNzIuMDgyNiAzOS4zNzQ5IDcwLjIxMzIgNDAuMDg0WiIgZmlsbD0iI0ZGMDAwMCIvPgo8cGF0aCBkPSJNNDAuMDQ1NiA0Mi41OTgxQzM3LjcyNSA0NC45MTg3IDM3LjMzODIgNDUuNjkyMiAzNy4zMzgyIDQ3Ljk0ODRDMzcuMzM4MiA1MS4wNDI1IDM4LjE3NjIgNTEuMzY0OCAzOS4yNzIxIDQ4LjY1NzRDNDAuMzAzNCA0Ni4yMDc5IDQwLjg4MzYgNDYuNTMwMiAzOS45MTY3IDQ4Ljk3OTdDMzkuMDE0MiA1MS40MjkyIDM5LjU5NDQgNTEuNzUxNSA0MS41MjgyIDQ5Ljk0NjZDNDMuMzk3NiA0OC4xNDE3IDQ0LjE3MTEgNDQuODU0MiA0My4zMzMxIDQyLjAxOEw0Mi43NTI5IDM5Ljk1NTJMNDAuMDQ1NiA0Mi41OTgxWiIgZmlsbD0iI0ZGMDAwMCIvPgo8cGF0aCBkPSJNNjYuNDEwMSA1MC43MjAxQzY5LjYzMzEgNTQuNTIzMyA2OC45MjQgNTQuMjY1NSA2My45NjA1IDQ5LjY4ODdMNjEuODMzMyA0Ny43NTQ5VjQ5Ljc1MzJDNjEuODMzMyA1My43NDk4IDY2LjUzOSA1OC4xMzMxIDcyLjA4MjYgNTkuMjkzNEw3NC4yNzQzIDU5Ljc0NDZMNzMuODg3NSA1Ni43MTVDNzMuMTE0IDUxLjE3MTMgNjkuMDUzIDQ2LjcyMzUgNjQuODYzIDQ2LjcyMzVINjIuOTkzNkw2Ni40MTAxIDUwLjcyMDFaIiBmaWxsPSIjRkYwMDAwIi8+CjxwYXRoIGQ9Ik0yMC40NDk1IDQ5LjEwODVDMTkuMDk1OCA0OS42MjQyIDE4IDUwLjI2ODggMTggNTAuNTI2NkMxOCA1MS42ODY5IDIzLjYwODEgNTQuNDU4NyAyNS45Mjg3IDU0LjQ1ODdDMzAuNTA1NCA1NC40NTg3IDMyLjg5MDQgNTEuOTQ0OCAyOC41MDcxIDUxLjc1MTRDMjYuMDU3NiA1MS42ODY5IDI2LjA1NzYgNTEuNjg2OSAyOC45NTgzIDUxLjMwMDJMMzEuODU5MSA1MC45MTM0TDI5Ljk4OTcgNDkuNDMwOEMyNy43OTggNDcuNzU0OCAyMy45OTQ5IDQ3LjU2MTQgMjAuNDQ5NSA0OS4xMDg1WiIgZmlsbD0iI0ZGMDAwMCIvPgo8cGF0aCBkPSJNNDYuNTU2MSA0OS4zMDJDNDQuMzY0NSA1MC41OTEyIDQzLjEzOTcgNTIuMzk2MSA0My4xMzk3IDU0LjIwMUM0My4xMzk3IDU1LjIzMjQgNDMuMjY4NiA1NS4xNjc5IDQ0LjU1NzggNTQuMDcyMUM0NS43ODI2IDUzLjA0MDcgNDUuODQ3MSA1My4wNDA3IDQ1LjEzOCA1NC4wMDc2QzQzLjg0ODggNTUuNjE5MSA0NC43NTEyIDU2LjEzNDggNDYuNjg1MSA1NC44NDU2QzQ4LjQyNTUgNTMuNjg1MyA0OS41ODU4IDUxLjQyOTIgNDkuNTg1OCA0OS4yMzc1QzQ5LjU4NTggNDcuNjkwNCA0OS4xMzQ2IDQ3LjY5MDQgNDYuNTU2MSA0OS4zMDJaIiBmaWxsPSIjRkYwMDAwIi8+CjxwYXRoIGQ9Ik0yOC4zNzgyIDU2Ljg0MzlDMjYuNjM3NyA1Ny4xNjYyIDIwLjU3ODQgNjIuOTY3NiAyMC41Nzg0IDY0LjMyMTNDMjAuNTc4NCA2Ni40NDg1IDI4LjgyOTQgNjYuMTI2MiAzMi4zMTAzIDYzLjg3MDFDMzMuNTk5NSA2My4wMzIxIDM1LjQwNDQgNjAuMzg5MiAzNS40MDQ0IDU5LjI5MzRDMzUuNDA0NCA1OS4xNjQ0IDMzLjUzNSA1OS43NDQ2IDMxLjIxNDQgNjAuNTgyNkMyOC44OTM5IDYxLjQ4NSAyNy4wMjQ1IDYyLjA2NTIgMjcuMDI0NSA2MS44NzE4QzI3LjAyNDUgNjEuNzQyOSAyOC43NjQ5IDYwLjg0MDQgMzAuODkyMSA1OS44NzM1QzMzLjAxOTMgNTguOTA2NiAzNC43NTk4IDU3LjkzOTcgMzQuNzU5OCA1Ny42ODE4QzM0Ljc1OTggNTcuMjMwNiAzMS4yMTQ0IDU2LjI2MzcgMzAuMzEyIDU2LjQ1NzFDMzAuMTE4NiA1Ni41MjE2IDI5LjIxNjIgNTYuNzE0OSAyOC4zNzgyIDU2Ljg0MzlaIiBmaWxsPSIjRkYwMDAwIi8+CjxwYXRoIGQ9Ik0zNy4wODA0IDY0LjgzNzFDMzQuNTAyIDY2LjgzNTQgMzMuMzQxNyA2OS42NzE3IDMzLjM0MTcgNzMuNzk3MkMzMy4zNDE3IDgwLjU2NTYgMzQuMTE1MiA4MS4yNzQ2IDM3Ljk4MjggNzguMTE2QzQyLjE3MjggNzQuNzY0MSA0NC4wNDIyIDY5LjY3MTcgNDIuNTU5NiA2NS44MDRMNDEuNzg2IDYzLjkzNDdMMzkuNTk0NCA2OC4zODI1QzM3LjA4MDQgNzMuNTM5MyAzNi44MjI1IDczLjUzOTMgMzguNjI3NCA2OC4zMThDNDAuNDk2OCA2Mi45MDMzIDQwLjIzOSA2Mi4zMjMxIDM3LjA4MDQgNjQuODM3MVoiIGZpbGw9IiNGRjAwMDAiLz4KPC9zdmc+Cg==" + }, + { + "name": "outline", + "title": "Outline", + "subtitle": "Knowledge Base", + "version": "latest", + "icon": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIHZpZXdCb3g9IjAgMCA1MCA1MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiByeD0iNyIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTMwLjMzMzMgNDIuMjUyNlY0My4zMDQ0QzMwLjMzMzMgNDQuNzkzMSAyOS4xMzk0IDQ2IDI3LjY2NjcgNDZDMjcuMjA4NyA0NiAyNi43NTg1IDQ1Ljg4MDggMjYuMzU5MyA0NS42NTM4TDEwLjM1OTMgMzYuNTU1OUM5LjUxOTY4IDM2LjA3ODQgOSAzNS4xODAzIDkgMzQuMjA2NFYxNS43OTRDOSAxNC44MjAyIDkuNTE5NjggMTMuOTIyIDEwLjM1OTMgMTMuNDQ0NkwyNi4zNTkzIDQuMzQ2NjdDMjcuNjQyOSAzLjYxNjc3IDI5LjI2ODggNC4wNzY5OSAyOS45OTA4IDUuMzc0NTdDMzAuMjE1NCA1Ljc3ODA2IDMwLjMzMzMgNi4yMzMyMSAzMC4zMzMzIDYuNjk2MTZWNy43NDc4OEwzMi4yMzM3IDcuMTcxNTZDMzMuNjQ0NCA2Ljc0Mzc2IDM1LjEzMSA3LjU1Mjk2IDM1LjU1NDIgOC45Nzg5NEMzNS42Mjg4IDkuMjMwMjkgMzUuNjY2NyA5LjQ5MTIzIDM1LjY2NjcgOS43NTM1N1YxMC44NDc5TDM4LjAwMjYgMTAuNTUyOEMzOS40NjQgMTAuMzY4MSA0MC43OTY3IDExLjQxNiA0MC45Nzk0IDEyLjg5MzJDNDAuOTkzMiAxMy4wMDQyIDQxIDEzLjExNTggNDEgMTMuMjI3NlYzNi43NzI4QzQxIDM4LjI2MTcgMzkuODA2MSAzOS40Njg2IDM4LjMzMzMgMzkuNDY4NkMzOC4yMjI3IDM5LjQ2ODYgMzguMTEyMyAzOS40NjE2IDM4LjAwMjYgMzkuNDQ3N0wzNS42NjY3IDM5LjE1MjZWNDAuMjQ3QzM1LjY2NjcgNDEuNzM1NyAzNC40NzI3IDQyLjk0MjYgMzMgNDIuOTQyNkMzMi43NDA1IDQyLjk0MjYgMzIuNDgyMyA0Mi45MDQzIDMyLjIzMzcgNDIuODI4OUwzMC4zMzMzIDQyLjI1MjZaTTMwLjMzMzMgMzkuNDM4MkwzMyA0MC4yNDdWMjUuMDAwM1Y5Ljc1MzU3TDMwLjMzMzMgMTAuNTYyMlYzOS40MzgyWk0zNS42NjY3IDEzLjU2NDZWMzYuNDM2TDM4LjMzMzMgMzYuNzcyOFYxMy4yMjc2TDM1LjY2NjcgMTMuNTY0NlpNMTEuNjY2NyAxNS43OTRWMzQuMjA2NEwyNy42NjY3IDQzLjMwNDRWNi42OTYxNkwxMS42NjY3IDE1Ljc5NFpNMTQuMzMzMyAxNy41ODcxTDE3IDE2LjIzOTJWMzMuNzYxMkwxNC4zMzMzIDMyLjQxMzNWMTcuNTg3MVoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=" } ] } \ No newline at end of file diff --git a/outline/domain-outline.json b/outline/domain-outline.json new file mode 100644 index 0000000..a134fc5 --- /dev/null +++ b/outline/domain-outline.json @@ -0,0 +1,60 @@ +{ + "main": { + "SERVICE_NAME": "outline", + "DOMAIN": "#DOMAIN" + }, + "containers": [ + { + "IMAGE": "safebox/domain-check", + "UPDATE": "true", + "MEMORY": "64M", + "NAME": "domain_checker", + "ROLES": "domain_checker", + "NETWORK": "host", + "SELECTOR": "", + "SCALE": "0", + "EXTRA": "--rm --privileged", + "PRE_START": [], + "DEPEND": [], + "POST_START": [], + "CMD": "", + "ENVS": [ + { + "PROXY": "smarthostloadbalancer" + }, + { + "TARGET": "outline-app" + }, + { + "PORT": "3000" + }, + { + "DOMAIN": "#DOMAIN" + }, + { + "SMARTHOST_PROXY_PATH": "/smarthost-domains" + }, + { + "OPERATION": "CREATE" + } + ], + "VOLUMES": [ + { + "SOURCE": "/etc/user/config/smarthost-domains", + "DEST": "/smarthost-domains", + "TYPE": "rw" + }, + { + "SOURCE": "/etc/system/data/dns/hosts.local", + "DEST": "/etc/dns/hosts.local", + "TYPE": "ro" + }, + { + "SOURCE": "/var/run/docker.sock", + "DEST": "/var/run/docker.sock", + "TYPE": "rw" + } + ] + } + ] +} \ No newline at end of file diff --git a/outline/firewall-outline-dns.json b/outline/firewall-outline-dns.json new file mode 100644 index 0000000..f6042f6 --- /dev/null +++ b/outline/firewall-outline-dns.json @@ -0,0 +1,75 @@ +{ + "main": { + "SERVICE_NAME": "firewalls", + "DOMAIN": "null" + }, + "containers": [ + { + "IMAGE": "safebox/firewall", + "NAME": "firewall", + "MEMORY": "64M", + "NETWORK": "host", + "SCALE": "0", + "VOLUMES": [ + { + "SOURCE": "/run/", + "DEST": "/run/", + "TYPE": "rw" + }, + { + "SOURCE": "/etc/user/config/services", + "DEST": "/services", + "TYPE": "ro" + }, + { + "SOURCE": "/etc/system/data/dns/hosts.local", + "DEST": "/etc/dns/hosts.local", + "TYPE": "ro" + }, + { + "SOURCE": "/var/run/docker.sock", + "DEST": "/var/run/docker.sock", + "TYPE": "rw" + } + ], + "PORTS": [], + "READYNESS": [ + { + "tcp": "" + }, + { + "HTTP": "" + }, + { + "EXEC": "/ready.sh" + } + ], + "ENVS": [ + { + "CHAIN": "DOCKER-USER" + }, + { + "SOURCE": "coredns" + }, + { + "TARGET": "outline-app" + }, + { + "TYPE": "udp" + }, + { + "TARGET_PORT": "53" + }, + { + "COMMENT": "dns for outline" + } + ], + "EXTRA": "--privileged --rm", + "DEPEND": "null", + "START_ON_BOOT": "false", + "CMD": "null", + "PRE_START": "null", + "POST_START": "null" + } + ] +} \ No newline at end of file diff --git a/outline/firewall-outline-smtp.json b/outline/firewall-outline-smtp.json new file mode 100644 index 0000000..ea05cb6 --- /dev/null +++ b/outline/firewall-outline-smtp.json @@ -0,0 +1,75 @@ +{ + "main": { + "SERVICE_NAME": "firewalls", + "DOMAIN": "null" + }, + "containers": [ + { + "IMAGE": "safebox/firewall", + "NAME": "firewall", + "MEMORY": "64M", + "NETWORK": "host", + "SCALE": "0", + "VOLUMES": [ + { + "SOURCE": "/run/", + "DEST": "/run/", + "TYPE": "rw" + }, + { + "SOURCE": "/etc/user/config/services", + "DEST": "/services", + "TYPE": "ro" + }, + { + "SOURCE": "/etc/system/data/dns/hosts.local", + "DEST": "/etc/dns/hosts.local", + "TYPE": "ro" + }, + { + "SOURCE": "/var/run/docker.sock", + "DEST": "/var/run/docker.sock", + "TYPE": "rw" + } + ], + "PORTS": [], + "READYNESS": [ + { + "tcp": "" + }, + { + "HTTP": "" + }, + { + "EXEC": "/ready.sh" + } + ], + "ENVS": [ + { + "CHAIN": "DOCKER-USER" + }, + { + "SOURCE": "outline-app" + }, + { + "TARGET": "smtp" + }, + { + "TYPE": "tcp" + }, + { + "TARGET_PORT": "25" + }, + { + "COMMENT": "smtp for openproject" + } + ], + "EXTRA": "--privileged --rm", + "DEPEND": "null", + "START_ON_BOOT": "false", + "CMD": "null", + "PRE_START": "null", + "POST_START": "null" + } + ] +} \ No newline at end of file diff --git a/outline/firewall-outline.json b/outline/firewall-outline.json new file mode 100644 index 0000000..bf362f1 --- /dev/null +++ b/outline/firewall-outline.json @@ -0,0 +1,75 @@ +{ + "main": { + "SERVICE_NAME": "firewalls", + "DOMAIN": "null" + }, + "containers": [ + { + "IMAGE": "safebox/firewall", + "NAME": "firewall", + "MEMORY": "64M", + "NETWORK": "host", + "SCALE": "0", + "VOLUMES": [ + { + "SOURCE": "/run/", + "DEST": "/run/", + "TYPE": "rw" + }, + { + "SOURCE": "/etc/user/config/services", + "DEST": "/services", + "TYPE": "ro" + }, + { + "SOURCE": "/etc/system/data/dns/hosts.local", + "DEST": "/etc/dns/hosts.local", + "TYPE": "ro" + }, + { + "SOURCE": "/var/run/docker.sock", + "DEST": "/var/run/docker.sock", + "TYPE": "rw" + } + ], + "PORTS": [], + "READYNESS": [ + { + "tcp": "" + }, + { + "HTTP": "" + }, + { + "EXEC": "/ready.sh" + } + ], + "ENVS": [ + { + "CHAIN": "DOCKER-USER" + }, + { + "SOURCE": "smarthostbackend" + }, + { + "TARGET": "outline-app" + }, + { + "TYPE": "tcp" + }, + { + "TARGET_PORT": "3000" + }, + { + "COMMENT": "proxy for outline" + } + ], + "EXTRA": "--privileged --rm", + "DEPEND": "null", + "START_ON_BOOT": "false", + "CMD": "null", + "PRE_START": "null", + "POST_START": "null" + } + ] +} \ No newline at end of file diff --git a/outline/outline-secret.json b/outline/outline-secret.json new file mode 100644 index 0000000..17842d0 --- /dev/null +++ b/outline/outline-secret.json @@ -0,0 +1,37 @@ +{ + "outlinepostgres": { + "POSTGRES_DB": "#DB_NAME", + "POSTGRES_USER": "#DB_USER", + "POSTGRES_PASSWORD": "#DB_PASSWORD" + }, + "outlineapp": { + "SECRET_KEY": "#SECRET_KEY", + "UTILS_SECRET": "#UTILS_SECRET", + "DATABASE_URL": "postgres://#DB_USER:#DB_PASSWORD@outlinepostgres-db:5432/#DB_NAME", + "SLACK_CLIENT_ID": "#SLACK_CLIENT_ID", + "SLACK_CLIENT_SECRET": "#SLACK_CLIENT_SECRET", + "GOOGLE_CLIENT_ID": "#GOOGLE_CLIENT_ID", + "GOOGLE_CLIENT_SECRET": "#GOOGLE_CLIENT_SECRET", + "AZURE_CLIENT_ID": "#AZURE_CLIENT_ID", + "AZURE_CLIENT_SECRET": "#AZURE_CLIENT_SECRET", + "AZURE_RESOURCE_APP_ID": "#AZURE_RESOURCE_APP_ID", + "DISCORD_CLIENT_ID": "#DISCORD_CLIENT_ID", + "DISCORD_CLIENT_SECRET": "#DISCORD_CLIENT_SECRET", + "DISCORD_SERVER_ID": "#DISCORD_SERVER_ID", + "OIDC_CLIENT_ID": "#OIDC_CLIENT_ID", + "OIDC_CLIENT_SECRET": "#OIDC_CLIENT_SECRET", + "OIDC_AUTH_URI": "#OIDC_AUTH_URI", + "OIDC_TOKEN_URI": "#OIDC_TOKEN_URI", + "OIDC_USERINFO_URI": "#OIDC_USERINFO_URI", + "OIDC_LOGOUT_URI": "#OIDC_LOGOUT_URI", + "OIDC_USERNAME_CLAIM": "#OIDC_USERNAME_CLAIM", + "OIDC_DISPLAY_NAME": "#OIDC_DISPLAY_NAME", + "OIDC_SCOPES": "#OIDC_SCOPES", + "SMTP_HOST": "#SMTP_HOST", + "SMTP_PORT": "#SMTP_PORT", + "SMTP_SERVICE": "#SMTP_SERVICE", + "SMTP_USERNAME": "#SMTP_USERNAME", + "SMTP_PASSWORD": "#SMTP_PASSWORD", + "SMTP_FROM_EMAIL": "#SMTP_FROM_EMAIL" + } +} \ No newline at end of file diff --git a/outline/service-outline.json b/outline/service-outline.json new file mode 100644 index 0000000..1d39ed8 --- /dev/null +++ b/outline/service-outline.json @@ -0,0 +1,157 @@ +{ + "main": { + "SERVICE_NAME": "outline", + "DOMAIN": "#DOMAIN" + }, + "containers": [ + { + "IMAGE": "alpine:latest", + "UPDATE": "true", + "NAME": "outline-init", + "NETWORK": "host", + "MEMORY": "64M", + "VOLUMES": [ + { + "SOURCE": "USER_DATA", + "DEST": "/etc/user/data", + "TYPE": "rw" + } + ], + "EXTRA": "--rm", + "DEPEND": "null", + "START_ON_BOOT": "false", + "ENTRYPOINT": "sh -c", + "CMD": "mkdir -p /etc/user/data/outline/data && mkdir -p /etc/user/data/outline/db", + "PRE_START": "null", + "POST_START": "null" + }, + { + "IMAGE": "postgres:16-alpine", + "UPDATE": "true", + "NAME": "outlinepostgres-db", + "MEMORY": "256M", + "NETWORK": "outline-net", + "SELECTOR": "outlinepostgres-db", + "VOLUMES": [ + { + "SOURCE": "/etc/user/data/outline/db", + "DEST": "/var/lib/postgresql/data", + "TYPE": "rw" + } + ], + "PORTS": [ + { + "SOURCE": "null", + "DEST": "5432", + "TYPE": "tcp" + } + ], + "ENV_FILES": [ + "/etc/user/secret/outline/outline.json" + ], + "EXTRA": "--restart always", + "DEPEND": "null", + "START_ON_BOOT": "false", + "CMD": "null", + "PRE_START": "null", + "POST_START": "null" + }, + { + "IMAGE": "redis:latest", + "UPDATE": "true", + "NAME": "outlineredis-server", + "MEMORY": "128M", + "NETWORK": "outline-net", + "SELECTOR": "outlineredis", + "PORTS": [ + { + "SOURCE": "null", + "DEST": "6379", + "TYPE": "tcp" + } + ], + "EXTRA": "--restart always", + "DEPEND": "null", + "START_ON_BOOT": "false", + "CMD": "null", + "PRE_START": "null", + "POST_START": "null" + }, + { + "IMAGE": "outlinewiki/outline:latest", + "UPDATE": "true", + "NAME": "outlineapp", + "NETWORK": "outline-net", + "SELECTOR": "outline-app", + "VOLUMES": [ + { + "SOURCE": "/etc/user/data/outline/data", + "DEST": "/var/lib/outline/data", + "TYPE": "rw" + } + ], + "PORTS": [ + { + "SOURCE": "null", + "DEST": "3000", + "TYPE": "tcp" + } + ], + "ENVS": [ + { + "NODE_ENV": "production" + }, + { + "DATABASE_CONNECTION_POOL_MIN": "" + }, + { + "DATABASE_CONNECTION_POOL_MAX": "" + }, + { + "REDIS_URL": "redis://outlineredis-server:6379" + }, + { + "URL": "https://#DOMAIN" + }, + { + "PORT": 3000 + }, + { + "COLLABORATION_URL": "" + }, + { + "FILE_STORAGE": "local" + }, + { + "FILE_STORAGE_LOCAL_ROOT_DIR": "/var/lib/outline/data" + }, + { + "FILE_STORAGE_UPLOAD_MAX_SIZE": 262144000 + }, + { + "FILE_STORAGE_IMPORT_MAX_SIZE": "" + }, + { + "FILE_STORAGE_WORKSPACE_IMPORT_MAX_SIZE": "" + }, + { + "PGSSLMODE": "disable" + } + ], + "ENV_FILES": [ + "/etc/user/secret/outline/outline.json" + ], + "EXTRA": "--restart always", + "DEPEND": [], + "START_ON_BOOT": "false", + "CMD": "null", + "PRE_START": "null", + "POST_START": [ + "firewall-outline", + "domain-outline", + "firewall-outline-dns", + "firewall-outline-smtp" + ] + } + ] +} \ No newline at end of file diff --git a/outline/template.json b/outline/template.json new file mode 100644 index 0000000..23440b6 --- /dev/null +++ b/outline/template.json @@ -0,0 +1,225 @@ +{ + "name": "outline", + "title": "Outline", + "subtitle": "Knowledge Base", + "description": "Outline is an open-source, self-hosted knowledge management and wiki application designed for teams to organize documentation, internal knowledge bases, onboarding guides, and notes.", + "icon": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIHZpZXdCb3g9IjAgMCA1MCA1MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiByeD0iNyIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTMwLjMzMzMgNDIuMjUyNlY0My4zMDQ0QzMwLjMzMzMgNDQuNzkzMSAyOS4xMzk0IDQ2IDI3LjY2NjcgNDZDMjcuMjA4NyA0NiAyNi43NTg1IDQ1Ljg4MDggMjYuMzU5MyA0NS42NTM4TDEwLjM1OTMgMzYuNTU1OUM5LjUxOTY4IDM2LjA3ODQgOSAzNS4xODAzIDkgMzQuMjA2NFYxNS43OTRDOSAxNC44MjAyIDkuNTE5NjggMTMuOTIyIDEwLjM1OTMgMTMuNDQ0NkwyNi4zNTkzIDQuMzQ2NjdDMjcuNjQyOSAzLjYxNjc3IDI5LjI2ODggNC4wNzY5OSAyOS45OTA4IDUuMzc0NTdDMzAuMjE1NCA1Ljc3ODA2IDMwLjMzMzMgNi4yMzMyMSAzMC4zMzMzIDYuNjk2MTZWNy43NDc4OEwzMi4yMzM3IDcuMTcxNTZDMzMuNjQ0NCA2Ljc0Mzc2IDM1LjEzMSA3LjU1Mjk2IDM1LjU1NDIgOC45Nzg5NEMzNS42Mjg4IDkuMjMwMjkgMzUuNjY2NyA5LjQ5MTIzIDM1LjY2NjcgOS43NTM1N1YxMC44NDc5TDM4LjAwMjYgMTAuNTUyOEMzOS40NjQgMTAuMzY4MSA0MC43OTY3IDExLjQxNiA0MC45Nzk0IDEyLjg5MzJDNDAuOTkzMiAxMy4wMDQyIDQxIDEzLjExNTggNDEgMTMuMjI3NlYzNi43NzI4QzQxIDM4LjI2MTcgMzkuODA2MSAzOS40Njg2IDM4LjMzMzMgMzkuNDY4NkMzOC4yMjI3IDM5LjQ2ODYgMzguMTEyMyAzOS40NjE2IDM4LjAwMjYgMzkuNDQ3N0wzNS42NjY3IDM5LjE1MjZWNDAuMjQ3QzM1LjY2NjcgNDEuNzM1NyAzNC40NzI3IDQyLjk0MjYgMzMgNDIuOTQyNkMzMi43NDA1IDQyLjk0MjYgMzIuNDgyMyA0Mi45MDQzIDMyLjIzMzcgNDIuODI4OUwzMC4zMzMzIDQyLjI1MjZaTTMwLjMzMzMgMzkuNDM4MkwzMyA0MC4yNDdWMjUuMDAwM1Y5Ljc1MzU3TDMwLjMzMzMgMTAuNTYyMlYzOS40MzgyWk0zNS42NjY3IDEzLjU2NDZWMzYuNDM2TDM4LjMzMzMgMzYuNzcyOFYxMy4yMjc2TDM1LjY2NjcgMTMuNTY0NlpNMTEuNjY2NyAxNS43OTRWMzQuMjA2NEwyNy42NjY3IDQzLjMwNDRWNi42OTYxNkwxMS42NjY3IDE1Ljc5NFpNMTQuMzMzMyAxNy41ODcxTDE3IDE2LjIzOTJWMzMuNzYxMkwxNC4zMzMzIDMyLjQxMzNWMTcuNTg3MVoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=", + "fields": [ + { + "description": "Secret key", + "key": "SECRET_KEY", + "value": "", + "required": "true", + "generated": "openssl|hex|32" + }, + { + "description": "Util secret key", + "key": "UTILS_SECRET", + "value": "", + "required": "true", + "generated": "openssl|hex|32" + }, + { + "description": "Postgres database name", + "key": "DB_NAME", + "value": "", + "required": "true", + "generated": "time|md5|8" + }, + { + "description": "Postgres username", + "key": "DB_USER", + "value": "", + "required": "true", + "generated": "time|md5|8" + }, + { + "description": "Postgres password for user", + "key": "DB_PASSWORD", + "value": "", + "required": "true", + "generated": "random|md5|12" + }, + { + "description": "Postgres root user password", + "key": "DB_ROOT_PASSWORD", + "value": "", + "required": "true", + "generated": "random|sha256|20" + }, + { + "description": "Domain:", + "key": "DOMAIN", + "value": "", + "required": "true" + }, + { + "description": "Slack client ID", + "key": "SLACK_CLIENT_ID", + "value": "", + "info": "Create a new app in your Slack workspace at https://api.slack.com/apps?new_app=1 and add 'Sign in with Slack' under 'Add features and functionality'. Set the Redirect URL to 'https:///auth/slack.callback'.", + "advanced": "true" + }, + { + "description": "Slack client secret", + "key": "SLACK_CLIENT_SECRET", + "value": "", + "advanced": "true" + }, + { + "description": "Google client ID", + "key": "GOOGLE_CLIENT_ID", + "value": "", + "info": "Create OAuth 2.0 credentials in Google Cloud Console at https://console.cloud.google.com/apis/credentials and set the Redirect URL to 'https:///auth/google.callback'.", + "advanced": "true" + }, + { + "description": "Google client secret", + "key": "GOOGLE_CLIENT_SECRET", + "value": "", + "advanced": "true" + }, + { + "description": "Azure client ID", + "key": "AZURE_CLIENT_ID", + "value": "", + "info": "Register an application in Azure AD at https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade and set the Redirect URL to 'https:///auth/azuread.callback'.", + "advanced": "true" + }, + { + "description": "Azure client secret", + "key": "AZURE_CLIENT_SECRET", + "value": "", + "advanced": "true" + }, + { + "description": "Azure resource app ID", + "key": "AZURE_RESOURCE_APP_ID", + "value": "", + "info": "This is usually the same as the client ID, but can vary based on your Azure AD setup.", + "advanced": "true" + }, + { + "description": "Discord client ID", + "key": "DISCORD_CLIENT_ID", + "value": "", + "info": "Create an application in Discord Developer Portal at https://discord.com/developers/applications and set the Redirect URL to 'https:///auth/discord.callback'.", + "advanced": "true" + }, + { + "description": "Discord client secret", + "key": "DISCORD_CLIENT_SECRET", + "value": "", + "advanced": "true" + }, + { + "description": "Discord server ID (optional)", + "key": "DISCORD_SERVER_ID", + "value": "", + "info": "(Optional) If you want to restrict login to members of a specific Discord server, provide the server ID here.", + "advanced": "true" + }, + { + "description": "OpenID Connect client ID", + "key": "OIDC_CLIENT_ID", + "value": "", + "info": "Set up an OpenID Connect application with your provider and set the Redirect URL to 'https:///auth/oidc.callback'.", + "advanced": "true" + }, + { + "description": "OpenID Connect client secret", + "key": "OIDC_CLIENT_SECRET", + "value": "", + "advanced": "true" + }, + { + "description": "OpenID Connect provider auth URI", + "key": "OIDC_AUTH_URI", + "value": "", + "info": "The authorization endpoint URL of your OpenID Connect provider.", + "advanced": "true" + }, + { + "description": "OpenID Connect provider token URI", + "key": "OIDC_TOKEN_URI", + "value": "", + "info": "The token endpoint URL of your OpenID Connect provider.", + "advanced": "true" + }, + { + "description": "OpenID Connect provider userinfo URI", + "key": "OIDC_USERINFO_URI", + "value": "", + "info": "The userinfo endpoint URL of your OpenID Connect provider.", + "advanced": "true" + }, + { + "description": "OpenID Connect provider logout URI (optional)", + "key": "OIDC_LOGOUT_URI", + "value": "", + "info": "(Optional) The logout endpoint URL of your OpenID Connect provider, if supported.", + "advanced": "true" + }, + { + "description": "OpenID Connect username claim", + "key": "OIDC_USERNAME_CLAIM", + "value": "preferred_username", + "info": "The claim in the ID token or userinfo response to use as the username. Defaults to 'preferred_username'.", + "advanced": "true" + }, + { + "description": "OpenID Connect display name", + "key": "OIDC_DISPLAY_NAME", + "value": "OpenID Connect", + "info": "The display name for the OpenID Connect authentication option. Defaults to 'OpenID Connect'.", + "advanced": "true" + }, + { + "description": "OpenID Connect scopes", + "key": "OIDC_SCOPES", + "value": "openid profile email", + "info": "Space-separated list of scopes to request during authentication. Defaults to 'openid profile email'.", + "advanced": "true" + }, + { + "description": "SMTP host", + "key": "SMTP_HOST", + "value": "", + "info": "Used for sending invitation and password reset emails. Leave blank to disable email functionality.", + "advanced": "true" + }, + { + "description": "SMTP port", + "key": "SMTP_PORT", + "value": "587", + "info": "(Optional) The port to connect to on the SMTP server. Defaults to 587.", + "advanced": "true" + }, + { + "description": "SMTP service (e.g., gmail)", + "key": "SMTP_SERVICE", + "value": "", + "info": "Used for sending invitation and password reset emails. Leave blank to disable email functionality.", + "advanced": "true" + }, + { + "description": "SMTP username (email address)", + "key": "SMTP_USERNAME", + "value": "", + "advanced": "true" + }, + { + "description": "SMTP password", + "key": "SMTP_PASSWORD", + "value": "", + "advanced": "true" + }, + { + "description": "From email address", + "key": "SMTP_FROM_EMAIL", + "value": "", + "info": "(Optional) The email address that emails will be sent from. Defaults to the SMTP username if not set.", + "advanced": "true" + } + ] +} \ No newline at end of file