feat(cluster): add cluster configuration support across server, CLI, and admin UI
This commit is contained in:
@@ -39,6 +39,37 @@ export class ObjectStorageContainer {
|
||||
const envRegion = Deno.env.get('OBJST_REGION');
|
||||
if (envRegion) this.config.region = envRegion;
|
||||
|
||||
// Cluster environment variables
|
||||
const envClusterEnabled = Deno.env.get('OBJST_CLUSTER_ENABLED');
|
||||
if (envClusterEnabled) this.config.clusterEnabled = envClusterEnabled === 'true' || envClusterEnabled === '1';
|
||||
|
||||
const envClusterNodeId = Deno.env.get('OBJST_CLUSTER_NODE_ID');
|
||||
if (envClusterNodeId) this.config.clusterNodeId = envClusterNodeId;
|
||||
|
||||
const envClusterQuicPort = Deno.env.get('OBJST_CLUSTER_QUIC_PORT');
|
||||
if (envClusterQuicPort) this.config.clusterQuicPort = parseInt(envClusterQuicPort, 10);
|
||||
|
||||
const envClusterSeedNodes = Deno.env.get('OBJST_CLUSTER_SEED_NODES');
|
||||
if (envClusterSeedNodes) this.config.clusterSeedNodes = envClusterSeedNodes.split(',').map(s => s.trim()).filter(Boolean);
|
||||
|
||||
const envDrivePaths = Deno.env.get('OBJST_DRIVE_PATHS');
|
||||
if (envDrivePaths) this.config.drivePaths = envDrivePaths.split(',').map(s => s.trim()).filter(Boolean);
|
||||
|
||||
const envErasureDataShards = Deno.env.get('OBJST_ERASURE_DATA_SHARDS');
|
||||
if (envErasureDataShards) this.config.erasureDataShards = parseInt(envErasureDataShards, 10);
|
||||
|
||||
const envErasureParityShards = Deno.env.get('OBJST_ERASURE_PARITY_SHARDS');
|
||||
if (envErasureParityShards) this.config.erasureParityShards = parseInt(envErasureParityShards, 10);
|
||||
|
||||
const envErasureChunkSize = Deno.env.get('OBJST_ERASURE_CHUNK_SIZE');
|
||||
if (envErasureChunkSize) this.config.erasureChunkSizeBytes = parseInt(envErasureChunkSize, 10);
|
||||
|
||||
const envHeartbeatInterval = Deno.env.get('OBJST_HEARTBEAT_INTERVAL_MS');
|
||||
if (envHeartbeatInterval) this.config.clusterHeartbeatIntervalMs = parseInt(envHeartbeatInterval, 10);
|
||||
|
||||
const envHeartbeatTimeout = Deno.env.get('OBJST_HEARTBEAT_TIMEOUT_MS');
|
||||
if (envHeartbeatTimeout) this.config.clusterHeartbeatTimeoutMs = parseInt(envHeartbeatTimeout, 10);
|
||||
|
||||
this.opsServer = new OpsServer(this);
|
||||
this.policyManager = new PolicyManager(this);
|
||||
}
|
||||
@@ -49,9 +80,17 @@ export class ObjectStorageContainer {
|
||||
console.log(` UI port: ${this.config.uiPort}`);
|
||||
console.log(` Storage: ${this.config.storageDirectory}`);
|
||||
console.log(` Region: ${this.config.region}`);
|
||||
console.log(` Cluster: ${this.config.clusterEnabled ? 'enabled' : 'disabled'}`);
|
||||
if (this.config.clusterEnabled) {
|
||||
console.log(` Node ID: ${this.config.clusterNodeId || '(auto-generated)'}`);
|
||||
console.log(` QUIC Port: ${this.config.clusterQuicPort}`);
|
||||
console.log(` Seed Nodes: ${this.config.clusterSeedNodes.join(', ') || '(none)'}`);
|
||||
console.log(` Drives: ${this.config.drivePaths.length > 0 ? this.config.drivePaths.join(', ') : this.config.storageDirectory}`);
|
||||
console.log(` Erasure: ${this.config.erasureDataShards}+${this.config.erasureParityShards}`);
|
||||
}
|
||||
|
||||
// Start smartstorage
|
||||
this.smartstorageInstance = await plugins.smartstorage.SmartStorage.createAndStart({
|
||||
// Build smartstorage config
|
||||
const smartstorageConfig: any = {
|
||||
server: {
|
||||
port: this.config.objstPort,
|
||||
address: '0.0.0.0',
|
||||
@@ -64,7 +103,31 @@ export class ObjectStorageContainer {
|
||||
enabled: true,
|
||||
credentials: this.config.accessCredentials,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
if (this.config.clusterEnabled) {
|
||||
smartstorageConfig.cluster = {
|
||||
enabled: true,
|
||||
nodeId: this.config.clusterNodeId || crypto.randomUUID().slice(0, 8),
|
||||
quicPort: this.config.clusterQuicPort,
|
||||
seedNodes: this.config.clusterSeedNodes,
|
||||
erasure: {
|
||||
dataShards: this.config.erasureDataShards,
|
||||
parityShards: this.config.erasureParityShards,
|
||||
chunkSizeBytes: this.config.erasureChunkSizeBytes,
|
||||
},
|
||||
drives: {
|
||||
paths: this.config.drivePaths.length > 0
|
||||
? this.config.drivePaths
|
||||
: [this.config.storageDirectory],
|
||||
},
|
||||
heartbeatIntervalMs: this.config.clusterHeartbeatIntervalMs,
|
||||
heartbeatTimeoutMs: this.config.clusterHeartbeatTimeoutMs,
|
||||
};
|
||||
}
|
||||
|
||||
// Start smartstorage
|
||||
this.smartstorageInstance = await plugins.smartstorage.SmartStorage.createAndStart(smartstorageConfig);
|
||||
|
||||
this.startedAt = Date.now();
|
||||
console.log(`Storage server started on port ${this.config.objstPort}`);
|
||||
|
||||
Reference in New Issue
Block a user