feat: Implement platform service providers for MinIO and MongoDB

- Added base interface and abstract class for platform service providers.
- Created MinIOProvider class for S3-compatible storage with deployment, provisioning, and deprovisioning functionalities.
- Implemented MongoDBProvider class for MongoDB service with similar capabilities.
- Introduced error handling utilities for better error management.
- Developed TokensComponent for managing registry tokens in the UI, including creation, deletion, and display of tokens.
This commit is contained in:
2025-11-25 04:20:19 +00:00
parent 9aa6906ca5
commit 8ebd677478
28 changed files with 3462 additions and 490 deletions

View File

@@ -7,6 +7,7 @@
import * as plugins from '../plugins.ts';
import { logger } from '../logging.ts';
import { projectInfo } from '../info.ts';
import { getErrorMessage } from '../utils/error.ts';
import type { Onebox } from './onebox.ts';
// PID file constants
@@ -72,7 +73,7 @@ export class OneboxDaemon {
logger.success('Onebox daemon service installed');
logger.info('Start with: sudo systemctl start smartdaemon_onebox');
} catch (error) {
logger.error(`Failed to install daemon service: ${error.message}`);
logger.error(`Failed to install daemon service: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -89,7 +90,8 @@ export class OneboxDaemon {
this.smartdaemon = new plugins.smartdaemon.SmartDaemon();
}
const service = await this.smartdaemon.getService('onebox');
const services = await this.smartdaemon.systemdManager.getServices();
const service = services.find(s => s.name === 'onebox');
if (service) {
await service.stop();
@@ -99,7 +101,7 @@ export class OneboxDaemon {
logger.success('Onebox daemon service uninstalled');
} catch (error) {
logger.error(`Failed to uninstall daemon service: ${error.message}`);
logger.error(`Failed to uninstall daemon service: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -137,7 +139,7 @@ export class OneboxDaemon {
// Keep process alive
await this.keepAlive();
} catch (error) {
logger.error(`Failed to start daemon: ${error.message}`);
logger.error(`Failed to start daemon: ${getErrorMessage(error)}`);
this.running = false;
throw error;
}
@@ -167,7 +169,7 @@ export class OneboxDaemon {
logger.success('Onebox daemon stopped');
} catch (error) {
logger.error(`Failed to stop daemon: ${error.message}`);
logger.error(`Failed to stop daemon: ${getErrorMessage(error)}`);
throw error;
}
}
@@ -229,7 +231,7 @@ export class OneboxDaemon {
logger.debug('Monitoring tick complete');
} catch (error) {
logger.error(`Monitoring tick failed: ${error.message}`);
logger.error(`Monitoring tick failed: ${getErrorMessage(error)}`);
}
}
@@ -257,12 +259,12 @@ export class OneboxDaemon {
});
}
} catch (error) {
logger.debug(`Failed to collect metrics for ${service.name}: ${error.message}`);
logger.debug(`Failed to collect metrics for ${service.name}: ${getErrorMessage(error)}`);
}
}
}
} catch (error) {
logger.error(`Failed to collect metrics: ${error.message}`);
logger.error(`Failed to collect metrics: ${getErrorMessage(error)}`);
}
}
@@ -277,7 +279,7 @@ export class OneboxDaemon {
await this.oneboxRef.ssl.renewExpiring();
} catch (error) {
logger.error(`Failed to check SSL expiration: ${error.message}`);
logger.error(`Failed to check SSL expiration: ${getErrorMessage(error)}`);
}
}
@@ -288,7 +290,7 @@ export class OneboxDaemon {
try {
await this.oneboxRef.certRequirementManager.processPendingRequirements();
} catch (error) {
logger.error(`Failed to process cert requirements: ${error.message}`);
logger.error(`Failed to process cert requirements: ${getErrorMessage(error)}`);
}
}
@@ -299,7 +301,7 @@ export class OneboxDaemon {
try {
await this.oneboxRef.certRequirementManager.checkCertificateRenewal();
} catch (error) {
logger.error(`Failed to check certificate renewal: ${error.message}`);
logger.error(`Failed to check certificate renewal: ${getErrorMessage(error)}`);
}
}
@@ -310,7 +312,7 @@ export class OneboxDaemon {
try {
await this.oneboxRef.certRequirementManager.cleanupOldCertificates();
} catch (error) {
logger.error(`Failed to cleanup old certificates: ${error.message}`);
logger.error(`Failed to cleanup old certificates: ${getErrorMessage(error)}`);
}
}
@@ -333,7 +335,7 @@ export class OneboxDaemon {
await this.oneboxRef.cloudflareDomainSync.syncZones();
this.lastDomainSync = now;
} catch (error) {
logger.error(`Failed to sync Cloudflare domains: ${error.message}`);
logger.error(`Failed to sync Cloudflare domains: ${getErrorMessage(error)}`);
}
}
@@ -388,7 +390,7 @@ export class OneboxDaemon {
this.pidFilePath = FALLBACK_PID_FILE;
logger.debug(`PID file written: ${FALLBACK_PID_FILE}`);
} catch (error) {
logger.warn(`Failed to write PID file: ${error.message}`);
logger.warn(`Failed to write PID file: ${getErrorMessage(error)}`);
// Non-fatal - daemon can still run
}
}
@@ -402,7 +404,7 @@ export class OneboxDaemon {
logger.debug(`PID file removed: ${this.pidFilePath}`);
} catch (error) {
// Ignore errors - file might not exist
logger.debug(`Could not remove PID file: ${error.message}`);
logger.debug(`Could not remove PID file: ${getErrorMessage(error)}`);
}
}