diff --git a/package.json b/package.json index 6d2b02c4d0..a9154482ee 100644 --- a/package.json +++ b/package.json @@ -79,8 +79,8 @@ "cookie-session": "^2.0.0-rc.1", "cors": "^2.8.5", "db-migrate": "0.11.12", - "db-migrate-pg": "^1.2.2", - "db-migrate-shared": "^1.2.0", + "db-migrate-pg": "1.2.2", + "db-migrate-shared": "1.2.0", "deep-diff": "^1.0.2", "deepmerge": "^4.2.2", "errorhandler": "^1.5.1", @@ -90,7 +90,7 @@ "helmet": "^4.1.0", "joi": "^17.3.0", "js-yaml": "^3.14.0", - "knex": "0.95.5", + "knex": "0.95.10", "log4js": "^6.0.0", "memoizee": "^0.4.15", "mime": "^2.4.2", @@ -101,7 +101,7 @@ "nodemailer": "^6.5.0", "owasp-password-strength-test": "^1.3.0", "parse-database-url": "^0.3.0", - "pg": "^8.0.3", + "pg": "^8.7.1", "pg-connection-string": "^2.5.0", "pkginfo": "^0.4.1", "prom-client": "^13.1.0", diff --git a/src/lib/create-config.ts b/src/lib/create-config.ts index c0c897676f..c9dab779ce 100644 --- a/src/lib/create-config.ts +++ b/src/lib/create-config.ts @@ -63,6 +63,7 @@ const defaultDbOptions: IDBOption = { : { rejectUnauthorized: false }, driver: 'postgres', version: process.env.DATABASE_VERSION, + acquireConnectionTimeout: 30000, pool: { min: safeNumber(process.env.DATABASE_POOL_MIN, 0), max: safeNumber(process.env.DATABASE_POOL_MAX, 4), @@ -70,6 +71,7 @@ const defaultDbOptions: IDBOption = { process.env.DATABASE_POOL_IDLE_TIMEOUT_MS, 30000, ), + propagateCreateError: false, }, schema: process.env.DATABASE_SCHEMA || 'public', disableMigration: false, diff --git a/src/lib/server-impl.ts b/src/lib/server-impl.ts index aaa4f425db..ed74d04489 100644 --- a/src/lib/server-impl.ts +++ b/src/lib/server-impl.ts @@ -36,6 +36,7 @@ async function createApp( const db = createDb(config); const stores = createStores(config, eventBus, db); const services = createServices(stores, config); + const metricsMonitor = createMetricsMonitor(); const unleashSession = sessionDb(config, db); @@ -112,9 +113,11 @@ async function start(opts: IUnleashOptions = {}): Promise { try { if (config.db.disableMigration) { - logger.info('DB migrations disabled'); + logger.info('DB migration: disabled'); } else { + logger.info('DB migration: start'); await migrator(config); + logger.info('DB migration: end'); } } catch (err) { logger.error('Failed to migrate db', err); diff --git a/src/lib/types/option.ts b/src/lib/types/option.ts index e941d38112..fafcd12637 100644 --- a/src/lib/types/option.ts +++ b/src/lib/types/option.ts @@ -18,10 +18,12 @@ export interface IDBOption { ssl?: ISSLOption | boolean; driver: 'postgres'; version?: string; + acquireConnectionTimeout?: number; pool?: { min?: number; max?: number; idleTimeoutMillis?: number; + propagateCreateError?: boolean; }; schema: string; disableMigration: boolean; diff --git a/src/migrator.js b/src/migrator.js index fae2ec0259..810bf3d538 100644 --- a/src/migrator.js +++ b/src/migrator.js @@ -4,14 +4,16 @@ require('db-migrate-shared').log.setLogLevel('error'); const { getInstance } = require('db-migrate'); -function migrateDb({ db }) { - const custom = { ...db }; - const dbmigrate = getInstance(true, { +async function migrateDb({ db }) { + const custom = { ...db, connectionTimeoutMillis: 10000 }; + + const dbm = getInstance(true, { cwd: __dirname, config: { custom }, env: 'custom', }); - return dbmigrate.up(); + + return dbm.up(); } module.exports = migrateDb; diff --git a/src/server.ts b/src/server.ts index 141a0642d8..f0fdec1334 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,3 +1,9 @@ import * as unleash from './lib/server-impl'; -unleash.start(); +try { + unleash.start(); +} catch (error) { + // eslint-disable-next-line no-console + console.error(error); + process.exit(); +} diff --git a/yarn.lock b/yarn.lock index b6bc14eaca..2bf0110234 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1233,12 +1233,12 @@ async@^3.1.1: async@~0.9.0: version "0.9.2" - resolved "https://registry.npmjs.org/async/-/async-0.9.2.tgz" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= async@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/async/-/async-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= asynckit@^0.4.0: @@ -1677,12 +1677,12 @@ colorette@^1.2.2: colors@1.0.x: version "1.0.3" - resolved "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= colors@^1.1.2: version "1.4.0" - resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: @@ -1923,7 +1923,7 @@ cssstyle@^2.3.0: cycle@1.0.x: version "1.0.3" - resolved "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= d@1, d@^1.0.1: @@ -1967,9 +1967,9 @@ db-migrate-base@^2.3.0: dependencies: bluebird "^3.1.1" -db-migrate-pg@^1.2.2: +db-migrate-pg@1.2.2: version "1.2.2" - resolved "https://registry.npmjs.org/db-migrate-pg/-/db-migrate-pg-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/db-migrate-pg/-/db-migrate-pg-1.2.2.tgz#66436dbad0ba398c05851d200f768db6b2e5bc1a" integrity sha512-+rgrhGNWC2SzcfweopyZqOQ1Igz1RVFMUZwUs6SviHpOUzFwb0NZWkG0pw1GaO+JxTxS7VJjckUWkOwZbVYVag== dependencies: bluebird "^3.1.1" @@ -1977,14 +1977,14 @@ db-migrate-pg@^1.2.2: pg "^8.0.3" semver "^5.0.3" -db-migrate-shared@^1.2.0: +db-migrate-shared@1.2.0, db-migrate-shared@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/db-migrate-shared/-/db-migrate-shared-1.2.0.tgz" integrity sha512-65k86bVeHaMxb2L0Gw3y5V+CgZSRwhVQMwDMydmw5MvIpHHwD6SmBciqIwHsZfzJ9yzV/yYhdRefRM6FV5/siw== db-migrate@0.11.12: version "0.11.12" - resolved "https://registry.npmjs.org/db-migrate/-/db-migrate-0.11.12.tgz" + resolved "https://registry.yarnpkg.com/db-migrate/-/db-migrate-0.11.12.tgz#2798fc46da51fc2589497d462f3c6116802cfb6a" integrity sha512-HUS8T5A3sKGCi+hz9XMKMwAKfU9sqhpDufW9nbVSRc5wxDO695uxA5lDe+If0OdvwwQOVxOnEZqkzAAxgyeFWg== dependencies: balanced-match "^1.0.0" @@ -2017,7 +2017,7 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: +debug@4, debug@4.3.2, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: version "4.3.2" resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== @@ -2076,11 +2076,6 @@ deep-diff@^1.0.2: resolved "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz" integrity sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg== -deep-equal@~0.2.1: - version "0.2.2" - resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz" - integrity sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0= - deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" @@ -2786,7 +2781,7 @@ extsprintf@^1.2.0: eyes@0.1.x: version "0.1.8" - resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= faker@^5.5.3: @@ -3406,11 +3401,6 @@ husky@^7.0.1: resolved "https://registry.npmjs.org/husky/-/husky-7.0.1.tgz" integrity sha512-gceRaITVZ+cJH9sNHqx5tFwbzlLCVxtVZcusME8JYQ8Edy5mpGDOqD8QBCdMhpyo9a+JXddnujQ4rpY2Ff9SJA== -i@0.3.x: - version "0.3.6" - resolved "https://registry.npmjs.org/i/-/i-0.3.6.tgz" - integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0= - iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" @@ -3816,7 +3806,7 @@ isobject@^3.0.0, isobject@^3.0.1: isstream@0.1.x, isstream@~0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istanbul-lib-coverage@^3.0.0: @@ -4451,21 +4441,21 @@ kleur@^3.0.3: resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -knex@0.95.5: - version "0.95.5" - resolved "https://registry.npmjs.org/knex/-/knex-0.95.5.tgz" - integrity sha512-h6cuN78nSCqt5KLb06HnLE2Oj2svMf3l2YUSYpLnJuwXetGysn7KgmFJU1RDdl5dftvLAEEfA8IvqQIalgcnag== +knex@0.95.10: + version "0.95.10" + resolved "https://registry.yarnpkg.com/knex/-/knex-0.95.10.tgz#9c41a4f69309bc437f79985cbc0a1e7a3208483e" + integrity sha512-I60A8TXcMdeJlE6h7DSgEYyY37S7kgLObz1qlJ7QvPMD6vnKO5dtuLEht5pMia9Qf5BomqVgkWCdVTqcC/ImOA== dependencies: colorette "1.2.1" commander "^7.1.0" - debug "4.3.1" + debug "4.3.2" escalade "^3.1.1" esm "^3.2.25" getopts "2.2.5" interpret "^2.2.0" lodash "^4.17.21" - pg-connection-string "2.4.0" - rechoir "^0.7.0" + pg-connection-string "2.5.0" + rechoir "0.7.0" resolve-from "^5.0.0" tarn "^3.0.1" tildify "2.0.0" @@ -4901,18 +4891,18 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.x.x, mkdirp@^0.5.4, mkdirp@~0.5.0: +mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^0.5.4, mkdirp@~0.5.0: version "0.5.5" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" -mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - module-not-found-error@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz" @@ -4969,7 +4959,7 @@ mustache@^4.1.0: mute-stream@~0.0.4: version "0.0.8" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nanomatch@^1.2.9: @@ -4994,11 +4984,6 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -ncp@1.0.x: - version "1.0.1" - resolved "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz" - integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY= - negotiator@0.6.2: version "0.6.2" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" @@ -5476,7 +5461,7 @@ pg-connection-string@2.4.0: resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.4.0.tgz" integrity sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ== -pg-connection-string@^2.5.0: +pg-connection-string@2.5.0, pg-connection-string@^2.5.0: version "2.5.0" resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz" integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== @@ -5507,7 +5492,7 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@^8.0.3: +pg@^8.0.3, pg@^8.7.1: version "8.7.1" resolved "https://registry.npmjs.org/pg/-/pg-8.7.1.tgz" integrity sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA== @@ -5659,14 +5644,14 @@ promise-polyfill@^8.1.3: integrity sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g== prompt@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/prompt/-/prompt-1.1.0.tgz" - integrity sha512-ec1vUPXCplDBDUVD8uPa3XGA+OzLrO40Vxv3F1uxoiZGkZhdctlK2JotcHq5X6ExjocDOGwGdCSXloGNyU5L1Q== + version "1.2.0" + resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.2.0.tgz#5d8f1d9011766bac07abde510dbf4338d87b4f02" + integrity sha512-iGerYRpRUg5ZyC+FJ/25G5PUKuWAGRjW1uOlhX7Pi3O5YygdK6R+KEaBjRbHSkU5vfS5PZCltSPZdDtUYwRCZA== dependencies: + async "~0.9.0" colors "^1.1.2" read "1.0.x" revalidator "0.1.x" - utile "0.3.x" winston "2.x" prompts@^2.0.1: @@ -5816,7 +5801,7 @@ read-pkg@^6.0.0: read@1.0.x: version "1.0.7" - resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= dependencies: mute-stream "~0.0.4" @@ -5863,6 +5848,13 @@ readable-stream@~1.0.31: isarray "0.0.1" string_decoder "~0.10.x" +rechoir@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" + integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== + dependencies: + resolve "^1.9.0" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" @@ -5870,13 +5862,6 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== - dependencies: - resolve "^1.9.0" - redent@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz" @@ -6020,7 +6005,7 @@ reusify@^1.0.4: revalidator@0.1.x: version "0.1.8" - resolved "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz" + resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs= rfdc@^1.1.4: @@ -6028,13 +6013,6 @@ rfdc@^1.1.4: resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@2.x.x: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" @@ -6385,7 +6363,7 @@ sshpk@^1.7.0: stack-trace@0.0.x: version "0.0.10" - resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= stack-utils@^2.0.3: @@ -7054,18 +7032,6 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -utile@0.3.x: - version "0.3.0" - resolved "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz" - integrity sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo= - dependencies: - async "~0.9.0" - deep-equal "~0.2.1" - i "0.3.x" - mkdirp "0.x.x" - ncp "1.0.x" - rimraf "2.x.x" - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" @@ -7234,7 +7200,7 @@ wide-align@^1.1.0: winston@2.x: version "2.4.5" - resolved "https://registry.npmjs.org/winston/-/winston-2.4.5.tgz" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.5.tgz#f2e431d56154c4ea765545fc1003bd340c95b59a" integrity sha512-TWoamHt5yYvsMarGlGEQE59SbJHqGsZV8/lwC+iCcGeAe0vUaOh+Lv6SYM17ouzC/a/LB1/hz/7sxFBtlu1l4A== dependencies: async "~1.0.0"