diff --git a/README.md b/README.md index 8252739..999a839 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,10 @@ ![basics](https://user-images.githubusercontent.com/4677417/186188965-73453154-fdec-4d6b-9c34-cb35c248ae5b.png) +# Deploy : + +node ./dist/server/entry.mjs + ## 🚀 Project Structure Inside of your Astro project, you'll see the following folders and files: diff --git a/astro.config.mjs b/astro.config.mjs index 5c9987f..04d8db7 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -6,7 +6,14 @@ import vue from "@astrojs/vue"; // https://astro.build/config import tailwind from "@astrojs/tailwind"; +// https://astro.build/config +import node from "@astrojs/node"; + // https://astro.build/config export default defineConfig({ - integrations: [vue(), tailwind()] + integrations: [vue(), tailwind()], + output: "server", + adapter: node({ + mode: 'standalone' + }), }); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 99dc60f..ea8d282 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "@example/basics", "version": "0.0.1", "dependencies": { + "@astrojs/node": "^3.0.0", "@astrojs/tailwind": "^2.1.2", "@astrojs/vue": "^1.2.1", "astro": "^1.6.7", @@ -101,6 +102,18 @@ "vfile-message": "^3.0.0" } }, + "node_modules/@astrojs/node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-3.0.0.tgz", + "integrity": "sha512-07l0D0iq3Bdd4fw8LPf2/DveL3X0Mn/ZuhEvWh2W+hxsrDfot9XGmdzExjmY/C2DtYOUUJKf8mg1cA5ZXOif8Q==", + "dependencies": { + "@astrojs/webapi": "^1.1.1", + "send": "^0.18.0" + }, + "peerDependencies": { + "astro": "^1.6.4" + } + }, "node_modules/@astrojs/prism": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-1.0.2.tgz", @@ -1882,6 +1895,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1890,6 +1911,15 @@ "node": ">=6" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -1942,6 +1972,11 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "node_modules/electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", @@ -1961,6 +1996,14 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/es-module-lexer": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.10.5.tgz", @@ -2314,6 +2357,11 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2361,6 +2409,14 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -2510,6 +2566,14 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -2872,6 +2936,21 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/human-signals": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", @@ -4385,6 +4464,17 @@ "node": ">= 0.4" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -4880,6 +4970,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -5309,6 +5407,58 @@ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "node_modules/serialize-error": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", @@ -5334,6 +5484,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5437,6 +5592,14 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -5665,6 +5828,14 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/totalist": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", @@ -6761,6 +6932,15 @@ "vfile-message": "^3.0.0" } }, + "@astrojs/node": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-3.0.0.tgz", + "integrity": "sha512-07l0D0iq3Bdd4fw8LPf2/DveL3X0Mn/ZuhEvWh2W+hxsrDfot9XGmdzExjmY/C2DtYOUUJKf8mg1cA5ZXOif8Q==", + "requires": { + "@astrojs/webapi": "^1.1.1", + "send": "^0.18.0" + } + }, "@astrojs/prism": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-1.0.2.tgz", @@ -8073,11 +8253,21 @@ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, "dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -8118,6 +8308,11 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", @@ -8137,6 +8332,11 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, "es-module-lexer": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.10.5.tgz", @@ -8300,6 +8500,11 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -8329,6 +8534,11 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -8431,6 +8641,11 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -8692,6 +8907,18 @@ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==" }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, "human-signals": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", @@ -9616,6 +9843,14 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, "onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", @@ -9920,6 +10155,11 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -10221,6 +10461,53 @@ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, "serialize-error": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", @@ -10236,6 +10523,11 @@ } } }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -10316,6 +10608,11 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -10484,6 +10781,11 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, "totalist": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", diff --git a/package.json b/package.json index 421831a..727f459 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "astro": "astro" }, "dependencies": { + "@astrojs/node": "^3.0.0", "@astrojs/tailwind": "^2.1.2", "@astrojs/vue": "^1.2.1", "astro": "^1.6.7", diff --git a/public/cli.pegaz.sh b/public/cli.pegaz.sh new file mode 100755 index 0000000..a7829ea --- /dev/null +++ b/public/cli.pegaz.sh @@ -0,0 +1,652 @@ +#!/bin/bash +source /opt/pegaz/env.sh + +SERVICES=$(find $PATH_PEGAZ_SERVICES -mindepth 1 -maxdepth 1 -not -name '.*' -type d -printf ' %f\n' | sort | sed '/^$/d') +SERVICES_FLAT=$(echo $SERVICES | tr '\n' ' ') +IS_PEGAZDEV="false" && [[ $0 == "cli.pegaz.sh" ]] && IS_PEGAZDEV="true" +PATH_COMPAT="$(dirname $0)" # pegazdev compatibility (used for create/drop services) + +# HELPERS + +EXECUTE() { + TEST_CONFIG + SETUP_NETWORK + if [[ -d $PATH_PEGAZ_SERVICES/$2 ]] + then + cd $PATH_PEGAZ_SERVICES/$2 + [[ -f "$PATH_PEGAZ/config.sh" ]] && source "$PATH_PEGAZ/config.sh" + [[ -f "config.sh" ]] && source "config.sh" + [[ -f ".env" ]] && source ".env" + docker-compose $1 2>&1 | grep -v "error while removing network" + else + echo "[x] $2 folder doesn't exist" + fi + # echo $1 $2 + local ACT=("stop","down","pause","unpause") + [[ "${ACT[*]}" =~ "${1}" ]] && UPDATE_DASHBOARD $2 +} + +# CHECK_DEPS() { + # sed >= 4.7 +# } + +REMOVE_LINE() { + sed -i "/.*$1.*/d" $2 &> /dev/null +} + +INSERT_LINE_AFTER() { + sed -i "0,/${1//\//\\/}/s//${1//\//\\/}\n${2//\//\\/}/" $3 +} + +SERVICE_INFOS() { + if [[ -f $PATH_PEGAZ_SERVICES/$1/config.sh ]] + then + if [[ $1 == "proxy" ]] + then + echo -e "[√] $1 is up" + else + SOURCE_SERVICE $1 + echo -e "[√] $1 is up (use pegaz logs $1 to know when the service is ready) \nhttp://$DOMAIN" + if [[ $IS_PEGAZDEV == "true" ]] + then + echo "http://127.0.0.1:$PORT" + fi + fi + fi +} + +SETUP_NETWORK() { + if ! echo $(docker network ls) | grep -q pegaz + then + echo "[*] create NETWORK" + docker network create pegaz + fi +} + +SETUP_REDIRECTIONS() { + unset REDIRECTIONS + SOURCE_SERVICE $1 + if [[ $REDIRECTIONS != "" ]] + then + PATH_FILE_REDIRECTION="$PATH_PEGAZ_SERVICES/proxy/$FILENAME_REDIRECTION" + touch "$PATH_PEGAZ_SERVICES/$1/$FILENAME_NGINX" $PATH_FILE_REDIRECTION + REMOVE_LINE $AUTO_GENERATED_STAMP "$PATH_PEGAZ_SERVICES/$1/$FILENAME_NGINX" + REMOVE_LINE $AUTO_GENERATED_STAMP $PATH_FILE_REDIRECTION + for REDIRECTION in $REDIRECTIONS + do + local FROM=${REDIRECTION%->*} + local TO=${REDIRECTION#*->} + if [[ $FROM == /* ]]; then # same domain + echo "rewrite ^$FROM$ http://$DOMAIN$TO permanent; $AUTO_GENERATED_STAMP" >> "$PATH_PEGAZ_SERVICES/$1/$FILENAME_NGINX" + elif [[ $TO != "" ]] # sub-domain + then + echo "server {" >> $PATH_FILE_REDIRECTION + echo " server_name $FROM.$MAIN_DOMAIN;" >> $PATH_FILE_REDIRECTION + echo " return 301 http://$DOMAIN$TO;" >> $PATH_FILE_REDIRECTION + echo "}" >> $PATH_FILE_REDIRECTION + fi + done + fi +} + +SETUP_NGINX() { + if [[ $DOMAIN != *localhost:* ]] + then + if [[ -f "$PATH_PEGAZ_SERVICES/$1/$FILENAME_NGINX" ]] + then + if [[ -s "$PATH_PEGAZ_SERVICES/$1/$FILENAME_NGINX" ]] + then + local NEW_LINE=" - $PATH_PEGAZ_SERVICES/$1/$FILENAME_NGINX:/etc/nginx/vhost.d/${DOMAIN}_location" + INSERT_LINE_AFTER "docker.sock:ro" "$NEW_LINE" "$PATH_PROXY_COMPOSE" + fi + fi + fi +} + +SETUP_PROXY() { + [[ -f "$PATH_PEGAZ/$FILENAME_CONFIG" ]] && source "$PATH_PEGAZ/$FILENAME_CONFIG" || echo "[x] no pegaz main config file" + PATH_PROXY_COMPOSE="$PATH_PEGAZ_SERVICES/proxy/docker-compose.yml" + + rm -rf "$PATH_PEGAZ_SERVICES/proxy/$FILENAME_REDIRECTION" # delete old redirections + sed -i "\|$PATH_PEGAZ_SERVICES|d" "$PATH_PROXY_COMPOSE" # delete old vhosts + for PATH_SERVICE in $PATH_PEGAZ_SERVICES/* + do + local NAME_SERVICE=$(basename $PATH_SERVICE) + NAME_SERVICE=$(echo $NAME_SERVICE | sed "s%/%%g") + [[ -f "$PATH_SERVICE/$FILENAME_CONFIG" ]] && source "$PATH_SERVICE/$FILENAME_CONFIG" + SETUP_REDIRECTIONS $NAME_SERVICE + SETUP_NGINX $NAME_SERVICE + done + + local NEW_LINE=" - $PATH_PEGAZ_SERVICES/proxy/$FILENAME_REDIRECTION:/etc/nginx/conf.d/$FILENAME_REDIRECTION" + INSERT_LINE_AFTER "docker.sock:ro" "$NEW_LINE" "$PATH_PROXY_COMPOSE" + + EXECUTE "up -d" "proxy" +} + +SOURCE_SERVICE() { + [[ -f "$PATH_PEGAZ_SERVICES/$1/$FILENAME_CONFIG" ]] && source "$PATH_PEGAZ_SERVICES/$1/$FILENAME_CONFIG" + [[ -f "$PATH_PEGAZ_SERVICES/$1/$FILENAME_ENV" ]] && source "$PATH_PEGAZ_SERVICES/$1/$FILENAME_ENV" +} + +PRE_INSTALL() { + SOURCE_SERVICE $1 + local PATH_SCRIPT="$PATH_PEGAZ_SERVICES/$1/$FILENAME_PREINSTALL" + if [[ -f $PATH_SCRIPT ]] + then + echo "[*] pre-install" + bash $PATH_SCRIPT $1 $IS_PEGAZDEV + fi +} + +POST_INSTALL() { + local POST_INSTALL_TEST_CMD="" + SOURCE_SERVICE $1 + local PATH_SCRIPT="$PATH_PEGAZ_SERVICES/$1/$FILENAME_POSTINSTALL" + if [[ -f $PATH_SCRIPT ]] + then + echo "[*] post-install: wait for $1 up" + if [[ -n $POST_INSTALL_TEST_CMD ]] + then + while : + do + $POST_INSTALL_TEST_CMD >> /dev/null + if [[ $? -eq 0 ]] + then + echo "[*] $POST_INSTALL_TEST_CMD is enable, launch post-install.sh" + bash $PATH_SCRIPT $1 + break + else + continue + fi + done + else + while : + do + HTTP_CODE=$(curl -ILs $DOMAIN | head -n 1 | cut -d$' ' -f2) + if [[ $HTTP_CODE < "400" ]] + then + echo "[*] $DOMAIN http status code is $HTTP_CODE, launch post-install.sh" + bash $PATH_SCRIPT $1 &&\ + break + else + continue + fi + done + fi + fi +} + +ADD_TO_HOSTS() { + if [[ $IS_PEGAZDEV == "true" ]] + then + local PATH_HOSTFILE="/etc/hosts" + SOURCE_SERVICE $1 + if [[ $DOMAIN == *$MAIN_DOMAIN* && -f $PATH_HOSTFILE ]] + then + if ! grep -q "$DOMAIN" $PATH_HOSTFILE + then + echo "127.0.0.1 $DOMAIN" | sudo tee -a $PATH_HOSTFILE >> /dev/null + fi + fi + fi +} + +SET_ALIAS() { + if [[ $1 == "-h" ]] || [[ $1 == "--help" ]] + then + HELP + elif [[ $1 == "-v" ]] || [[ $1 == "--version" ]] + then + VERSION + elif [[ $1 == "ps" ]] + then + PS + fi +} + +MANAGE_BACKUP() { + mkdir -p $PATH_PEGAZ_BACKUP + case $2 in + backup) EXECUTE "pause" $1;; + restore) EXECUTE "stop" $1;; + esac + echo "[*] $1 $2" + for VOLUME in $(EXECUTE "config --volumes" $1) + do + local VOLUME=($(docker volume inspect --format "{{.Name}} {{.Mountpoint}}" "$1_$VOLUME" 2> /dev/null)) + local NAME_VOLUME=${VOLUME[0]} + local PATH_VOLUME=${VOLUME[1]} + if [[ -n $NAME_VOLUME ]] + then + local PATH_TARBALL="$PATH_PEGAZ_BACKUP/$NAME_VOLUME.tar.gz" + case $2 in + backup) + docker run --rm -v $NAME_VOLUME:/$NAME_VOLUME -v $PATH_PEGAZ_BACKUP:/backup busybox tar czvf /backup/$NAME_VOLUME.tar.gz /$NAME_VOLUME;; + restore) + docker run --rm -v $NAME_VOLUME:/$NAME_VOLUME -v $PATH_PEGAZ_BACKUP:/backup busybox sh -c "cd /$NAME_VOLUME && tar xvf /backup/$NAME_VOLUME.tar.gz --strip 1";; + esac + fi + done + case $2 in + backup) EXECUTE "unpause" $1;; + restore) EXECUTE "start" $1;; + esac + echo "[√] $1 $2 done" +} + +STORJ() { + if ! command -v "unzip" 1>/dev/null + then + sudo apt install unzip + fi + if ! command -v "uplink" 1>/dev/null + then + echo "[*] install uplink" + curl -L https://github.com/storj/storj/releases/latest/download/uplink_linux_amd64.zip -o uplink_linux_amd64.zip + unzip -o uplink_linux_amd64.zip + sudo install uplink /usr/local/bin/uplink + rm uplink_linux_amd64.zip + uplink setup + fi + echo "what's your bucket name ?" + read BUCKET_NAME + if [[ -z $1 ]] || [[ $1 == "backup" ]] + then + uplink cp -r --progress /opt/pegaz/backup sj://$BUCKET_NAME + elif [[ $1 == "restore" ]] + then + mkdir -p $PATH_PEGAZ_BACKUP + uplink cp -r --progress sj://$BUCKET_NAME /opt/pegaz/backup + fi +} + +GET_LAST_PORT() { + local THE_LAST_PORT="0" + for PATH_SERVICE in $PATH_PEGAZ_SERVICES/* + do + [[ $PATH_SERVICE == "$PATH_PEGAZ_SERVICES/deluge" ]] && continue + if [[ -f "$PATH_SERVICE/$FILENAME_CONFIG" || -f "$PATH_SERVICE/$FILENAME_ENV" ]] + then + if [[ -f "$PATH_SERVICE/$FILENAME_CONFIG" ]] + then + SED_PREFIX="export PORT" && FILENAME=$FILENAME_CONFIG + else + SED_PREFIX="PORT" && FILENAME=$FILENAME_ENV + fi + local CURRENT_PORT=`sed -n "s/^$SED_PREFIX\(.*\)/\1/p" < "$PATH_SERVICE/$FILENAME"` + CURRENT_PORT=$(echo $CURRENT_PORT | tr ' ' '\n' | grep -v '_EXPOSED=' | grep -o -E '[0-9]+' | sort -nr | head -n1) + fi + if [[ $CURRENT_PORT ]] + then + CURRENT_PORT=`sed -e 's/^"//' -e 's/"$//' <<<"$CURRENT_PORT"` + if [ "${CURRENT_PORT}" -gt "${THE_LAST_PORT}" ] + then + THE_LAST_PORT=$CURRENT_PORT + fi + fi + done + echo $THE_LAST_PORT +} + +GET_STATE() { + local RESTARTING="$(docker ps -a --format "{{.Names}} {{.State}}" | grep "$1" | grep "restarting")" + if [[ -n $RESTARTING ]] + then + echo "restarting" + else + local STARTING="$(docker ps -a --format "{{.Names}} {{.Status}}" | grep "$1" | grep "starting")" + if [[ -n $STARTING ]] + then + echo "starting" + else + local STATE="$(docker ps -a --format "{{.Names}} {{.State}}" | grep "$1 ")" + if [[ -n $STATE ]] + then + STATE=${STATE/$1 /} + STATE=${STATE/running/up} + STATE=${STATE/exited/stopped} + if [[ $STATE == "up" ]] + then + SOURCE_SERVICE $1 + if [[ -n $DOMAIN ]] + then + STATE="http://$DOMAIN" + fi + fi + echo $STATE + fi + fi + fi +} + +UPDATE_DASHBOARD() { + [[ $1 != "dashboard" && -n $(GET_STATE "dashboard") ]] && bash "$PATH_PEGAZ_SERVICES/dashboard/$FILENAME_POSTINSTALL" "dashboard" +} + +TEST_CONFIG() { + source $PATH_PEGAZ/config.sh + [[ -z $MAIN_DOMAIN || -z $USERNAME || -z $PASSWORD ]] && echo "[!] config pegaz first" && CONFIG + [[ $MAIN_DOMAIN == "domain.com" && $IS_PEGAZDEV == "false" ]] && echo "[!] please configure pegaz first" && CONFIG +} + +# CORE COMMANDS + +CONFIG() { + source $PATH_COMPAT/config.sh + [[ -n $MAIN_DOMAIN ]] && echo "[?] Domain [$MAIN_DOMAIN]:" || echo "[?] Domain:" + read NEW_MAIN_DOMAIN + [[ -n $NEW_MAIN_DOMAIN ]] && sed -i "s|MAIN_DOMAIN=.*|MAIN_DOMAIN=\"$NEW_MAIN_DOMAIN\"|g" $PATH_COMPAT/config.sh; + + [[ -n $USERNAME ]] && echo "[?] Username [$USERNAME]:" || echo "[?] Username:" + read NEW_USERNAME + [[ -n $NEW_USERNAME ]] && sed -i "s|USERNAME=.*|USERNAME=\"$NEW_USERNAME\"|g" $PATH_COMPAT/config.sh + + echo "[?] Password:" + read -s PASSWORD + [[ -n $PASSWORD ]] && sed -i "s|PASSWORD=.*|PASSWORD=\"$PASSWORD\"|g" $PATH_COMPAT/config.sh + + [[ $EMAIL == "user@domain.com" && -n $NEW_USERNAME && -n $NEW_MAIN_DOMAIN ]] && EMAIL="$NEW_USERNAME@$NEW_MAIN_DOMAIN" + [[ -n $EMAIL ]] && echo "[?] Email [$EMAIL]:" || echo "[?] Email:" + read NEW_EMAIL + if [[ -n $NEW_EMAIL ]] + then + sed -i "s|EMAIL=.*|EMAIL=\"$NEW_EMAIL\"|g" $PATH_COMPAT/config.sh + else + sed -i "s|EMAIL=.*|EMAIL=\"$EMAIL\"|g" $PATH_COMPAT/config.sh + fi + + echo -e "[?] Media Path [$MEDIA_DIR]:" + read MEDIA_DIR + [[ -n $MEDIA_DIR ]] && { + [[ -d $MEDIA_DIR ]] && sed -i "s|MEDIA_DIR=.*|MEDIA_DIR=\"$MEDIA_DIR\"|g" $PATH_COMPAT/config.sh || echo "[x] $MEDIA_DIR doesn't exist" + } + + echo "[?] ZeroSSL API key:" + read ZEROSSL_API_KEY + [[ -n $ZEROSSL_API_KEY ]] && sed -i "s|ZEROSSL_API_KEY=.*|ZEROSSL_API_KEY=\"$ZEROSSL_API_KEY\"|g" $PATH_COMPAT/config.sh + + [[ $IS_PEGAZDEV == "true" ]] && cp $PATH_COMPAT/config.sh $PATH_PEGAZ +} + + +UPGRADE() { + echo "[i] All custom configurations in default pegaz services will be overwritten" + echo "[?] Are you sure to upgrade pegaz (Y/n)" + read ANSWER + if [[ $ANSWER == "Y" || $ANSWER == "y" ]] + then + rm -rf /tmp/pegaz + git clone $GITHUB_PEGAZ /tmp/pegaz + chmod -R 750 /tmp/pegaz + rm $PATH_PEGAZ/env.sh $PATH_PEGAZ/completion.sh $PATH_PEGAZ/cli.pegaz.sh + + mv /tmp/pegaz/env.sh $PATH_PEGAZ + mv /tmp/pegaz/completion.sh $PATH_PEGAZ + mv /tmp/pegaz/cli.pegaz.sh $PATH_PEGAZ + + rsync -av --exclude "$PATH_PEGAZ_SERVICES/dashboard/web/index.html" --exclude "*config.sh" /tmp/pegaz/services/* $PATH_PEGAZ_SERVICES + + source $PATH_PEGAZ/env.sh + echo "[√] pegaz is now upgraded (v$PEGAZ_VERSION)" + fi +} + +UNINSTALL() { + echo "[?] Are you sure to uninstall pegaz (Y/n)" + read ANSWER + if [[ $ANSWER == "Y" || $ANSWER == "y" ]] + then + sudo sed -i "\|$PATH_PEGAZ|d" $PATH_BASHRC + if [[ -n $SUDO_USER ]] + then + sudo sed -i "\|$PATH_PEGAZ|d" "/home/$SUDO_USER/.bashrc" + elif [[ -f "/home/$USER/.bashrc" ]] + then + sudo sed -i "\|$PATH_PEGAZ|d" "/home/$USER/.bashrc" + fi + sudo rm -rf $PATH_PEGAZ/services $PATH_PEGAZ/docs + sudo rm $PATH_PEGAZ/* 2> /dev/null # no -rf to delete only file & keep backup & media folder is exist + echo "[√] pegaz successfully uninstalled" + fi +} + +HELP() { + echo "Core Commands: +usage: pegaz + + help -h Print help + version -v Print version + upgrade Upgrade pegaz + uninstall Uninstall pegaz + config Assistant to edit configurations stored in $FILENAME_CONFIG (main configurations or specific configurations if service named is passed) + +Service Commands: +usage: pegaz + + up launch or update a web service with configuration set in $FILENAME_CONFIG and proxy settings set in $FILENAME_NGINX then execute $FILENAME_POSTINSTALL + create create a service based on service/example (pegaz create ) + drop down a service and remove its config folder + backup archive volume(s) mounted on the service in $PATH_PEGAZ_BACKUP + restore replace volume(s) mounted on the service by backed up archive in $PATH_PEGAZ_BACKUP + storj copy backup to a distant bucket with storj (vice-versa if 'pegaz storj restore') + reset down a service and prune containers, images and volumes not linked to up & running containers (useful for dev & test) + * down restart stop rm logs pull, any docker-compose commands are compatible + +Services: + +$SERVICES" +} + +VERSION() { + echo $PEGAZ_VERSION +} + +PS() { + docker ps +} + +PORT() { + echo "the last port used is $(GET_LAST_PORT)" +} + +# SERVICE COMMANDS + +STATE() { + local STATE_SERVICE=$(GET_STATE $1) + if [[ -n $STATE_SERVICE ]] + then + printf "%-20s %-20s\n" $1 $STATE_SERVICE + fi +} + +CREATE() { + if test $2 + then + local NAME=$1 + local IMAGE=$2 + elif test $1 + then + local NAME=$1 + local IMAGE=$(docker search $1 --limit 1 --format "{{.Name}}") + else + while [[ !" ${SERVICES_FLAT} " =~ " $NAME " || ! $NAME ]] + do + echo "[?] Name" + read NAME + done + local DELIMITER=") " + local MAX_RESULT=7 + local LINE=0 + local RESULTS=$(docker search $NAME --limit $MAX_RESULT --format "{{.Name}}" | nl -w2 -s "$DELIMITER") + while [[ $LINE -lt 1 || $LINE -gt $MAX_RESULT ]] + do + printf "$RESULTS\n" + read LINE + done + IMAGE=$(sed -n ${LINE}p <<< "$RESULTS" 2> /dev/null) + IMAGE=${IMAGE/ $LINE$DELIMITER/} + fi + + [[ " ${SERVICES_FLAT} " =~ " $NAME " ]] && echo "[x] service $NAME already exist" && exit 1 + + #ports setup + local PORT=$(GET_LAST_PORT) + PORT=$(($PORT + 5)) + docker pull $IMAGE + [[ $? != 0 ]] && echo "[x] cant pull $IMAGE" && exit 1 + local PORT_EXPOSED=$(docker inspect --format='{{.Config.ExposedPorts}}' $IMAGE | grep -o -E '[0-9]+' | head -1 | sed -e 's/^0\+//') + + if [[ $PORT_EXPOSED == "" ]] + then + PORT_EXPOSED="80" + fi + + #clean name + NAME=${NAME//[^a-zA-Z0-9_]/} + NAME=${NAME,,} + + echo $NAME + + #compose setup + mkdir -p "$PATH_COMPAT/services/$NAME" + cp "$PATH_COMPAT/docs/pegaz.svg" "$PATH_COMPAT/services/$NAME/logo.svg" + cp "$PATH_COMPAT/services/example/config.sh" "$PATH_COMPAT/services/example/docker-compose.yml" "$PATH_COMPAT/services/$NAME/" + sed -i "s/example/$NAME/" "$PATH_COMPAT/services/$NAME/docker-compose.yml" + sed -i "s|image:.*|image: $IMAGE|g" "$PATH_COMPAT/services/$NAME/docker-compose.yml" + sed -i "s|DOMAIN=.*|DOMAIN=\"$NAME.$MAIN_DOMAIN\"|g" "$PATH_COMPAT/services/$NAME/config.sh" + sed -i "s|PORT=.*|PORT=\"$PORT\"|g" "$PATH_COMPAT/services/$NAME/config.sh" + sed -i "s|PORT_EXPOSED=.*|PORT_EXPOSED=\"$PORT_EXPOSED\"|g" "$PATH_COMPAT/services/$NAME/config.sh" + sed -i "s|REDIRECTIONS=.*|REDIRECTIONS=\"\"|g" "$PATH_COMPAT/services/$NAME/config.sh" + if [[ $IS_PEGAZDEV == "true" ]] + then + cp -R "$PATH_COMPAT/services/$NAME" $PATH_PEGAZ_SERVICES + fi + SERVICES=$(find $PATH_PEGAZ_SERVICES -mindepth 1 -maxdepth 1 -not -name '.*' -type d -printf ' %f\n' | sort | sed '/^$/d') # update services list + UP $NAME + [[ $? != 0 ]] && echo "[x] create fail" && exit 1 +} + +BACKUP() { + [[ -n $(GET_STATE $1) ]] && MANAGE_BACKUP $1 "backup" || echo "$1 is not initialized" +} + +RESTORE() { + [[ -n $(GET_STATE $1) ]] && MANAGE_BACKUP $1 "restore" || echo "$1 is not initialized" +} + +DROP() { + echo "[?] Are you sure to drop $1 (Y/n)" + read ANSWER + if [[ $ANSWER == "Y" || $ANSWER == "y" ]] + then + EXECUTE "down" $1 + rm -rf "$PATH_COMPAT/services/$1" "$PATH_PEGAZ_SERVICES/$1" + fi +} + +UP() { + ADD_TO_HOSTS $1 + PRE_INSTALL $1 + EXECUTE "pull" $1 + EXECUTE "build" $1 + EXECUTE "up -d" $1 + POST_INSTALL $1 + SETUP_PROXY + UPDATE_DASHBOARD $1 + SERVICE_INFOS $1 +} + +START() { + [[ -z $(GET_STATE $1) ]] && UP $1 || EXECUTE "start" $1 +} + +UPDATE() { + EXECUTE "build --pull" $1 + EXECUTE "up -d" $1 + SETUP_PROXY + UPDATE_DASHBOARD $1 + SERVICE_INFOS $1 +} + +RESET() { + EXECUTE "stop" $1 + EXECUTE "rm -f" $1 +} + +LOGS() { + [[ -n $(GET_STATE $1) ]] && EXECUTE "logs -f" $1 || echo "$1 is not initialized" +} + +# MAIN SCRIPT + +source $PATH_PEGAZ/config.sh + +# DEFAULT command +if ! test $1 +then + HELP +# ALIAS commands +elif [[ $1 = -* ]] || [[ $1 == "ps" ]] +then + if ! test $2 + then + SET_ALIAS $1 + elif [[ $1 == "ps" ]] + then + EXECUTE $1 $2 + else + echo "[x] $1 command doesn't need param, try to run 'pegaz $1'" + fi +elif [[ " ${COMMANDS[*]} " =~ " $1 " ]] +then +# CORE commands + if [[ " ${COMMANDS_CORE[*]} " =~ " $1 " ]] + then + if ! test $2 + then + ${1^^} + elif [[ $1 == "create" || $1 == "storj" ]] + then + ${1^^} $2 $3 + else + echo "[x] $1 command doesn't need param, try to run 'pegaz $1'" + fi +# SERVICE commands + elif [[ " ${COMMANDS_SERVICE[*]} " =~ " $1 " ]] + then + if test $2 + then + if [[ " ${SERVICES_FLAT[*]} " =~ " $2 " ]] + then + ${1^^} $2 + elif [[ $1 == "backup" && $2 == "ls" ]] + then + echo -e "$(ls -lt $PATH_PEGAZ_BACKUP)" + else + echo "[x] $2 is not on the list, $1 a service listed below : +$SERVICES" + fi + else + for SERVICE in $SERVICES + do + ${1^^} $SERVICE + done + fi +# DOCKER-COMPOSE commands + else + if test $2 + then + EXECUTE $1 $2 + else + for SERVICE in $SERVICES + do + EXECUTE $1 $SERVICE + done + fi + fi +else + echo "[x] No such command: $1" + HELP +fi + diff --git a/public/favicon.svg b/public/favicon.svg deleted file mode 100644 index 0f39062..0000000 --- a/public/favicon.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - diff --git a/src/components/Card.astro b/src/components/Card.astro deleted file mode 100644 index ee57d4d..0000000 --- a/src/components/Card.astro +++ /dev/null @@ -1,62 +0,0 @@ ---- -export interface Props { - title: string; - body: string; - href: string; -} - -const { href, title, body } = Astro.props; ---- - - - diff --git a/src/components/demo.vue b/src/components/demo.vue index 191944d..141d13e 100644 --- a/src/components/demo.vue +++ b/src/components/demo.vue @@ -1,17 +1,33 @@ + + diff --git a/src/components/hero-buttons.vue b/src/components/hero-buttons.vue new file mode 100644 index 0000000..e9a084b --- /dev/null +++ b/src/components/hero-buttons.vue @@ -0,0 +1,36 @@ + + + diff --git a/src/components/hero-title.vue b/src/components/hero-title.vue new file mode 100644 index 0000000..0fcd3e5 --- /dev/null +++ b/src/components/hero-title.vue @@ -0,0 +1,25 @@ + + + \ No newline at end of file diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 8fd0149..d304d54 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -11,14 +11,14 @@ const { title } = Astro.props; - + {title} - - - - - + + + + + diff --git a/src/pages/index.astro b/src/pages/index.astro index 9db2d55..c4f4f21 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,57 +1,27 @@ --- -import Layout from '../layouts/Layout.astro' -import Card from '../components/Card.astro' -import Logo from '../svg/logo.vue' -import Github from '../svg/github.vue' -import ClipBoard from '../svg/clipboard.vue' -import Demo from '../components/demo.vue' +import Layout from "../layouts/Layout.astro"; +import Github from "../svg/github.vue"; +import HeroTitle from "../components/hero-title.vue"; +import HeroButtons from "../components/hero-buttons.vue"; +import Demo from "../components/demo.vue"; --- - -
- -
-
-
-
-
-
-
-
- -
-
-

- Pegaz -

-

- Deploy stack on the go -

-
-
-
- - get started - -
- - curl -sL get.pegaz.io | sudo bash - - -
-
-
-
- -
+ +
+
+ + + +
+
+ +
+
- - diff --git a/src/svg/apps/gitea.vue b/src/svg/apps/gitea.vue index 35428f4..172700e 100755 --- a/src/svg/apps/gitea.vue +++ b/src/svg/apps/gitea.vue @@ -5,22 +5,6 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="main_outline" x="0px" y="0px" viewBox="0 0 628.63165 387.52499" xml:space="preserve" sodipodi:docname="logo.svg" width="628.63165" height="387.52499" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> - - - - image/svg+xml - - - - - - - - - - - image/svg+xml - - - - - - diff --git a/src/svg/apps/nextcloud.vue b/src/svg/apps/nextcloud.vue index ad20483..f312386 100755 --- a/src/svg/apps/nextcloud.vue +++ b/src/svg/apps/nextcloud.vue @@ -6,29 +6,12 @@ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - - image/svg+xml - - - - - - - - - - - - - image/svg+xml - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - image/svg+xml - - - - Artboard - - - - - - - - - Artboard diff --git a/src/svg/apps/radio.vue b/src/svg/apps/radio.vue index fb6dcdb..a9451af 100755 --- a/src/svg/apps/radio.vue +++ b/src/svg/apps/radio.vue @@ -6,15 +6,6 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="svg919" width="834.39722" height="730.48706" viewBox="0 0 834.39722 730.48706" sodipodi:docname="radio.svg" inkscape:version="0.92.4 (5da689c313, 2019-01-14)"> - - - - image/svg+xml - - - - - @@ -23,12 +14,6 @@ - diff --git a/src/svg/folder.vue b/src/svg/folder.vue index 6682135..ae004c1 100644 --- a/src/svg/folder.vue +++ b/src/svg/folder.vue @@ -1,51 +1,3 @@ - - - - - - - - - + + diff --git a/src/svg/github.vue b/src/svg/github.vue index 4ed5c81..9f45708 100644 --- a/src/svg/github.vue +++ b/src/svg/github.vue @@ -4,12 +4,6 @@ inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> - -