80 lines
2.6 KiB
TypeScript
80 lines
2.6 KiB
TypeScript
|
import * as plugins from './cloudly.plugins.js';
|
||
|
import * as paths from './cloudly.paths.js';
|
||
|
import { logger } from './cloudly.logging.js';
|
||
|
import type { Cloudly } from './cloudly.classes.cloudly.js';
|
||
|
|
||
|
/**
|
||
|
* the main cloudly config
|
||
|
*/
|
||
|
export class CloudlyConfig {
|
||
|
public cloudlyRef: Cloudly;
|
||
|
public appData: plugins.npmextra.AppData<plugins.servezoneInterfaces.data.ICloudlyConfig>;
|
||
|
public data: plugins.servezoneInterfaces.data.ICloudlyConfig
|
||
|
|
||
|
// authentication and settings
|
||
|
public smartjwtInstance: plugins.smartjwt.SmartJwt;
|
||
|
|
||
|
|
||
|
constructor(cloudlyRefArg: Cloudly) {
|
||
|
this.cloudlyRef = cloudlyRefArg;
|
||
|
}
|
||
|
|
||
|
public async init() {
|
||
|
this.appData = await plugins.npmextra.AppData.createAndInit<plugins.servezoneInterfaces.data.ICloudlyConfig>({
|
||
|
envMapping: {
|
||
|
cfToken: 'CF_TOKEN',
|
||
|
environment: 'SERVEZONE_ENVIRONMENT' as 'production' | 'integration',
|
||
|
letsEncryptEmail: 'hard:domains@lossless.org',
|
||
|
hetznerToken: 'HETZNER_API_TOKEN',
|
||
|
letsEncryptPrivateKey: null,
|
||
|
publicUrl: 'SERVEZONE_URL',
|
||
|
publicPort: 'SERVEZONE_PORT',
|
||
|
mongoDescriptor: {
|
||
|
mongoDbUrl: 'MONGODB_URL',
|
||
|
mongoDbName: 'MONGODB_DATABASE',
|
||
|
mongoDbUser: 'MONGODB_USER',
|
||
|
mongoDbPass: 'MONGODB_PASSWORD',
|
||
|
},
|
||
|
s3Descriptor: {
|
||
|
endpoint: 'S3_ENDPOINT',
|
||
|
accessKey: 'S3_ACCESSKEY',
|
||
|
accessSecret: 'S3_SECRETKEY',
|
||
|
port: 'S3_PORT', // Note: This will remain as a string. Ensure to parse it to an integer where it's used.
|
||
|
useSsl: true,
|
||
|
},
|
||
|
sslMode: 'SERVEZONE_SSLMODE' as plugins.servezoneInterfaces.data.ICloudlyConfig['sslMode'],
|
||
|
},
|
||
|
requiredKeys: [
|
||
|
'cfToken',
|
||
|
'hetznerToken',
|
||
|
'letsEncryptEmail',
|
||
|
'publicUrl',
|
||
|
'publicPort',
|
||
|
'sslMode',
|
||
|
'environment',
|
||
|
'mongoDescriptor',
|
||
|
],
|
||
|
});
|
||
|
|
||
|
this.smartjwtInstance = new plugins.smartjwt.SmartJwt();
|
||
|
const kvStore = await this.appData.getKvStore();
|
||
|
|
||
|
const existingJwtKeys: plugins.tsclass.network.IJwtKeypair = await kvStore.readKey('jwtKeys');
|
||
|
|
||
|
if (!existingJwtKeys) {
|
||
|
await this.smartjwtInstance.createNewKeyPair();
|
||
|
const newJwtKeys = this.smartjwtInstance.getKeyPairAsJson();
|
||
|
await kvStore.writeKey('jwtKeys', newJwtKeys);
|
||
|
} else {
|
||
|
this.smartjwtInstance.setKeyPairAsJson(existingJwtKeys);
|
||
|
}
|
||
|
|
||
|
this.data = await kvStore.readAll();
|
||
|
const missingKeys = await this.appData.logMissingKeys();
|
||
|
if (missingKeys.length > 0) {
|
||
|
logger.log('error', `missing keys: ${missingKeys.join(', ')}`);
|
||
|
throw new Error('missing keys');
|
||
|
}
|
||
|
}
|
||
|
}
|