diff --git a/package.json b/package.json index 976a3f3d..df0b1845 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,10 @@ "test:server": "jest --config=server/.jestconfig.json --runInBand --forceExit", "test:watch": "jest --config=server/.jestconfig.json --runInBand --forceExit --watchAll" }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/outline" + }, "jest": { "testURL": "http://localhost", "verbose": false, @@ -81,8 +85,10 @@ "babel-plugin-styled-components": "^1.11.1", "babel-plugin-transform-class-properties": "^6.24.1", "boundless-arrow-key-navigation": "^1.0.4", + "boxen": "^5.0.1", "bull": "^3.5.2", "cancan": "3.1.0", + "chalk": "^4.1.0", "compressorjs": "^1.0.7", "copy-to-clipboard": "^3.0.6", "core-js": "2", diff --git a/server/index.js b/server/index.js index 12056836..e56465a0 100644 --- a/server/index.js +++ b/server/index.js @@ -1,6 +1,10 @@ // @flow require("dotenv").config({ silent: true }); +const errors = []; +const boxen = require("boxen"); +const chalk = require("chalk"); + // If the DataDog agent is installed and the DD_API_KEY environment variable is // in the environment then we can safely attempt to start the DD tracer if (process.env.DD_API_KEY) { @@ -15,10 +19,26 @@ if ( !process.env.SECRET_KEY || process.env.SECRET_KEY === "generate_a_new_key" ) { - console.error( - "The SECRET_KEY env variable must be set with the output of `openssl rand -hex 32`" + errors.push( + `The ${chalk.bold( + "SECRET_KEY" + )} env variable must be set with the output of ${chalk.bold( + "$ openssl rand -hex 32" + )}` + ); +} + +if ( + !process.env.UTILS_SECRET || + process.env.UTILS_SECRET === "generate_a_new_key" +) { + errors.push( + `The ${chalk.bold( + "UTILS_SECRET" + )} env variable must be set with a secret value, it is recommended to use the output of ${chalk.bold( + "$ openssl rand -hex 32" + )}` ); - process.exit(1); } if (process.env.AWS_ACCESS_KEY_ID) { @@ -29,48 +49,66 @@ if (process.env.AWS_ACCESS_KEY_ID) { "AWS_S3_UPLOAD_MAX_SIZE", ].forEach((key) => { if (!process.env[key]) { - console.error(`The ${key} env variable must be set when using AWS`); - process.exit(1); + errors.push( + `The ${chalk.bold( + key + )} env variable must be set when using S3 compatible storage` + ); } }); } -if (process.env.SLACK_KEY) { - if (!process.env.SLACK_SECRET) { - console.error( - `The SLACK_SECRET env variable must be set when using Slack Sign In` - ); - process.exit(1); - } -} - if (!process.env.URL) { - console.error( - "The URL env variable must be set to the externally accessible URL, e.g (https://www.getoutline.com)" + errors.push( + `The ${chalk.bold( + "URL" + )} env variable must be set to the fully qualified, externally accessible URL, e.g https://wiki.mycompany.com` ); - process.exit(1); } if (!process.env.DATABASE_URL) { - console.error( - "The DATABASE_URL env variable must be set to the location of your postgres server, including authentication and port" + errors.push( + `The ${chalk.bold( + "DATABASE_URL" + )} env variable must be set to the location of your postgres server, including username, password, and port` ); - process.exit(1); } if (!process.env.REDIS_URL) { - console.error( - "The REDIS_URL env variable must be set to the location of your redis server, including authentication and port" + errors.push( + `The ${chalk.bold( + "REDIS_URL" + )} env variable must be set to the location of your redis server, including username, password, and port` ); +} + +if (errors.length) { + console.log( + chalk.bold.red( + "\n\nThe server could not start, please fix the following configuration errors and try again:\n" + ) + ); + errors.map((text) => console.log(` - ${text}`)); + console.log("\n"); process.exit(1); } if (process.env.NODE_ENV === "production") { - console.log("\n\x1b[33m%s\x1b[0m", "Running Outline in production mode."); + console.log( + boxen( + ` +Is your team enjoying Outline? Consider supporting future development by sponsoring the project:\n\nhttps://github.com/sponsors/outline +`, + { padding: 1, margin: 1, borderStyle: "double", borderColor: "green" } + ) + ); } else if (process.env.NODE_ENV === "development") { console.log( - "\n\x1b[33m%s\x1b[0m", - 'Running Outline in development mode with hot reloading. To run Outline in production mode set the NODE_ENV env variable to "production"' + chalk.yellow( + `\nRunning Outline in development mode. To run Outline in production mode set the ${chalk.bold( + "NODE_ENV" + )} env variable to "production"\n` + ) ); } diff --git a/yarn.lock b/yarn.lock index 7965d0b6..32b9247b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2404,6 +2404,13 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" +ansi-align@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" + integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + dependencies: + string-width "^3.0.0" + ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -3136,6 +3143,20 @@ boxen@^1.2.1: term-size "^1.2.0" widest-line "^2.0.0" +boxen@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.0.1.tgz#657528bdd3f59a772b8279b831f27ec2c744664b" + integrity sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.0" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3503,7 +3524,7 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== @@ -3571,7 +3592,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== @@ -3722,6 +3743,11 @@ cli-boxes@^1.0.0: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + cli-color@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f" @@ -12198,10 +12224,10 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" @@ -12860,6 +12886,11 @@ type-fest@^0.16.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -13646,6 +13677,13 @@ widest-line@^2.0.0: dependencies: string-width "^2.1.1" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + windows-release@^3.1.0: version "3.3.3" resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" @@ -13865,6 +13903,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"