import * as plugins from './plugins.js'; import * as paths from './paths.js'; import { logger } from './logger.js'; import type { Cloudly } from './classes.cloudly.js'; /** * the main cloudly config */ export class CloudlyConfig { public cloudlyRef: Cloudly; public appData: plugins.npmextra.AppData; public data: plugins.servezoneInterfaces.data.ICloudlyConfig constructor(cloudlyRefArg: Cloudly) { this.cloudlyRef = cloudlyRefArg; } public async init() { this.appData = await plugins.npmextra.AppData.createAndInit({ 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'], servezoneAdminaccount: 'SERVEZONE_ADMINACCOUNT', }, requiredKeys: [ 'cfToken', 'hetznerToken', 'letsEncryptEmail', 'publicUrl', 'publicPort', 'sslMode', 'environment', 'mongoDescriptor', ], }); const kvStore = await this.appData.getKvStore(); 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'); } } }