mirror of https://github.com/nocodb/nocodb
Browse Source
Default tool directory is configured as `/usr/app/data/`, so user can mount volume and persist data(meta, uplods, default sqlite meta db, etc..) re #351 Signed-off-by: Pranav C <61551451+pranavxc@users.noreply.github.com>pull/359/head
Pranav C
3 years ago
8 changed files with 74 additions and 314 deletions
@ -1,237 +0,0 @@ |
|||||||
import fs from 'fs'; |
|
||||||
import path from 'path'; |
|
||||||
|
|
||||||
// const {uniqueNamesGenerator, starWars, adjectives, animals} = require('unique-names-generator');
|
|
||||||
|
|
||||||
export default class NcConfigFactory { |
|
||||||
|
|
||||||
|
|
||||||
static make() { |
|
||||||
const config: any = new NcConfigFactory(); |
|
||||||
|
|
||||||
const dbUrls = Object.keys(process.env).filter(envKey => envKey.startsWith('NC_DB_URL')); |
|
||||||
|
|
||||||
for (const key of dbUrls.sort()) { |
|
||||||
const dbConfig = this.urlToDbConfig(process.env[key], key.slice(9), config); |
|
||||||
config.envs[process.env.NODE_ENV || 'dev'].db.push(dbConfig); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
if (process.env.NC_AUTH_ADMIN_SECRET) { |
|
||||||
config.auth = { |
|
||||||
masterKey: { |
|
||||||
secret: process.env.NC_AUTH_ADMIN_SECRET |
|
||||||
} |
|
||||||
}; |
|
||||||
} else if (process.env.NC_NO_AUTH) { |
|
||||||
config.auth = { |
|
||||||
disabled: true |
|
||||||
}; |
|
||||||
} else if (config.envs[process.env.NODE_ENV || 'dev'].db[0]) { |
|
||||||
config.auth = { |
|
||||||
jwt: { |
|
||||||
dbAlias: process.env.NC_AUTH_JWT_DB_ALIAS || config.envs[process.env.NODE_ENV || 'dev'].db[0].meta.dbAlias, |
|
||||||
secret: process.env.NC_AUTH_JWT_SECRET || 'sdjhjdhkshdkjhskdkjshk' // uuidv4()
|
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
if (process.env.NC_DB) { |
|
||||||
config.meta.db = this.metaUrlToDbConfig(process.env.NC_DB) |
|
||||||
} |
|
||||||
|
|
||||||
config.port = +(process.env.PORT || 8080); |
|
||||||
config.env = process.env.NODE_ENV || 'dev'; |
|
||||||
config.workingEnv = process.env.NODE_ENV || 'dev'; |
|
||||||
config.folder = config.toolDir = process.env.NC_TOOL_DIR || process.cwd(); |
|
||||||
|
|
||||||
|
|
||||||
return config; |
|
||||||
} |
|
||||||
|
|
||||||
static hasDbUrl() { |
|
||||||
return Object.keys(process.env).some(envKey => envKey.startsWith('NC_DB_URL')); |
|
||||||
} |
|
||||||
|
|
||||||
static makeFromUrls(urls) { |
|
||||||
const config: any = new NcConfigFactory(); |
|
||||||
|
|
||||||
config.envs[process.env.NODE_ENV || 'dev'].db = []; |
|
||||||
for (const [i, url] of Object.entries(urls)) { |
|
||||||
config.envs[process.env.NODE_ENV || 'dev'].db.push(this.urlToDbConfig(url, i)); |
|
||||||
} |
|
||||||
|
|
||||||
return config; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
static urlToDbConfig(urlString, key, config?) { |
|
||||||
const url = new URL(urlString); |
|
||||||
|
|
||||||
let dbConfig; |
|
||||||
|
|
||||||
if (url.protocol.startsWith('sqlite3')) { |
|
||||||
dbConfig = { |
|
||||||
client: 'sqlite3', |
|
||||||
"connection": { |
|
||||||
"client": "sqlite3", |
|
||||||
"connection": { |
|
||||||
"filename": url.searchParams.get('d') || url.searchParams.get('database') |
|
||||||
}, |
|
||||||
"database": url.searchParams.get('d') || url.searchParams.get('database'), |
|
||||||
"useNullAsDefault": true |
|
||||||
}, |
|
||||||
}; |
|
||||||
} else { |
|
||||||
dbConfig = { |
|
||||||
client: url.protocol.replace(':', ''), |
|
||||||
"connection": { |
|
||||||
database: url.searchParams.get('d') || url.searchParams.get('database'), |
|
||||||
"host": url.hostname, |
|
||||||
"password": url.searchParams.get('p') || url.searchParams.get('password'), |
|
||||||
"port": +url.port, |
|
||||||
'user': url.searchParams.get('u') || url.searchParams.get('user'), |
|
||||||
}, |
|
||||||
pool: { |
|
||||||
min: 5, |
|
||||||
max: 50 |
|
||||||
}, |
|
||||||
acquireConnectionTimeout: 600000, |
|
||||||
}; |
|
||||||
if (url.searchParams.get('keyFilePath') && url.searchParams.get('certFilePath') && url.searchParams.get('caFilePath')) { |
|
||||||
dbConfig.connection.ssl = { |
|
||||||
keyFilePath: url.searchParams.get('keyFilePath'), |
|
||||||
certFilePath: url.searchParams.get('certFilePath'), |
|
||||||
caFilePath: url.searchParams.get('caFilePath'), |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if (config && !config.title) { |
|
||||||
config.title = url.searchParams.get('t') || url.searchParams.get('title') || this.generateRandomTitle(); |
|
||||||
} |
|
||||||
|
|
||||||
Object.assign(dbConfig, { |
|
||||||
meta: { |
|
||||||
tn: 'nc_evolutions', |
|
||||||
allSchemas: !!url.searchParams.get('allSchemas') || !(url.searchParams.get('d') || url.searchParams.get('database')), |
|
||||||
api: { |
|
||||||
prefix: url.searchParams.get('apiPrefix') || '', |
|
||||||
swagger: true, |
|
||||||
type: url.searchParams.get('api') || url.searchParams.get('a') || "rest", |
|
||||||
}, |
|
||||||
dbAlias: url.searchParams.get('dbAlias') || `db${key}`, |
|
||||||
metaTables: 'db', |
|
||||||
migrations: { |
|
||||||
disabled: false, |
|
||||||
name: "nc_evolutions" |
|
||||||
} |
|
||||||
} |
|
||||||
}) |
|
||||||
|
|
||||||
|
|
||||||
return dbConfig; |
|
||||||
} |
|
||||||
|
|
||||||
static generateRandomTitle() { |
|
||||||
return 'test' |
|
||||||
// return uniqueNamesGenerator({
|
|
||||||
// dictionaries: [[starWars], [adjectives, animals]][Math.floor(Math.random() * 2)]
|
|
||||||
// }).toLowerCase().replace(/[ -]/g, '_');
|
|
||||||
} |
|
||||||
|
|
||||||
static metaUrlToDbConfig(urlString) { |
|
||||||
const url = new URL(urlString); |
|
||||||
|
|
||||||
let dbConfig; |
|
||||||
|
|
||||||
if (url.protocol.startsWith('sqlite3')) { |
|
||||||
dbConfig = { |
|
||||||
"client": "sqlite3", |
|
||||||
"connection": { |
|
||||||
"filename": url.searchParams.get('d') || url.searchParams.get('database') |
|
||||||
} |
|
||||||
} |
|
||||||
} else { |
|
||||||
dbConfig = { |
|
||||||
client: url.protocol.replace(':', ''), |
|
||||||
"connection": { |
|
||||||
database: url.searchParams.get('d') || url.searchParams.get('database'), |
|
||||||
"host": url.hostname, |
|
||||||
"password": url.searchParams.get('p') || url.searchParams.get('password'), |
|
||||||
"port": +url.port, |
|
||||||
'user': url.searchParams.get('u') || url.searchParams.get('user'), |
|
||||||
}, |
|
||||||
pool: { |
|
||||||
min: 5, |
|
||||||
max: 50 |
|
||||||
}, |
|
||||||
acquireConnectionTimeout: 600000, |
|
||||||
}; |
|
||||||
|
|
||||||
} |
|
||||||
return dbConfig |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
static metaDbCreateIfNotExist(args) { |
|
||||||
const dbPath = path.join(args.toolDir, 'noco.db') |
|
||||||
const exists = fs.existsSync(dbPath); |
|
||||||
if (!exists) { |
|
||||||
const fd = fs.openSync(dbPath, "w"); |
|
||||||
fs.closeSync(fd); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// version = '0.6';
|
|
||||||
// port;
|
|
||||||
// auth;
|
|
||||||
// env;
|
|
||||||
// workingEnv;
|
|
||||||
// toolDir;
|
|
||||||
// envs;
|
|
||||||
// queriesFolder;
|
|
||||||
// seedsFolder;
|
|
||||||
// title;
|
|
||||||
// meta = {
|
|
||||||
// "db": {
|
|
||||||
// "client": "sqlite3",
|
|
||||||
// "connection": {
|
|
||||||
// "filename": "xc.db"
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
//@ts-ignore
|
|
||||||
private envs: any; |
|
||||||
|
|
||||||
constructor() { |
|
||||||
|
|
||||||
this.envs = {dev: {db: []}}; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @copyright Copyright (c) 2021, Xgene Cloud Ltd |
|
||||||
* |
|
||||||
* @author Naveen MR <oof1lab@gmail.com> |
|
||||||
* @author Pranav C Balan <pranavxc@gmail.com> |
|
||||||
* |
|
||||||
* @license GNU AGPL version 3 or any later version |
|
||||||
* |
|
||||||
* This program is free software: you can redistribute it and/or modify |
|
||||||
* it under the terms of the GNU Affero General Public License as |
|
||||||
* published by the Free Software Foundation, either version 3 of the |
|
||||||
* License, or (at your option) any later version. |
|
||||||
* |
|
||||||
* This program is distributed in the hope that it will be useful, |
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
* GNU Affero General Public License for more details. |
|
||||||
* |
|
||||||
* You should have received a copy of the GNU Affero General Public License |
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||||
* |
|
||||||
*/ |
|
Loading…
Reference in new issue