fix(services): Improve logging and enhance MongoDB Compass integration
Some checks failed
Default (tags) / security (push) Failing after 1s
Default (tags) / test (push) Failing after 0s
Default (tags) / release (push) Has been skipped
Default (tags) / metadata (push) Has been skipped

This commit is contained in:
2025-08-15 09:37:54 +00:00
parent 05b170cbac
commit 7b9ebfdacb
7 changed files with 160 additions and 163 deletions

View File

@@ -2,6 +2,7 @@ import * as plugins from './mod.plugins.js';
import * as helpers from './helpers.js';
import { ServiceConfiguration } from './classes.serviceconfiguration.js';
import { DockerContainer } from './classes.dockercontainer.js';
import { logger } from '../gitzone.logging.js';
export class ServiceManager {
private config: ServiceConfiguration;
@@ -18,20 +19,20 @@ export class ServiceManager {
public async init(): Promise<void> {
// Check Docker availability
if (!(await this.docker.checkDocker())) {
helpers.printMessage('Error: Docker is not installed. Please install Docker first.', 'red');
logger.log('error', 'Error: Docker is not installed. Please install Docker first.');
process.exit(1);
}
// Load or create configuration
await this.config.loadOrCreate();
helpers.printMessage(`📋 Project: ${this.config.getConfig().PROJECT_NAME}`, 'magenta');
logger.log('info', `📋 Project: ${this.config.getConfig().PROJECT_NAME}`);
}
/**
* Start MongoDB service
*/
public async startMongoDB(): Promise<void> {
helpers.printMessage('📦 MongoDB:', 'yellow');
logger.log('note', '📦 MongoDB:');
const config = this.config.getConfig();
const containers = this.config.getContainerNames();
@@ -44,19 +45,19 @@ export class ServiceManager {
switch (status) {
case 'running':
helpers.printMessage(' Already running ✓', 'green');
logger.log('ok', ' Already running ✓');
break;
case 'stopped':
if (await this.docker.start(containers.mongo)) {
helpers.printMessage(' Started ✓', 'green');
logger.log('ok', ' Started ✓');
} else {
helpers.printMessage(' Failed to start', 'red');
logger.log('error', ' Failed to start');
}
break;
case 'not_exists':
helpers.printMessage(' Creating container...', 'yellow');
logger.log('note', ' Creating container...');
const success = await this.docker.run({
name: containers.mongo,
@@ -76,23 +77,28 @@ export class ServiceManager {
});
if (success) {
helpers.printMessage(' Created and started ✓', 'green');
logger.log('ok', ' Created and started ✓');
} else {
helpers.printMessage(' Failed to create container', 'red');
logger.log('error', ' Failed to create container');
}
break;
}
helpers.printMessage(` Container: ${containers.mongo}`, 'cyan');
helpers.printMessage(` Port: ${config.MONGODB_PORT}`, 'cyan');
helpers.printMessage(` Connection: ${this.config.getMongoConnectionString()}`, 'blue');
logger.log('info', ` Container: ${containers.mongo}`);
logger.log('info', ` Port: ${config.MONGODB_PORT}`);
logger.log('info', ` Connection: ${this.config.getMongoConnectionString()}`);
// Show Compass connection string
const networkIp = await helpers.getLocalNetworkIp();
const compassString = `mongodb://${config.MONGODB_USER}:${config.MONGODB_PASS}@${networkIp}:${config.MONGODB_PORT}/${config.MONGODB_NAME}?authSource=admin`;
logger.log('ok', ` Compass: ${compassString}`);
}
/**
* Start MinIO service
*/
public async startMinIO(): Promise<void> {
helpers.printMessage('📦 S3/MinIO:', 'yellow');
logger.log('note', '📦 S3/MinIO:');
const config = this.config.getConfig();
const containers = this.config.getContainerNames();
@@ -105,19 +111,19 @@ export class ServiceManager {
switch (status) {
case 'running':
helpers.printMessage(' Already running ✓', 'green');
logger.log('ok', ' Already running ✓');
break;
case 'stopped':
if (await this.docker.start(containers.minio)) {
helpers.printMessage(' Started ✓', 'green');
logger.log('ok', ' Started ✓');
} else {
helpers.printMessage(' Failed to start', 'red');
logger.log('error', ' Failed to start');
}
break;
case 'not_exists':
helpers.printMessage(' Creating container...', 'yellow');
logger.log('note', ' Creating container...');
const success = await this.docker.run({
name: containers.minio,
@@ -138,7 +144,7 @@ export class ServiceManager {
});
if (success) {
helpers.printMessage(' Created and started ✓', 'green');
logger.log('ok', ' Created and started ✓');
// Wait for MinIO to be ready
await plugins.smartdelay.delayFor(3000);
@@ -154,37 +160,37 @@ export class ServiceManager {
`mc mb local/${config.S3_BUCKET}`
);
helpers.printMessage(` Bucket '${config.S3_BUCKET}' created ✓`, 'green');
logger.log('ok', ` Bucket '${config.S3_BUCKET}' created ✓`);
} else {
helpers.printMessage(' Failed to create container', 'red');
logger.log('error', ' Failed to create container');
}
break;
}
helpers.printMessage(` Container: ${containers.minio}`, 'cyan');
helpers.printMessage(` Port: ${config.S3_PORT}`, 'cyan');
helpers.printMessage(` Bucket: ${config.S3_BUCKET}`, 'cyan');
helpers.printMessage(` API: http://${config.S3_HOST}:${config.S3_PORT}`, 'blue');
helpers.printMessage(` Console: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT} (login: ${config.S3_USER}/***)`, 'blue');
logger.log('info', ` Container: ${containers.minio}`);
logger.log('info', ` Port: ${config.S3_PORT}`);
logger.log('info', ` Bucket: ${config.S3_BUCKET}`);
logger.log('info', ` API: http://${config.S3_HOST}:${config.S3_PORT}`);
logger.log('info', ` Console: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT} (login: ${config.S3_USER}/***)`);
}
/**
* Stop MongoDB service
*/
public async stopMongoDB(): Promise<void> {
helpers.printMessage('📦 MongoDB:', 'yellow');
logger.log('note', '📦 MongoDB:');
const containers = this.config.getContainerNames();
const status = await this.docker.getStatus(containers.mongo);
if (status === 'running') {
if (await this.docker.stop(containers.mongo)) {
helpers.printMessage(' Stopped ✓', 'green');
logger.log('ok', ' Stopped ✓');
} else {
helpers.printMessage(' Failed to stop', 'red');
logger.log('error', ' Failed to stop');
}
} else {
helpers.printMessage(' Not running', 'yellow');
logger.log('note', ' Not running');
}
}
@@ -192,19 +198,19 @@ export class ServiceManager {
* Stop MinIO service
*/
public async stopMinIO(): Promise<void> {
helpers.printMessage('📦 S3/MinIO:', 'yellow');
logger.log('note', '📦 S3/MinIO:');
const containers = this.config.getContainerNames();
const status = await this.docker.getStatus(containers.minio);
if (status === 'running') {
if (await this.docker.stop(containers.minio)) {
helpers.printMessage(' Stopped ✓', 'green');
logger.log('ok', ' Stopped ✓');
} else {
helpers.printMessage(' Failed to stop', 'red');
logger.log('error', ' Failed to stop');
}
} else {
helpers.printMessage(' Not running', 'yellow');
logger.log('note', ' Not running');
}
}
@@ -217,23 +223,28 @@ export class ServiceManager {
const config = this.config.getConfig();
const containers = this.config.getContainerNames();
helpers.printMessage(`Project: ${config.PROJECT_NAME}`, 'magenta');
logger.log('info', `Project: ${config.PROJECT_NAME}`);
console.log();
// MongoDB status
const mongoStatus = await this.docker.getStatus(containers.mongo);
switch (mongoStatus) {
case 'running':
helpers.printMessage('📦 MongoDB: 🟢 Running', 'green');
helpers.printMessage(` ├─ Container: ${containers.mongo}`, 'cyan');
helpers.printMessage(` └─ ${this.config.getMongoConnectionString()}`, 'cyan');
logger.log('ok', '📦 MongoDB: 🟢 Running');
logger.log('info', ` ├─ Container: ${containers.mongo}`);
logger.log('info', ` ├─ Connection: ${this.config.getMongoConnectionString()}`);
// Show Compass connection string
const networkIp = await helpers.getLocalNetworkIp();
const compassString = `mongodb://${config.MONGODB_USER}:${config.MONGODB_PASS}@${networkIp}:${config.MONGODB_PORT}/${config.MONGODB_NAME}?authSource=admin`;
logger.log('ok', ` └─ Compass: ${compassString}`);
break;
case 'stopped':
helpers.printMessage('📦 MongoDB: 🟡 Stopped', 'yellow');
helpers.printMessage(` └─ Container: ${containers.mongo}`, 'cyan');
logger.log('note', '📦 MongoDB: 🟡 Stopped');
logger.log('info', ` └─ Container: ${containers.mongo}`);
break;
case 'not_exists':
helpers.printMessage('📦 MongoDB: ⚪ Not installed', 'magenta');
logger.log('info', '📦 MongoDB: ⚪ Not installed');
break;
}
@@ -241,18 +252,18 @@ export class ServiceManager {
const minioStatus = await this.docker.getStatus(containers.minio);
switch (minioStatus) {
case 'running':
helpers.printMessage('📦 S3/MinIO: 🟢 Running', 'green');
helpers.printMessage(` ├─ Container: ${containers.minio}`, 'cyan');
helpers.printMessage(` ├─ API: http://${config.S3_HOST}:${config.S3_PORT}`, 'cyan');
helpers.printMessage(` ├─ Console: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT}`, 'cyan');
helpers.printMessage(` └─ Bucket: ${config.S3_BUCKET}`, 'cyan');
logger.log('ok', '📦 S3/MinIO: 🟢 Running');
logger.log('info', ` ├─ Container: ${containers.minio}`);
logger.log('info', ` ├─ API: http://${config.S3_HOST}:${config.S3_PORT}`);
logger.log('info', ` ├─ Console: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT}`);
logger.log('info', ` └─ Bucket: ${config.S3_BUCKET}`);
break;
case 'stopped':
helpers.printMessage('📦 S3/MinIO: 🟡 Stopped', 'yellow');
helpers.printMessage(` └─ Container: ${containers.minio}`, 'cyan');
logger.log('note', '📦 S3/MinIO: 🟡 Stopped');
logger.log('info', ` └─ Container: ${containers.minio}`);
break;
case 'not_exists':
helpers.printMessage('📦 S3/MinIO: ⚪ Not installed', 'magenta');
logger.log('info', '📦 S3/MinIO: ⚪ Not installed');
break;
}
}
@@ -265,30 +276,30 @@ export class ServiceManager {
const config = this.config.getConfig();
helpers.printMessage(`Project: ${config.PROJECT_NAME}`, 'magenta');
logger.log('info', `Project: ${config.PROJECT_NAME}`);
console.log();
helpers.printMessage('MongoDB:', 'yellow');
helpers.printMessage(` Host: ${config.MONGODB_HOST}:${config.MONGODB_PORT}`, undefined);
helpers.printMessage(` Database: ${config.MONGODB_NAME}`, undefined);
helpers.printMessage(` User: ${config.MONGODB_USER}`, undefined);
helpers.printMessage(' Password: ***', undefined);
helpers.printMessage(` Container: ${this.config.getContainerNames().mongo}`, undefined);
helpers.printMessage(` Data: ${this.config.getDataDirectories().mongo}`, undefined);
helpers.printMessage(` Connection: ${this.config.getMongoConnectionString()}`, 'blue');
logger.log('note', 'MongoDB:');
logger.log('info', ` Host: ${config.MONGODB_HOST}:${config.MONGODB_PORT}`);
logger.log('info', ` Database: ${config.MONGODB_NAME}`);
logger.log('info', ` User: ${config.MONGODB_USER}`);
logger.log('info', ' Password: ***');
logger.log('info', ` Container: ${this.config.getContainerNames().mongo}`);
logger.log('info', ` Data: ${this.config.getDataDirectories().mongo}`);
logger.log('info', ` Connection: ${this.config.getMongoConnectionString()}`);
console.log();
helpers.printMessage('S3/MinIO:', 'yellow');
helpers.printMessage(` Host: ${config.S3_HOST}`, undefined);
helpers.printMessage(` API Port: ${config.S3_PORT}`, undefined);
helpers.printMessage(` Console Port: ${config.S3_CONSOLE_PORT}`, undefined);
helpers.printMessage(` User: ${config.S3_USER}`, undefined);
helpers.printMessage(' Password: ***', undefined);
helpers.printMessage(` Bucket: ${config.S3_BUCKET}`, undefined);
helpers.printMessage(` Container: ${this.config.getContainerNames().minio}`, undefined);
helpers.printMessage(` Data: ${this.config.getDataDirectories().minio}`, undefined);
helpers.printMessage(` API URL: http://${config.S3_HOST}:${config.S3_PORT}`, 'blue');
helpers.printMessage(` Console URL: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT}`, 'blue');
logger.log('note', 'S3/MinIO:');
logger.log('info', ` Host: ${config.S3_HOST}`);
logger.log('info', ` API Port: ${config.S3_PORT}`);
logger.log('info', ` Console Port: ${config.S3_CONSOLE_PORT}`);
logger.log('info', ` User: ${config.S3_USER}`);
logger.log('info', ' Password: ***');
logger.log('info', ` Bucket: ${config.S3_BUCKET}`);
logger.log('info', ` Container: ${this.config.getContainerNames().minio}`);
logger.log('info', ` Data: ${this.config.getDataDirectories().minio}`);
logger.log('info', ` API URL: http://${config.S3_HOST}:${config.S3_PORT}`);
logger.log('info', ` Console URL: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT}`);
}
/**
@@ -302,20 +313,20 @@ export class ServiceManager {
const connectionString = `mongodb://${config.MONGODB_USER}:${config.MONGODB_PASS}@${networkIp}:${config.MONGODB_PORT}/${config.MONGODB_NAME}?authSource=admin`;
helpers.printMessage('MongoDB Compass is a GUI tool for MongoDB. To connect:', 'cyan');
logger.log('info', 'MongoDB Compass is a GUI tool for MongoDB. To connect:');
console.log();
helpers.printMessage('1. Download MongoDB Compass from:', undefined);
helpers.printMessage(' https://www.mongodb.com/products/compass', 'blue');
logger.log('info', '1. Download MongoDB Compass from:');
logger.log('info', ' https://www.mongodb.com/products/compass');
console.log();
helpers.printMessage('2. Open Compass and paste this connection string:', undefined);
helpers.printMessage(` ${connectionString}`, 'green');
logger.log('info', '2. Open Compass and paste this connection string:');
logger.log('ok', ` ${connectionString}`);
console.log();
helpers.printMessage('Connection Details:', 'yellow');
helpers.printMessage(` Network IP: ${networkIp}`, undefined);
helpers.printMessage(` Port: ${config.MONGODB_PORT}`, undefined);
helpers.printMessage(` Database: ${config.MONGODB_NAME}`, undefined);
helpers.printMessage(` Username: ${config.MONGODB_USER}`, undefined);
helpers.printMessage(` Auth Source: admin`, undefined);
logger.log('note', 'Connection Details:');
logger.log('info', ` Network IP: ${networkIp}`);
logger.log('info', ` Port: ${config.MONGODB_PORT}`);
logger.log('info', ` Database: ${config.MONGODB_NAME}`);
logger.log('info', ` Username: ${config.MONGODB_USER}`);
logger.log('info', ` Auth Source: admin`);
}
/**
@@ -332,7 +343,7 @@ export class ServiceManager {
const logs = await this.docker.logs(containers.mongo, lines);
console.log(logs);
} else {
helpers.printMessage('MongoDB container is not running', 'yellow');
logger.log('note', 'MongoDB container is not running');
}
break;
@@ -343,7 +354,7 @@ export class ServiceManager {
const logs = await this.docker.logs(containers.minio, lines);
console.log(logs);
} else {
helpers.printMessage('S3/MinIO container is not running', 'yellow');
logger.log('note', 'S3/MinIO container is not running');
}
break;
@@ -355,7 +366,7 @@ export class ServiceManager {
break;
default:
helpers.printMessage('Usage: gitzone services logs [mongo|s3|all] [lines]', 'yellow');
logger.log('note', 'Usage: gitzone services logs [mongo|s3|all] [lines]');
break;
}
}
@@ -369,20 +380,20 @@ export class ServiceManager {
if (await this.docker.exists(containers.mongo)) {
if (await this.docker.remove(containers.mongo, true)) {
helpers.printMessage(' MongoDB container removed ✓', 'green');
logger.log('ok', ' MongoDB container removed ✓');
removed = true;
}
}
if (await this.docker.exists(containers.minio)) {
if (await this.docker.remove(containers.minio, true)) {
helpers.printMessage(' S3/MinIO container removed ✓', 'green');
logger.log('ok', ' S3/MinIO container removed ✓');
removed = true;
}
}
if (!removed) {
helpers.printMessage(' No containers to remove', 'yellow');
logger.log('note', ' No containers to remove');
}
}
@@ -395,18 +406,18 @@ export class ServiceManager {
if (await plugins.smartfile.fs.fileExists(directories.mongo)) {
await plugins.smartfile.fs.remove(directories.mongo);
helpers.printMessage(' MongoDB data removed ✓', 'green');
logger.log('ok', ' MongoDB data removed ✓');
cleaned = true;
}
if (await plugins.smartfile.fs.fileExists(directories.minio)) {
await plugins.smartfile.fs.remove(directories.minio);
helpers.printMessage(' S3/MinIO data removed ✓', 'green');
logger.log('ok', ' S3/MinIO data removed ✓');
cleaned = true;
}
if (!cleaned) {
helpers.printMessage(' No data to clean', 'yellow');
logger.log('note', ' No data to clean');
}
}
}
}