@git.zone/cli 3.2.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/.smartconfig.json +0 -1
  2. package/dist_ts/00_commitinfo_data.js +2 -2
  3. package/dist_ts/classes.gitzoneconfig.js +1 -1
  4. package/dist_ts/classes.project.js +1 -1
  5. package/dist_ts/gitzone.cli.js +1 -1
  6. package/dist_ts/gitzone.logging.js +1 -1
  7. package/dist_ts/helpers.changelog.js +1 -1
  8. package/dist_ts/helpers.climode.js +1 -1
  9. package/dist_ts/helpers.smartconfig.js +61 -11
  10. package/dist_ts/helpers.smartconfigmigrations.js +1 -1
  11. package/dist_ts/helpers.tsdocker.js +1 -1
  12. package/dist_ts/helpers.workflow.d.ts +0 -2
  13. package/dist_ts/helpers.workflow.js +23 -12
  14. package/dist_ts/index.js +1 -1
  15. package/dist_ts/mod_audit/index.js +1 -1
  16. package/dist_ts/mod_commit/index.js +1 -1
  17. package/dist_ts/mod_commit/mod.helpers.d.ts +3 -3
  18. package/dist_ts/mod_commit/mod.helpers.js +10 -10
  19. package/dist_ts/mod_commit/mod.plugins.js +1 -1
  20. package/dist_ts/mod_commit/mod.ui.js +1 -1
  21. package/dist_ts/mod_config/classes.commitconfig.js +1 -1
  22. package/dist_ts/mod_config/classes.releaseconfig.js +1 -1
  23. package/dist_ts/mod_config/index.js +23 -24
  24. package/dist_ts/mod_config/mod.plugins.js +1 -1
  25. package/dist_ts/mod_deprecate/index.js +1 -1
  26. package/dist_ts/mod_deprecate/mod.plugins.js +1 -1
  27. package/dist_ts/mod_docker/classes.dockerpruner.js +7 -1
  28. package/dist_ts/mod_docker/index.js +1 -1
  29. package/dist_ts/mod_docker/mod.plugins.js +1 -1
  30. package/dist_ts/mod_format/classes.baseformatter.js +1 -1
  31. package/dist_ts/mod_format/classes.diffreporter.js +1 -1
  32. package/dist_ts/mod_format/classes.formatcontext.js +1 -1
  33. package/dist_ts/mod_format/classes.formatplanner.js +1 -1
  34. package/dist_ts/mod_format/classes.formatstats.js +1 -1
  35. package/dist_ts/mod_format/formatters/assets.formatter.js +1 -1
  36. package/dist_ts/mod_format/formatters/cleanup.formatter.js +1 -1
  37. package/dist_ts/mod_format/formatters/copy.formatter.js +1 -1
  38. package/dist_ts/mod_format/formatters/gitignore.formatter.js +1 -1
  39. package/dist_ts/mod_format/formatters/license.formatter.js +1 -1
  40. package/dist_ts/mod_format/formatters/packagejson.formatter.js +1 -1
  41. package/dist_ts/mod_format/formatters/prettier.formatter.js +1 -1
  42. package/dist_ts/mod_format/formatters/readme.formatter.js +1 -1
  43. package/dist_ts/mod_format/formatters/smartconfig.formatter.js +1 -1
  44. package/dist_ts/mod_format/formatters/templates.formatter.js +1 -1
  45. package/dist_ts/mod_format/formatters/tsconfig.formatter.js +1 -1
  46. package/dist_ts/mod_format/index.js +1 -1
  47. package/dist_ts/mod_format/interfaces.format.js +1 -1
  48. package/dist_ts/mod_format/mod.plugins.js +1 -1
  49. package/dist_ts/mod_helpers/index.js +1 -1
  50. package/dist_ts/mod_helpers/mod.plugins.js +1 -1
  51. package/dist_ts/mod_meta/index.js +1 -1
  52. package/dist_ts/mod_meta/meta.classes.meta.js +1 -1
  53. package/dist_ts/mod_meta/meta.interfaces.js +1 -1
  54. package/dist_ts/mod_meta/meta.plugins.js +1 -1
  55. package/dist_ts/mod_open/index.js +1 -1
  56. package/dist_ts/mod_open/mod.plugins.js +1 -1
  57. package/dist_ts/mod_release/helpers.releasebranch.d.ts +46 -0
  58. package/dist_ts/mod_release/helpers.releasebranch.js +579 -0
  59. package/dist_ts/mod_release/index.d.ts +10 -0
  60. package/dist_ts/mod_release/index.js +300 -92
  61. package/dist_ts/mod_release/mod.plugins.js +1 -1
  62. package/dist_ts/mod_services/classes.dockercontainer.d.ts +50 -3
  63. package/dist_ts/mod_services/classes.dockercontainer.js +646 -84
  64. package/dist_ts/mod_services/classes.globalregistry.d.ts +10 -24
  65. package/dist_ts/mod_services/classes.globalregistry.js +210 -62
  66. package/dist_ts/mod_services/classes.globalregistrystore.d.ts +48 -0
  67. package/dist_ts/mod_services/classes.globalregistrystore.js +156 -0
  68. package/dist_ts/mod_services/classes.interprocesslock.d.ts +21 -0
  69. package/dist_ts/mod_services/classes.interprocesslock.js +141 -0
  70. package/dist_ts/mod_services/classes.serviceconfiguration.d.ts +15 -12
  71. package/dist_ts/mod_services/classes.serviceconfiguration.js +188 -91
  72. package/dist_ts/mod_services/classes.servicedatamarker.d.ts +32 -7
  73. package/dist_ts/mod_services/classes.servicedatamarker.js +145 -49
  74. package/dist_ts/mod_services/classes.servicemanager.d.ts +70 -28
  75. package/dist_ts/mod_services/classes.servicemanager.js +995 -421
  76. package/dist_ts/mod_services/classes.servicenames.d.ts +8 -0
  77. package/dist_ts/mod_services/classes.servicenames.js +54 -0
  78. package/dist_ts/mod_services/classes.serviceoptions.js +1 -1
  79. package/dist_ts/mod_services/classes.servicepruner.d.ts +3 -0
  80. package/dist_ts/mod_services/classes.servicepruner.js +208 -46
  81. package/dist_ts/mod_services/helpers.js +1 -1
  82. package/dist_ts/mod_services/index.d.ts +2 -0
  83. package/dist_ts/mod_services/index.js +81 -58
  84. package/dist_ts/mod_services/mod.plugins.js +1 -1
  85. package/dist_ts/mod_standard/index.js +2 -2
  86. package/dist_ts/mod_standard/mod.plugins.js +1 -1
  87. package/dist_ts/mod_start/index.js +1 -1
  88. package/dist_ts/mod_start/mod.plugins.js +1 -1
  89. package/dist_ts/mod_template/index.js +1 -1
  90. package/dist_ts/mod_template/mod.plugins.js +1 -1
  91. package/dist_ts/mod_tools/classes.packagemanager.js +1 -1
  92. package/dist_ts/mod_tools/index.js +1 -1
  93. package/dist_ts/mod_tools/mod.plugins.js +1 -1
  94. package/dist_ts/paths.js +1 -1
  95. package/dist_ts/plugins.d.ts +3 -1
  96. package/dist_ts/plugins.js +4 -2
  97. package/dist_ts_migration/001.service-selection.d.ts +9 -0
  98. package/dist_ts_migration/001.service-selection.js +51 -0
  99. package/dist_ts_migration/002.runtime-config.d.ts +19 -0
  100. package/dist_ts_migration/002.runtime-config.js +170 -0
  101. package/dist_ts_migration/003.service-data-marker.d.ts +9 -0
  102. package/dist_ts_migration/003.service-data-marker.js +156 -0
  103. package/dist_ts_migration/004.global-registry.d.ts +13 -0
  104. package/dist_ts_migration/004.global-registry.js +165 -0
  105. package/dist_ts_migration/index.d.ts +11 -0
  106. package/dist_ts_migration/index.js +59 -0
  107. package/package.json +6 -3
  108. package/readme.hints.md +102 -25
  109. package/readme.md +144 -41
  110. package/readme.plan.md +29 -16
  111. package/ts/00_commitinfo_data.ts +1 -1
  112. package/ts/helpers.smartconfig.ts +63 -10
  113. package/ts/helpers.workflow.ts +41 -12
  114. package/ts/mod_commit/mod.helpers.ts +12 -8
  115. package/ts/mod_config/index.ts +22 -23
  116. package/ts/mod_docker/classes.dockerpruner.ts +6 -0
  117. package/ts/mod_release/helpers.releasebranch.ts +1282 -0
  118. package/ts/mod_release/index.ts +608 -129
  119. package/ts/mod_services/classes.dockercontainer.ts +912 -96
  120. package/ts/mod_services/classes.globalregistry.ts +290 -89
  121. package/ts/mod_services/classes.globalregistrystore.ts +279 -0
  122. package/ts/mod_services/classes.interprocesslock.ts +189 -0
  123. package/ts/mod_services/classes.serviceconfiguration.ts +215 -108
  124. package/ts/mod_services/classes.servicedatamarker.ts +210 -52
  125. package/ts/mod_services/classes.servicemanager.ts +1332 -512
  126. package/ts/mod_services/classes.servicenames.ts +76 -0
  127. package/ts/mod_services/classes.servicepruner.ts +310 -52
  128. package/ts/mod_services/index.ts +89 -62
  129. package/ts/mod_standard/index.ts +1 -1
  130. package/ts/plugins.ts +4 -0
  131. package/ts_migration/001.service-selection.ts +77 -0
  132. package/ts_migration/002.runtime-config.ts +218 -0
  133. package/ts_migration/003.service-data-marker.ts +216 -0
  134. package/ts_migration/004.global-registry.ts +272 -0
  135. package/ts_migration/index.ts +83 -0
@@ -3,191 +3,339 @@ import * as helpers from './helpers.js';
3
3
  import { ServiceConfiguration, getS3BucketNameValidationError, } from './classes.serviceconfiguration.js';
4
4
  import { DockerContainer, matchDockerUlimits, } from './classes.dockercontainer.js';
5
5
  import { GlobalRegistry } from './classes.globalregistry.js';
6
- import { getServiceContainerLabels, recordServiceDataDirectory, serviceImages, } from './classes.servicedatamarker.js';
6
+ import { getLegacyMinioDataDirectory, getServiceContainerLabels, getServiceDataDirectory, hasExactServiceContainerLabels, markerProvesServiceDataDirectory, objectStorageImage, readServiceDataMarker, recordServiceDataDirectory, serviceBindOperation, serviceImages, serviceNames, serviceOperationLabel, serviceToolLabel, } from './classes.servicedatamarker.js';
7
+ import { readPersistedServiceConfiguration } from './classes.servicenames.js';
8
+ import { withServiceDataOperationLock } from './classes.interprocesslock.js';
9
+ import { runServiceMigrations, } from '../../dist_ts_migration/index.js';
7
10
  import { logger } from '../gitzone.logging.js';
11
+ import { readSmartconfigFile, setCliConfigValueInData, writeSmartconfigFile, } from '../helpers.smartconfig.js';
12
+ export const getServiceManagerMigrationScopes = (operationArg) => [
13
+ 'global-registry',
14
+ 'service-selection',
15
+ 'runtime-config',
16
+ ...(['start', 'restart', 'reconfigure', 'clean'].includes(operationArg)
17
+ ? ['service-data-marker']
18
+ : []),
19
+ ];
8
20
  export const mongoServiceUlimits = {
9
21
  nofile: {
10
22
  soft: 65_536,
11
23
  hard: 65_536,
12
24
  },
13
25
  };
14
- export const minioReconciliationTimeoutMs = 30_000;
15
- const minioProbeTimeoutCapMs = 2_000;
16
- const minioProbeIntervalMs = 250;
17
- const minioRollbackTimeoutMs = 5_000;
18
- const minioAlias = 'gitzone-local';
19
- const minioAliasSetupScript = 'mc alias set gitzone-local http://127.0.0.1:9000 "$MINIO_ROOT_USER" "$MINIO_ROOT_PASSWORD" >/dev/null';
20
- const defaultMinioClock = {
26
+ export const objectStorageReconciliationTimeoutMs = 30_000;
27
+ const objectStorageProbeTimeoutCapMs = 2_000;
28
+ const objectStorageProbeIntervalMs = 250;
29
+ const objectStorageRollbackTimeoutMs = 5_000;
30
+ const defaultObjectStorageClock = {
21
31
  now: () => Date.now(),
22
32
  delay: async (millisecondsArg) => plugins.smartdelay.delayFor(millisecondsArg),
23
33
  };
24
- class MinioStageError extends Error {
34
+ class ObjectStorageStageError extends Error {
25
35
  constructor(stageArg, timedOutArg, causeArg) {
26
36
  const message = timedOutArg
27
- ? `MinIO ${stageArg} did not complete before the shared reconciliation deadline.`
28
- : `MinIO ${stageArg} failed.`;
37
+ ? `ObjectStorage ${stageArg} did not complete before the shared reconciliation deadline.`
38
+ : `ObjectStorage ${stageArg} failed.`;
29
39
  super(message, causeArg === undefined ? undefined : { cause: causeArg });
30
- this.name = 'MinioStageError';
40
+ this.name = 'ObjectStorageStageError';
31
41
  }
32
42
  }
33
- const minioStageError = (stageArg, timedOutArg, causeArg) => {
34
- return new MinioStageError(stageArg, timedOutArg, causeArg);
43
+ const objectStorageStageError = (stageArg, timedOutArg, causeArg) => {
44
+ return new ObjectStorageStageError(stageArg, timedOutArg, causeArg);
35
45
  };
36
- const minioStageCause = (errorArg) => {
37
- if (errorArg instanceof MinioStageError && errorArg.cause !== undefined) {
38
- return errorArg.cause;
39
- }
40
- return errorArg;
41
- };
42
- const normalizeMinioLifecycleError = (errorArg) => {
46
+ const normalizeObjectStorageLifecycleError = (errorArg) => {
43
47
  return errorArg instanceof Error
44
48
  ? errorArg
45
- : new Error('MinIO lifecycle failed with a non-Error rejection.');
49
+ : new Error('ObjectStorage lifecycle failed with a non-Error rejection.');
46
50
  };
47
51
  const isUnknownRecord = (valueArg) => {
48
52
  return typeof valueArg === 'object' && valueArg !== null && !Array.isArray(valueArg);
49
53
  };
50
- const parseMinioInspection = (stdoutArg, expectedContainerNameArg) => {
54
+ export const objectStorageExpectedEntrypoint = ['/usr/bin/tini', '--'];
55
+ export const objectStorageExpectedCommand = [
56
+ 'deno',
57
+ 'run',
58
+ '--allow-all',
59
+ 'mod.ts',
60
+ 'server',
61
+ ];
62
+ export const objectStorageExpectedHealthcheck = {
63
+ test: [
64
+ 'CMD-SHELL',
65
+ `deno eval "const response = await fetch('http://127.0.0.1:3000/readyz'); Deno.exit(response.ok ? 0 : 1);"`,
66
+ ],
67
+ interval: 30_000_000_000,
68
+ timeout: 5_000_000_000,
69
+ startPeriod: 10_000_000_000,
70
+ retries: 3,
71
+ };
72
+ const parseObjectStorageIdentity = (stdoutArg, expectedContainerNameArg) => {
51
73
  let parsed;
52
74
  try {
53
75
  parsed = JSON.parse(stdoutArg);
54
76
  }
55
77
  catch {
56
- throw new Error(`Docker returned an invalid MinIO inspection for ${expectedContainerNameArg}.`);
78
+ throw new Error(`Docker returned an invalid ObjectStorage identity for ${expectedContainerNameArg}.`);
57
79
  }
58
80
  if (!Array.isArray(parsed) || parsed.length !== 1 || !isUnknownRecord(parsed[0])) {
59
- throw new Error(`Docker returned an invalid MinIO inspection for ${expectedContainerNameArg}.`);
81
+ throw new Error(`Docker returned an invalid ObjectStorage identity for ${expectedContainerNameArg}.`);
82
+ }
83
+ const inspected = parsed[0];
84
+ const state = inspected.State;
85
+ const config = inspected.Config;
86
+ const normalizedName = typeof inspected.Name === 'string' ? inspected.Name.replace(/^\//u, '') : undefined;
87
+ if (typeof inspected.Id !== 'string' ||
88
+ !/^[a-f0-9]{64}$/u.test(inspected.Id) ||
89
+ normalizedName !== expectedContainerNameArg ||
90
+ !isUnknownRecord(state) ||
91
+ typeof state.Running !== 'boolean' ||
92
+ typeof state.Status !== 'string' ||
93
+ !isUnknownRecord(config) ||
94
+ (config.Labels !== null && config.Labels !== undefined && !isUnknownRecord(config.Labels))) {
95
+ throw new Error(`Docker returned an invalid ObjectStorage identity for ${expectedContainerNameArg}.`);
96
+ }
97
+ const labels = {};
98
+ for (const [keyArg, valueArg] of Object.entries(config.Labels || {})) {
99
+ if (typeof valueArg !== 'string') {
100
+ throw new Error(`Docker returned an invalid ObjectStorage identity for ${expectedContainerNameArg}.`);
101
+ }
102
+ labels[keyArg] = valueArg;
103
+ }
104
+ return {
105
+ id: inspected.Id,
106
+ name: normalizedName,
107
+ running: state.Running,
108
+ status: state.Status,
109
+ labels,
110
+ };
111
+ };
112
+ const parseObjectStorageInspection = (stdoutArg, expectedContainerNameArg) => {
113
+ let parsed;
114
+ try {
115
+ parsed = JSON.parse(stdoutArg);
116
+ }
117
+ catch {
118
+ throw new Error(`Docker returned an invalid ObjectStorage inspection for ${expectedContainerNameArg}.`);
119
+ }
120
+ if (!Array.isArray(parsed) || parsed.length !== 1 || !isUnknownRecord(parsed[0])) {
121
+ throw new Error(`Docker returned an invalid ObjectStorage inspection for ${expectedContainerNameArg}.`);
60
122
  }
61
123
  const inspected = parsed[0];
62
124
  const state = inspected.State;
63
125
  const config = inspected.Config;
64
126
  const hostConfig = inspected.HostConfig;
127
+ const healthcheck = isUnknownRecord(config) ? config.Healthcheck : undefined;
128
+ const restartPolicy = isUnknownRecord(hostConfig) ? hostConfig.RestartPolicy : undefined;
65
129
  const normalizedName = typeof inspected.Name === 'string' ? inspected.Name.replace(/^\//u, '') : undefined;
66
130
  if (typeof inspected.Id !== 'string' ||
67
131
  !/^[a-f0-9]{64}$/u.test(inspected.Id) ||
68
132
  normalizedName !== expectedContainerNameArg ||
69
133
  !isUnknownRecord(state) ||
70
134
  typeof state.Running !== 'boolean' ||
135
+ typeof state.Status !== 'string' ||
71
136
  !isUnknownRecord(config) ||
137
+ typeof config.Image !== 'string' ||
138
+ typeof config.User !== 'string' ||
139
+ !Array.isArray(config.Cmd) ||
140
+ !config.Cmd.every((entryArg) => typeof entryArg === 'string') ||
141
+ !Array.isArray(config.Entrypoint) ||
142
+ !config.Entrypoint.every((entryArg) => typeof entryArg === 'string') ||
72
143
  !isUnknownRecord(hostConfig) ||
73
144
  !isUnknownRecord(hostConfig.PortBindings) ||
145
+ !isUnknownRecord(restartPolicy) ||
146
+ typeof restartPolicy.Name !== 'string' ||
74
147
  !Array.isArray(config.Env) ||
75
- !config.Env.every((entryArg) => typeof entryArg === 'string')) {
76
- throw new Error(`Docker returned an invalid MinIO inspection for ${expectedContainerNameArg}.`);
148
+ !config.Env.every((entryArg) => typeof entryArg === 'string') ||
149
+ !isUnknownRecord(config.Labels) ||
150
+ !isUnknownRecord(healthcheck) ||
151
+ !Array.isArray(healthcheck.Test) ||
152
+ !healthcheck.Test.every((entryArg) => typeof entryArg === 'string') ||
153
+ typeof healthcheck.Interval !== 'number' ||
154
+ typeof healthcheck.Timeout !== 'number' ||
155
+ typeof healthcheck.StartPeriod !== 'number' ||
156
+ typeof healthcheck.Retries !== 'number' ||
157
+ !Array.isArray(inspected.Mounts)) {
158
+ throw new Error(`Docker returned an invalid ObjectStorage inspection for ${expectedContainerNameArg}.`);
77
159
  }
78
160
  const labels = {};
79
- if (config.Labels !== null && config.Labels !== undefined) {
80
- if (!isUnknownRecord(config.Labels)) {
81
- throw new Error(`Docker returned an invalid MinIO inspection for ${expectedContainerNameArg}.`);
82
- }
83
- for (const [key, value] of Object.entries(config.Labels)) {
84
- if (typeof value !== 'string') {
85
- throw new Error(`Docker returned an invalid MinIO inspection for ${expectedContainerNameArg}.`);
86
- }
87
- labels[key] = value;
161
+ for (const [key, value] of Object.entries(config.Labels)) {
162
+ if (typeof value !== 'string') {
163
+ throw new Error(`Docker returned an invalid ObjectStorage inspection for ${expectedContainerNameArg}.`);
88
164
  }
165
+ labels[key] = value;
89
166
  }
167
+ const mounts = inspected.Mounts.map((mountArg) => {
168
+ if (!isUnknownRecord(mountArg) ||
169
+ mountArg.Type !== 'bind' ||
170
+ typeof mountArg.Source !== 'string' ||
171
+ typeof mountArg.Destination !== 'string' ||
172
+ typeof mountArg.RW !== 'boolean') {
173
+ throw new Error(`Docker returned an invalid ObjectStorage inspection for ${expectedContainerNameArg}.`);
174
+ }
175
+ return {
176
+ source: plugins.path.resolve(mountArg.Source),
177
+ destination: mountArg.Destination,
178
+ readWrite: mountArg.RW,
179
+ };
180
+ });
90
181
  return {
91
182
  id: inspected.Id,
92
183
  name: normalizedName,
93
184
  running: state.Running,
185
+ status: state.Status,
186
+ image: config.Image,
94
187
  portBindings: hostConfig.PortBindings,
95
188
  environmentEntries: config.Env,
96
189
  labels,
190
+ mounts,
191
+ restartPolicy: restartPolicy.Name,
192
+ command: [...config.Cmd],
193
+ entrypoint: [...config.Entrypoint],
194
+ user: config.User,
195
+ healthcheck: {
196
+ test: [...healthcheck.Test],
197
+ interval: healthcheck.Interval,
198
+ timeout: healthcheck.Timeout,
199
+ startPeriod: healthcheck.StartPeriod,
200
+ retries: healthcheck.Retries,
201
+ },
97
202
  };
98
203
  };
99
- const minioPortMatches = (portBindingsArg, containerPortArg, expectedHostPortArg) => {
204
+ const objectStoragePortMatches = (portBindingsArg, containerPortArg, expectedHostPortArg) => {
100
205
  const bindings = portBindingsArg[containerPortArg];
101
206
  return (Array.isArray(bindings) &&
102
- bindings.some((bindingArg) => isUnknownRecord(bindingArg) && bindingArg.HostPort === expectedHostPortArg));
207
+ bindings.length === 1 &&
208
+ isUnknownRecord(bindings[0]) &&
209
+ bindings[0].HostIp === '127.0.0.1' &&
210
+ bindings[0].HostPort === expectedHostPortArg);
103
211
  };
104
- /** Converge a running MinIO container to an authenticated, verified bucket. */
105
- export const reconcileMinioBucket = async (optionsArg) => {
106
- if (!/^[a-f0-9]{64}$/u.test(optionsArg.containerId)) {
107
- throw new Error('MinIO reconciliation requires a full immutable Docker container id.');
108
- }
109
- const clock = optionsArg.clock || defaultMinioClock;
110
- const deadlineAt = optionsArg.deadlineAt ?? clock.now() + minioReconciliationTimeoutMs;
111
- if (!Number.isFinite(deadlineAt)) {
112
- throw new Error('MinIO reconciliation deadline must be finite');
212
+ const isS3BucketNotFound = (errorArg) => {
213
+ if (!isUnknownRecord(errorArg)) {
214
+ return false;
113
215
  }
216
+ const metadata = errorArg.$metadata;
217
+ return (errorArg.name === 'NoSuchBucket' ||
218
+ errorArg.name === 'NotFound' ||
219
+ (isUnknownRecord(metadata) && metadata.httpStatusCode === 404));
220
+ };
221
+ /** Create the configured bucket only after an authenticated 404, then verify by HEAD. */
222
+ export const reconcileObjectStorageBucket = async (optionsArg) => {
223
+ const clock = optionsArg.clock || defaultObjectStorageClock;
224
+ const deadlineAt = optionsArg.deadlineAt ?? clock.now() + objectStorageReconciliationTimeoutMs;
114
225
  const remainingMs = () => Math.floor(deadlineAt - clock.now());
115
- const execOnce = async (stageArg, argvArg, timeoutCapMsArg) => {
226
+ const sendWithDeadline = async (stageArg, commandArg) => {
116
227
  const remaining = remainingMs();
117
228
  if (remaining <= 0) {
118
- throw minioStageError(stageArg, true);
119
- }
229
+ throw objectStorageStageError(stageArg, true);
230
+ }
231
+ const controller = new AbortController();
232
+ let timedOut = false;
233
+ const timeoutPromise = new Promise((_resolve, reject) => {
234
+ const timer = setTimeout(() => {
235
+ timedOut = true;
236
+ controller.abort();
237
+ reject(objectStorageStageError(stageArg, true));
238
+ }, remaining);
239
+ controller.signal.addEventListener('abort', () => clearTimeout(timer), { once: true });
240
+ });
120
241
  try {
121
- return await optionsArg.docker.execArgv(argvArg, {
122
- timeoutMs: Math.max(1, timeoutCapMsArg === undefined ? remaining : Math.min(timeoutCapMsArg, remaining)),
123
- });
242
+ await Promise.race([
243
+ optionsArg.smartBucket.storageClient.send(commandArg, {
244
+ abortSignal: controller.signal,
245
+ }),
246
+ timeoutPromise,
247
+ ]);
124
248
  }
125
249
  catch (error) {
126
- throw minioStageError(stageArg, remainingMs() <= 0, error);
250
+ if (timedOut || error instanceof ObjectStorageStageError) {
251
+ throw objectStorageStageError(stageArg, true);
252
+ }
253
+ throw error;
254
+ }
255
+ finally {
256
+ controller.abort();
127
257
  }
128
258
  };
129
- const execUntilReady = async (stageArg, argvArg) => {
130
- let lastCause;
131
- while (true) {
259
+ let primaryError;
260
+ try {
261
+ if (!Number.isFinite(deadlineAt)) {
262
+ throw new Error('ObjectStorage reconciliation deadline must be finite.');
263
+ }
264
+ let bucketMissing = false;
265
+ try {
266
+ await sendWithDeadline('authenticated bucket lookup', new plugins.s3.HeadBucketCommand({ Bucket: optionsArg.bucket }));
267
+ }
268
+ catch (error) {
269
+ if (error instanceof ObjectStorageStageError) {
270
+ throw error;
271
+ }
272
+ if (!isS3BucketNotFound(error)) {
273
+ throw objectStorageStageError('authenticated bucket lookup', false);
274
+ }
275
+ bucketMissing = true;
276
+ }
277
+ let createFailed = false;
278
+ if (bucketMissing) {
132
279
  try {
133
- return await execOnce(stageArg, argvArg, minioProbeTimeoutCapMs);
280
+ await sendWithDeadline('bucket creation', new plugins.s3.CreateBucketCommand({ Bucket: optionsArg.bucket }));
134
281
  }
135
- catch (error) {
136
- const currentCause = minioStageCause(error);
137
- if (currentCause !== undefined) {
138
- lastCause = currentCause;
139
- }
140
- const remaining = remainingMs();
141
- if (remaining <= 0) {
142
- throw minioStageError(stageArg, true, lastCause);
143
- }
144
- await clock.delay(Math.min(minioProbeIntervalMs, remaining));
145
- if (remainingMs() <= 0) {
146
- throw minioStageError(stageArg, true, lastCause);
147
- }
282
+ catch {
283
+ // A timed-out or disconnected create can still have reached the server.
284
+ createFailed = true;
148
285
  }
149
286
  }
150
- };
151
- await execUntilReady('container readiness', ['exec', optionsArg.containerId, 'true']);
152
- // The fixed script reads credentials only from the container environment.
153
- await execUntilReady('alias configuration', [
154
- 'exec',
155
- optionsArg.containerId,
156
- 'sh',
157
- '-c',
158
- minioAliasSetupScript,
159
- ]);
160
- await execUntilReady('authenticated readiness', [
161
- 'exec',
162
- optionsArg.containerId,
163
- 'mc',
164
- 'ready',
165
- '--json',
166
- minioAlias,
167
- ]);
168
- const bucketTarget = `${minioAlias}/${optionsArg.bucket}`;
169
- await execOnce('bucket creation', [
170
- 'exec',
171
- optionsArg.containerId,
172
- 'mc',
173
- 'mb',
174
- '--ignore-existing',
175
- bucketTarget,
176
- ]);
177
- await execOnce('bucket verification', [
178
- 'exec',
179
- optionsArg.containerId,
180
- 'mc',
181
- 'stat',
182
- bucketTarget,
183
- ]);
287
+ const verificationTimeout = Math.min(30_000, remainingMs());
288
+ if (verificationTimeout <= 0) {
289
+ throw objectStorageStageError('bucket verification', true);
290
+ }
291
+ let verification;
292
+ try {
293
+ verification = await optionsArg.smartBucket.checkReadiness(optionsArg.bucket, {
294
+ timeoutMs: verificationTimeout,
295
+ });
296
+ }
297
+ catch {
298
+ throw objectStorageStageError('bucket verification', false);
299
+ }
300
+ if (!verification.ready) {
301
+ throw objectStorageStageError(createFailed ? 'bucket creation and verification' : 'bucket verification', verification.reason === 'timeout');
302
+ }
303
+ }
304
+ catch (error) {
305
+ primaryError = normalizeObjectStorageLifecycleError(error);
306
+ }
307
+ let closeError;
308
+ try {
309
+ await optionsArg.smartBucket.close();
310
+ }
311
+ catch {
312
+ closeError = objectStorageStageError('S3 client cleanup', false);
313
+ }
314
+ if (primaryError && closeError) {
315
+ throw new AggregateError([primaryError, closeError], 'ObjectStorage bucket reconciliation failed and S3 client cleanup could not be confirmed.');
316
+ }
317
+ if (primaryError) {
318
+ throw primaryError;
319
+ }
320
+ if (closeError) {
321
+ throw closeError;
322
+ }
184
323
  };
185
324
  export class ServiceManager {
186
325
  config;
187
326
  docker;
188
327
  enabledServices = null;
189
328
  globalRegistry;
190
- minioClock = defaultMinioClock;
329
+ objectStorageClock = defaultObjectStorageClock;
330
+ fetchImplementation = globalThis.fetch;
331
+ smartBucketFactory = (configArg) => new plugins.smartbucket.SmartBucket({
332
+ endpoint: '127.0.0.1',
333
+ port: parseInt(configArg.S3_PORT),
334
+ useSsl: false,
335
+ region: configArg.S3_REGION,
336
+ accessKey: configArg.S3_ACCESSKEY,
337
+ accessSecret: configArg.S3_SECRETKEY,
338
+ });
191
339
  constructor() {
192
340
  this.config = new ServiceConfiguration();
193
341
  this.docker = new DockerContainer();
@@ -196,7 +344,11 @@ export class ServiceManager {
196
344
  /**
197
345
  * Initialize the service manager
198
346
  */
199
- async init() {
347
+ async init(operationArg) {
348
+ await runServiceMigrations({
349
+ projectPath: process.cwd(),
350
+ scopes: getServiceManagerMigrationScopes(operationArg),
351
+ });
200
352
  // Check Docker availability
201
353
  if (!(await this.docker.checkDocker())) {
202
354
  logger.log('error', 'Error: Docker is not installed. Please install Docker first.');
@@ -220,7 +372,7 @@ export class ServiceManager {
220
372
  // Any services command run in a project counts as activity. Without this
221
373
  // lastActive only advanced on start, so an actively used project could look
222
374
  // stale to the reaper.
223
- await this.globalRegistry.touchProject(process.cwd());
375
+ await this.withProjectServiceLocks(process.cwd(), () => this.globalRegistry.touchProject(process.cwd()));
224
376
  }
225
377
  /**
226
378
  * Human phrasing for where the auth mode came from. A declared auth-off is
@@ -247,10 +399,9 @@ export class ServiceManager {
247
399
  * Load service configuration from .smartconfig.json
248
400
  */
249
401
  async loadServiceConfiguration() {
250
- const smartconfigInstance = new plugins.smartconfig.Smartconfig(process.cwd());
251
- const gitzoneConfig = smartconfigInstance.dataFor('@git.zone/cli', {});
402
+ const persistedServices = await readPersistedServiceConfiguration(process.cwd());
252
403
  // Check if services array exists
253
- if (!gitzoneConfig.services || !Array.isArray(gitzoneConfig.services) || gitzoneConfig.services.length === 0) {
404
+ if (persistedServices.length === 0) {
254
405
  // Prompt user to select services
255
406
  const smartinteract = new plugins.smartinteract.SmartInteract();
256
407
  const response = await smartinteract.askQuestion({
@@ -259,43 +410,28 @@ export class ServiceManager {
259
410
  message: 'Which services do you want to enable for this project?',
260
411
  choices: [
261
412
  { name: 'MongoDB', value: 'mongodb' },
262
- { name: 'MinIO (S3)', value: 'minio' },
413
+ { name: 'ObjectStorage (S3)', value: 'objectstorage' },
263
414
  { name: 'Elasticsearch', value: 'elasticsearch' }
264
415
  ],
265
- default: ['mongodb', 'minio', 'elasticsearch']
416
+ default: ['mongodb', 'objectstorage', 'elasticsearch']
266
417
  });
267
- const enabledServices = response.value || ['mongodb', 'minio', 'elasticsearch'];
418
+ const enabledServices = response.value || ['mongodb', 'objectstorage', 'elasticsearch'];
268
419
  this.enabledServices = enabledServices;
269
420
  // Save to .smartconfig.json
270
421
  await this.saveServiceConfiguration(enabledServices);
271
422
  }
272
423
  else {
273
- const enabledServices = gitzoneConfig.services;
274
- this.enabledServices = enabledServices;
275
- logger.log('info', `🔧 Enabled services: ${enabledServices.join(', ')}`);
424
+ this.enabledServices = persistedServices;
425
+ logger.log('info', `🔧 Enabled services: ${persistedServices.join(', ')}`);
276
426
  }
277
427
  }
278
428
  /**
279
429
  * Save service configuration to .smartconfig.json
280
430
  */
281
431
  async saveServiceConfiguration(services) {
282
- const smartconfigPath = plugins.path.join(process.cwd(), '.smartconfig.json');
283
- let smartconfigData = {};
284
- // Read existing .smartconfig.json if it exists
285
- if (await plugins.smartfs.file(smartconfigPath).exists()) {
286
- const content = await plugins.smartfs.file(smartconfigPath).encoding('utf8').read();
287
- smartconfigData = JSON.parse(content);
288
- }
289
- // Update @git.zone/cli.services
290
- if (!smartconfigData['@git.zone/cli']) {
291
- smartconfigData['@git.zone/cli'] = {};
292
- }
293
- smartconfigData['@git.zone/cli'].services = services;
294
- // Write back to .smartconfig.json
295
- await plugins.smartfs
296
- .file(smartconfigPath)
297
- .encoding('utf8')
298
- .write(JSON.stringify(smartconfigData, null, 2));
432
+ const smartconfigData = await readSmartconfigFile(process.cwd());
433
+ setCliConfigValueInData(smartconfigData, 'services', services);
434
+ await writeSmartconfigFile(smartconfigData, process.cwd());
299
435
  logger.log('ok', `✅ Saved service configuration to .smartconfig.json`);
300
436
  logger.log('info', `🔧 Enabled services: ${services.join(', ')}`);
301
437
  }
@@ -315,14 +451,24 @@ export class ServiceManager {
315
451
  * prove the directory is reclaimable instead of guessing from its path.
316
452
  */
317
453
  async prepareDataDirectory(serviceArg, dataPathArg) {
318
- await plugins.smartfs.directory(dataPathArg).recursive().create();
319
- await recordServiceDataDirectory(process.cwd(), serviceArg);
454
+ if (await plugins.smartfs.directory(dataPathArg).exists()) {
455
+ await recordServiceDataDirectory(process.cwd(), serviceArg);
456
+ }
457
+ else {
458
+ // Publish ownership first: interruption can leave an absent directory with
459
+ // a harmless claim, but never an unmarked directory that blocks recovery.
460
+ await recordServiceDataDirectory(process.cwd(), serviceArg);
461
+ await this.createDataDirectory(dataPathArg);
462
+ }
320
463
  return getServiceContainerLabels({
321
464
  projectPath: process.cwd(),
322
465
  service: serviceArg,
323
466
  dataPath: dataPathArg,
324
467
  });
325
468
  }
469
+ async createDataDirectory(dataPathArg) {
470
+ await plugins.smartfs.directory(dataPathArg).recursive().create();
471
+ }
326
472
  /**
327
473
  * Register this project with the global registry.
328
474
  *
@@ -338,16 +484,16 @@ export class ServiceManager {
338
484
  projectName: config.PROJECT_NAME,
339
485
  containers: {
340
486
  mongo: containers.mongo,
341
- minio: containers.minio,
487
+ objectstorage: containers.objectstorage,
342
488
  elasticsearch: containers.elasticsearch,
343
489
  },
344
490
  ports: {
345
491
  mongo: parseInt(config.MONGODB_PORT),
346
492
  s3: parseInt(config.S3_PORT),
347
- s3Console: parseInt(config.S3_CONSOLE_PORT),
493
+ s3Ui: parseInt(config.S3_UI_PORT),
348
494
  elasticsearch: parseInt(config.ELASTICSEARCH_PORT),
349
495
  },
350
- enabledServices: this.enabledServices || ['mongodb', 'minio', 'elasticsearch'],
496
+ enabledServices: this.enabledServices || ['mongodb', 'objectstorage', 'elasticsearch'],
351
497
  });
352
498
  }
353
499
  /**
@@ -361,10 +507,10 @@ export class ServiceManager {
361
507
  await this.startMongoDB();
362
508
  first = false;
363
509
  }
364
- if (this.isServiceEnabled('minio')) {
510
+ if (this.isServiceEnabled('objectstorage')) {
365
511
  if (!first)
366
512
  console.log();
367
- await this.startMinIO();
513
+ await this.startObjectStorage();
368
514
  first = false;
369
515
  }
370
516
  if (this.isServiceEnabled('elasticsearch')) {
@@ -385,7 +531,7 @@ export class ServiceManager {
385
531
  async stopAll() {
386
532
  await this.stopMongoDB();
387
533
  console.log();
388
- await this.stopMinIO();
534
+ await this.stopObjectStorage();
389
535
  console.log();
390
536
  await this.stopElasticsearch();
391
537
  }
@@ -398,6 +544,19 @@ export class ServiceManager {
398
544
  * (localhost:MONGODB_PORT) is reachable from host and container alike.
399
545
  */
400
546
  async startMongoDB() {
547
+ await withServiceDataOperationLock(process.cwd(), 'mongodb', () => this.startMongoDBLocked());
548
+ }
549
+ async assertNoPendingDataDeletion(serviceArg) {
550
+ const pendingPath = await this.docker.getPendingDataDeletionPath(process.cwd(), serviceArg);
551
+ if (pendingPath) {
552
+ throw new Error(`Pending ${serviceArg} data deletion must finish before startup: ${pendingPath}. ` +
553
+ 'Run `gitzone services clean --yes` to resume the recorded cleanup.');
554
+ }
555
+ }
556
+ async startMongoDBLocked() {
557
+ await this.config.reloadFromDisk();
558
+ await this.assertNoPendingDataDeletion('mongodb');
559
+ await this.globalRegistry.touchProject(process.cwd());
401
560
  logger.log('note', '📦 MongoDB:');
402
561
  const config = this.config.getConfig();
403
562
  const containers = this.config.getContainerNames();
@@ -646,228 +805,442 @@ export class ServiceManager {
646
805
  logger.log('error', ' Replica set not ready after 30s — transactions unavailable');
647
806
  return false;
648
807
  }
649
- async inspectMinioContainer(containerReferenceArg, expectedContainerNameArg, dockerTimeoutArg) {
808
+ async inspectObjectStorageContainer(containerReferenceArg, expectedContainerNameArg, dockerTimeoutArg) {
650
809
  const result = await this.docker.execArgv(['inspect', containerReferenceArg], dockerTimeoutArg());
651
- return parseMinioInspection(result.stdout, expectedContainerNameArg);
652
- }
653
- async assertMinioOwnership(inspectionArg, expectedLabelsArg, allowLegacyRegistryArg) {
654
- const actualGitZoneLabels = Object.entries(inspectionArg.labels).filter(([key]) => key.startsWith('git.zone.'));
655
- const expectedEntries = Object.entries(expectedLabelsArg);
656
- const hasExactCurrentLabels = actualGitZoneLabels.length === expectedEntries.length &&
657
- expectedEntries.every(([key, value]) => inspectionArg.labels[key] === value);
658
- if (hasExactCurrentLabels) {
659
- return;
660
- }
661
- const refusal = () => new Error(`Refusing to use MinIO container ${inspectionArg.name}: ` +
662
- 'its ownership is not proven for the current project.');
663
- if (!allowLegacyRegistryArg) {
664
- throw refusal();
665
- }
666
- // Any ownership label is authoritative. A partial, stale, or foreign set
667
- // must never be reinterpreted through the legacy registry fallback.
668
- if (actualGitZoneLabels.length > 0 || Object.keys(inspectionArg.labels).length > 0) {
669
- throw refusal();
670
- }
671
- // Containers created before labels were introduced may be reclaimed only
672
- // when the old global registry has one unambiguous claim for this exact
673
- // name and the current resolved project path.
674
- const currentProjectPath = plugins.path.resolve(process.cwd());
675
- const registryProjects = await this.globalRegistry.getAllProjects();
676
- const claims = Object.entries(registryProjects).filter(([, project]) => project.containers.minio === inspectionArg.name);
677
- if (claims.length !== 1) {
678
- throw refusal();
810
+ return parseObjectStorageInspection(result.stdout, expectedContainerNameArg);
811
+ }
812
+ async inspectObjectStorageIdentity(containerReferenceArg, expectedContainerNameArg, dockerTimeoutArg) {
813
+ const result = await this.docker.execArgv(['inspect', containerReferenceArg], dockerTimeoutArg());
814
+ const identity = parseObjectStorageIdentity(result.stdout, expectedContainerNameArg);
815
+ if (/^[a-f0-9]{64}$/u.test(containerReferenceArg) && identity.id !== containerReferenceArg) {
816
+ throw new Error(`Refusing ObjectStorage container ${expectedContainerNameArg}: its immutable id changed.`);
679
817
  }
680
- const [registryPath, project] = claims[0];
681
- if (plugins.path.resolve(registryPath) !== currentProjectPath ||
682
- plugins.path.resolve(project.projectPath) !== currentProjectPath) {
683
- throw refusal();
818
+ return identity;
819
+ }
820
+ async discoverContainerIdByExactName(containerNameArg, dockerTimeoutArg) {
821
+ const result = await this.docker.execArgv([
822
+ 'container',
823
+ 'ls',
824
+ '-a',
825
+ '--no-trunc',
826
+ '--filter',
827
+ `name=^/${containerNameArg}$`,
828
+ '--format',
829
+ '{{.ID}}',
830
+ ], dockerTimeoutArg());
831
+ const ids = result.stdout
832
+ .split(/\r?\n/u)
833
+ .map((entry) => entry.trim())
834
+ .filter(Boolean);
835
+ if (ids.length === 0) {
836
+ return undefined;
837
+ }
838
+ if (ids.length !== 1 || !/^[a-f0-9]{64}$/u.test(ids[0])) {
839
+ throw new Error(`Docker returned ambiguous identity for container ${containerNameArg}.`);
840
+ }
841
+ return ids[0];
842
+ }
843
+ assertObjectStorageOwnership(inspectionArg, expectedLabelsArg) {
844
+ if (!hasExactServiceContainerLabels(inspectionArg.labels, expectedLabelsArg)) {
845
+ throw new Error(`Refusing to use ObjectStorage container ${inspectionArg.name}: ` +
846
+ 'its ownership is not proven for the current project.');
684
847
  }
685
848
  }
686
- async revalidateMinioContainer(containerIdArg, expectedContainerNameArg, expectedLabelsArg, allowLegacyRegistryArg, dockerTimeoutArg) {
687
- const inspection = await this.inspectMinioContainer(containerIdArg, expectedContainerNameArg, dockerTimeoutArg);
849
+ async revalidateObjectStorageContainer(containerIdArg, expectedContainerNameArg, expectedLabelsArg, dockerTimeoutArg) {
850
+ const inspection = await this.inspectObjectStorageContainer(containerIdArg, expectedContainerNameArg, dockerTimeoutArg);
688
851
  if (inspection.id !== containerIdArg) {
689
- throw new Error(`Refusing to use MinIO container ${expectedContainerNameArg}: ` +
852
+ throw new Error(`Refusing to use ObjectStorage container ${expectedContainerNameArg}: ` +
690
853
  'its immutable id changed during reconciliation.');
691
854
  }
692
- await this.assertMinioOwnership(inspection, expectedLabelsArg, allowLegacyRegistryArg);
855
+ this.assertObjectStorageOwnership(inspection, expectedLabelsArg);
693
856
  return inspection;
694
857
  }
695
- /**
696
- * Start MinIO service
697
- */
698
- async startMinIO() {
699
- logger.log('note', '📦 S3/MinIO:');
858
+ objectStorageConfigurationMatches(inspectionArg, expectedLabelsArg) {
700
859
  const config = this.config.getConfig();
701
- const containers = this.config.getContainerNames();
702
860
  const directories = this.config.getDataDirectories();
703
- // Validation lives on the mutating path so recovery commands remain usable.
861
+ const expectedEnvironment = {
862
+ OBJST_PORT: '9000',
863
+ UI_PORT: '3000',
864
+ OBJST_STORAGE_DIR: '/data',
865
+ OBJST_ACCESS_KEY: config.S3_ACCESSKEY,
866
+ OBJST_SECRET_KEY: config.S3_SECRETKEY,
867
+ OBJST_ADMIN_PASSWORD: config.S3_ADMIN_PASSWORD,
868
+ OBJST_REGION: config.S3_REGION,
869
+ };
870
+ const controlledEnvironmentEntries = inspectionArg.environmentEntries.filter((entryArg) => {
871
+ const separatorIndex = entryArg.indexOf('=');
872
+ const name = separatorIndex === -1 ? entryArg : entryArg.slice(0, separatorIndex);
873
+ return name === 'UI_PORT' || name.startsWith('OBJST_');
874
+ });
875
+ const readEnvironment = (nameArg) => {
876
+ const prefix = `${nameArg}=`;
877
+ const matches = inspectionArg.environmentEntries.filter((entry) => entry.startsWith(prefix));
878
+ return matches.length === 1 ? matches[0].slice(prefix.length) : undefined;
879
+ };
880
+ const portKeys = Object.keys(inspectionArg.portBindings).sort();
881
+ const expectedPortKeys = ['3000/tcp', '9000/tcp'];
882
+ const healthcheckMatches = inspectionArg.healthcheck.test.length === objectStorageExpectedHealthcheck.test.length &&
883
+ inspectionArg.healthcheck.test.every((entry, index) => entry === objectStorageExpectedHealthcheck.test[index]) &&
884
+ inspectionArg.healthcheck.interval === objectStorageExpectedHealthcheck.interval &&
885
+ inspectionArg.healthcheck.timeout === objectStorageExpectedHealthcheck.timeout &&
886
+ inspectionArg.healthcheck.startPeriod === objectStorageExpectedHealthcheck.startPeriod &&
887
+ inspectionArg.healthcheck.retries === objectStorageExpectedHealthcheck.retries;
888
+ return (inspectionArg.image === objectStorageImage &&
889
+ portKeys.length === expectedPortKeys.length &&
890
+ portKeys.every((entry, index) => entry === expectedPortKeys[index]) &&
891
+ objectStoragePortMatches(inspectionArg.portBindings, '9000/tcp', config.S3_PORT) &&
892
+ objectStoragePortMatches(inspectionArg.portBindings, '3000/tcp', config.S3_UI_PORT) &&
893
+ inspectionArg.mounts.length === 1 &&
894
+ inspectionArg.mounts[0].source === plugins.path.resolve(directories.objectstorage) &&
895
+ inspectionArg.mounts[0].destination === '/data' &&
896
+ inspectionArg.mounts[0].readWrite &&
897
+ controlledEnvironmentEntries.length === Object.keys(expectedEnvironment).length &&
898
+ Object.entries(expectedEnvironment).every(([name, value]) => readEnvironment(name) === value) &&
899
+ hasExactServiceContainerLabels(inspectionArg.labels, expectedLabelsArg) &&
900
+ inspectionArg.restartPolicy === 'unless-stopped' &&
901
+ inspectionArg.command.length === objectStorageExpectedCommand.length &&
902
+ inspectionArg.command.every((entry, index) => entry === objectStorageExpectedCommand[index]) &&
903
+ inspectionArg.entrypoint.length === objectStorageExpectedEntrypoint.length &&
904
+ inspectionArg.entrypoint.every((entry, index) => entry === objectStorageExpectedEntrypoint[index]) &&
905
+ inspectionArg.user === 'objectstorage' &&
906
+ healthcheckMatches);
907
+ }
908
+ async assertNoSymlinkedObjectStoragePath(dataPathArg) {
909
+ const projectPath = plugins.path.resolve(process.cwd());
910
+ const expectedPath = getServiceDataDirectory(projectPath, 'objectstorage');
911
+ if (plugins.path.resolve(dataPathArg) !== expectedPath) {
912
+ throw new Error(`Refusing non-canonical ObjectStorage data path: ${dataPathArg}`);
913
+ }
914
+ for (const candidate of [projectPath, plugins.path.join(projectPath, '.nogit'), expectedPath]) {
915
+ try {
916
+ if ((await plugins.fs.lstat(candidate)).isSymbolicLink()) {
917
+ throw new Error(`Refusing symbolic-link ObjectStorage path component: ${candidate}`);
918
+ }
919
+ }
920
+ catch (error) {
921
+ if (error.code !== 'ENOENT') {
922
+ throw error;
923
+ }
924
+ }
925
+ }
926
+ }
927
+ async prepareObjectStorageDataDirectory(dockerTimeoutArg) {
928
+ const projectPath = plugins.path.resolve(process.cwd());
929
+ const dataPath = this.config.getDataDirectories().objectstorage;
930
+ await this.assertNoSymlinkedObjectStoragePath(dataPath);
931
+ const exists = await plugins.smartfs.directory(dataPath).exists();
932
+ const marker = await readServiceDataMarker(projectPath);
933
+ if (exists && !markerProvesServiceDataDirectory(marker, projectPath, 'objectstorage')) {
934
+ throw new Error(`Refusing existing ObjectStorage data directory with unproven ownership: ${dataPath}`);
935
+ }
936
+ if (!exists) {
937
+ await recordServiceDataDirectory(projectPath, 'objectstorage');
938
+ await this.createDataDirectory(dataPath);
939
+ }
940
+ const labels = getServiceContainerLabels({
941
+ projectPath,
942
+ service: 'objectstorage',
943
+ dataPath,
944
+ });
945
+ await this.docker.runFencedBindOperation({
946
+ image: objectStorageImage,
947
+ hostPath: dataPath,
948
+ containerPath: '/data',
949
+ entrypoint: '/bin/chown',
950
+ command: ['-R', 'objectstorage:objectstorage', '/data'],
951
+ labels: {
952
+ 'git.zone.tool': serviceToolLabel,
953
+ 'git.zone.service': 'objectstorage',
954
+ 'git.zone.project-path': projectPath,
955
+ 'git.zone.data-path': plugins.path.resolve(dataPath),
956
+ 'git.zone.safe-to-prune': 'false',
957
+ [serviceOperationLabel]: serviceBindOperation,
958
+ },
959
+ executionOptions: dockerTimeoutArg,
960
+ rollbackTimeoutMs: objectStorageRollbackTimeoutMs,
961
+ });
962
+ return labels;
963
+ }
964
+ async repairObjectStorageMarkerFromOwnedContainer(dataPathArg) {
965
+ const projectPath = plugins.path.resolve(process.cwd());
966
+ await this.assertNoSymlinkedObjectStoragePath(dataPathArg);
967
+ if (!(await plugins.smartfs.directory(dataPathArg).exists())) {
968
+ throw new Error(`Refusing owned ObjectStorage container with a missing data directory: ${dataPathArg}`);
969
+ }
970
+ const marker = await readServiceDataMarker(projectPath);
971
+ if (!markerProvesServiceDataDirectory(marker, projectPath, 'objectstorage')) {
972
+ // recordServiceDataDirectory rejects an invalid/foreign marker, so only an
973
+ // absent or valid mergeable claim is repaired from exact container labels.
974
+ await recordServiceDataDirectory(projectPath, 'objectstorage');
975
+ }
976
+ }
977
+ async assertNoLegacyMinioResources(dockerTimeoutArg) {
978
+ const projectPath = plugins.path.resolve(process.cwd());
979
+ const containers = this.config.getContainerNames();
980
+ const projects = await this.globalRegistry.getAllProjects();
981
+ const registryEntry = Object.entries(projects).find(([registeredPath]) => plugins.path.resolve(registeredPath) === projectPath)?.[1];
982
+ const candidateNames = new Set([containers.legacyMinio]);
983
+ if (registryEntry?.legacy?.minioContainer) {
984
+ candidateNames.add(registryEntry.legacy.minioContainer);
985
+ }
986
+ const existingContainers = [];
987
+ for (const candidateName of candidateNames) {
988
+ if (await this.discoverContainerIdByExactName(candidateName, dockerTimeoutArg)) {
989
+ existingContainers.push(candidateName);
990
+ }
991
+ }
992
+ const legacyDataPath = getLegacyMinioDataDirectory(projectPath);
993
+ const legacyDataExists = await plugins.smartfs.directory(legacyDataPath).exists();
994
+ if (existingContainers.length === 0 && !legacyDataExists) {
995
+ return;
996
+ }
997
+ const evidence = [
998
+ ...existingContainers.map((name) => `container ${name}`),
999
+ ...(legacyDataExists ? [`data directory ${legacyDataPath}`] : []),
1000
+ ].join(', ');
1001
+ throw new Error(`Legacy MinIO state blocks ObjectStorage startup: ${evidence}. ` +
1002
+ 'GitZone will not start, stop, remove, or reuse these resources because their disk layout is not compatible with SmartStorage. ' +
1003
+ 'Recovery: (1) export the required bucket data with your existing legacy tooling; ' +
1004
+ '(2) stop and rename the legacy container and move .nogit/miniodata to a preserved backup location; ' +
1005
+ '(3) run `gitzone services start s3`; ' +
1006
+ '(4) import the backup with an external S3 client and verify every required object before disposing of the legacy backup.');
1007
+ }
1008
+ /** Read-only preflight used before restart or reconfigure may stop anything. */
1009
+ async assertObjectStorageStartupAllowed() {
1010
+ this.assertObjectStorageConfigurationSafe();
1011
+ await this.assertNoLegacyMinioResources(() => ({ timeoutMs: 60_000 }));
1012
+ }
1013
+ assertObjectStorageConfigurationSafe() {
1014
+ const config = this.config.getConfig();
704
1015
  const bucketValidationError = getS3BucketNameValidationError(config.S3_BUCKET);
705
1016
  if (bucketValidationError) {
706
1017
  throw new Error(`Invalid S3_BUCKET in .nogit/env.json: ${bucketValidationError}. ` +
707
1018
  'Choose a valid custom bucket name or remove the field to regenerate the project default.');
708
1019
  }
709
- // Ensure data directory exists and is marked as tool-owned
710
- const minioLabels = await this.prepareDataDirectory('minio', directories.minio);
711
- const deadlineAt = this.minioClock.now() + minioReconciliationTimeoutMs;
1020
+ this.config.assertObjectStorageCredentialsAreSafe();
1021
+ }
1022
+ async waitForObjectStorageReadiness(configArg, deadlineAtArg) {
1023
+ while (true) {
1024
+ const remaining = Math.floor(deadlineAtArg - this.objectStorageClock.now());
1025
+ if (remaining <= 0) {
1026
+ throw objectStorageStageError('management readiness', true);
1027
+ }
1028
+ const controller = new AbortController();
1029
+ const probeTimeoutMs = Math.max(1, Math.min(objectStorageProbeTimeoutCapMs, remaining));
1030
+ let probeTimedOut = false;
1031
+ let timer;
1032
+ const fetchPromise = this.fetchImplementation(`http://127.0.0.1:${configArg.S3_UI_PORT}/readyz`, { signal: controller.signal });
1033
+ const timeoutPromise = new Promise((_resolve, reject) => {
1034
+ timer = setTimeout(() => {
1035
+ probeTimedOut = true;
1036
+ controller.abort();
1037
+ reject(objectStorageStageError('management readiness', true));
1038
+ }, probeTimeoutMs);
1039
+ });
1040
+ try {
1041
+ const response = await Promise.race([fetchPromise, timeoutPromise]);
1042
+ const ready = response.ok;
1043
+ controller.abort();
1044
+ if (response.body) {
1045
+ void response.body.cancel().catch(() => { });
1046
+ }
1047
+ if (ready) {
1048
+ return;
1049
+ }
1050
+ }
1051
+ catch {
1052
+ // Startup commonly refuses connections before the management listener binds.
1053
+ }
1054
+ finally {
1055
+ if (timer) {
1056
+ clearTimeout(timer);
1057
+ }
1058
+ controller.abort();
1059
+ if (probeTimedOut) {
1060
+ // A non-cooperative fetch may resolve after the timeout race. Consume
1061
+ // that late response as well so its body cannot retain a connection.
1062
+ void fetchPromise.then((responseArg) => {
1063
+ if (responseArg.body) {
1064
+ void responseArg.body.cancel().catch(() => { });
1065
+ }
1066
+ }, () => { });
1067
+ }
1068
+ }
1069
+ const afterProbe = Math.floor(deadlineAtArg - this.objectStorageClock.now());
1070
+ if (afterProbe <= 0) {
1071
+ throw objectStorageStageError('management readiness', true);
1072
+ }
1073
+ await this.objectStorageClock.delay(Math.min(objectStorageProbeIntervalMs, afterProbe));
1074
+ }
1075
+ }
1076
+ async createObjectStorageContainer(labelsArg, dockerTimeoutArg) {
1077
+ const config = this.config.getConfig();
1078
+ const containers = this.config.getContainerNames();
1079
+ const directories = this.config.getDataDirectories();
1080
+ const creationResult = await this.docker.createArgv({
1081
+ name: containers.objectstorage,
1082
+ image: objectStorageImage,
1083
+ ports: {
1084
+ [`127.0.0.1:${config.S3_PORT}`]: '9000',
1085
+ [`127.0.0.1:${config.S3_UI_PORT}`]: '3000',
1086
+ },
1087
+ volumes: { [directories.objectstorage]: '/data' },
1088
+ environment: {
1089
+ OBJST_PORT: '9000',
1090
+ UI_PORT: '3000',
1091
+ OBJST_STORAGE_DIR: '/data',
1092
+ OBJST_ACCESS_KEY: config.S3_ACCESSKEY,
1093
+ OBJST_SECRET_KEY: config.S3_SECRETKEY,
1094
+ OBJST_ADMIN_PASSWORD: config.S3_ADMIN_PASSWORD,
1095
+ OBJST_REGION: config.S3_REGION,
1096
+ },
1097
+ labels: labelsArg,
1098
+ restart: 'unless-stopped',
1099
+ }, dockerTimeoutArg());
1100
+ const containerId = creationResult.stdout.trim();
1101
+ if (!/^[a-f0-9]{64}$/u.test(containerId)) {
1102
+ throw new Error(`Docker returned an invalid id while creating ${containers.objectstorage}.`);
1103
+ }
1104
+ const inspection = await this.revalidateObjectStorageContainer(containerId, containers.objectstorage, labelsArg, dockerTimeoutArg);
1105
+ if (inspection.running || inspection.status !== 'created') {
1106
+ throw new Error(`ObjectStorage container ${containers.objectstorage} was not created stopped.`);
1107
+ }
1108
+ if (!this.objectStorageConfigurationMatches(inspection, labelsArg)) {
1109
+ throw new Error(`ObjectStorage container ${containers.objectstorage} does not match the required runtime configuration.`);
1110
+ }
1111
+ return inspection;
1112
+ }
1113
+ /** Start or reconcile the canonical ObjectStorage service. */
1114
+ async startObjectStorage() {
1115
+ await withServiceDataOperationLock(process.cwd(), 'objectstorage', () => this.startObjectStorageLocked());
1116
+ }
1117
+ async startObjectStorageLocked() {
1118
+ await this.config.reloadFromDisk();
1119
+ await this.assertNoPendingDataDeletion('objectstorage');
1120
+ await this.globalRegistry.touchProject(process.cwd());
1121
+ logger.log('note', '📦 S3/ObjectStorage:');
1122
+ const config = this.config.getConfig();
1123
+ const containers = this.config.getContainerNames();
1124
+ const directories = this.config.getDataDirectories();
1125
+ this.assertObjectStorageConfigurationSafe();
1126
+ const deadlineAt = this.objectStorageClock.now() + objectStorageReconciliationTimeoutMs;
712
1127
  const dockerTimeout = () => {
713
- const remaining = Math.floor(deadlineAt - this.minioClock.now());
1128
+ const remaining = Math.floor(deadlineAt - this.objectStorageClock.now());
714
1129
  if (remaining <= 0) {
715
- throw new Error('MinIO container setup did not complete before the shared reconciliation deadline.');
1130
+ throw objectStorageStageError('container setup', true);
716
1131
  }
717
1132
  return { timeoutMs: Math.max(1, remaining) };
718
1133
  };
1134
+ const expectedLabels = getServiceContainerLabels({
1135
+ projectPath: process.cwd(),
1136
+ service: 'objectstorage',
1137
+ dataPath: directories.objectstorage,
1138
+ });
719
1139
  const startedContainerIds = [];
720
- const startById = async (containerIdArg) => {
1140
+ const startById = async (containerIdArg, ownedByInvocationArg) => {
721
1141
  const executionOptions = dockerTimeout();
722
- // Record ownership of the lifecycle before awaiting Docker: a timed-out
723
- // start may still have reached the daemon and must be rolled back.
724
- startedContainerIds.push(containerIdArg);
1142
+ if (ownedByInvocationArg) {
1143
+ startedContainerIds.push(containerIdArg);
1144
+ }
725
1145
  await this.docker.execArgv(['start', containerIdArg], executionOptions);
1146
+ if (!ownedByInvocationArg) {
1147
+ startedContainerIds.push(containerIdArg);
1148
+ }
726
1149
  };
727
1150
  let outcome;
728
1151
  try {
729
- const listResult = await this.docker.execArgv([
730
- 'container',
731
- 'ls',
732
- '-a',
733
- '--filter',
734
- `name=${containers.minio}`,
735
- '--format',
736
- '{{.Names}}',
737
- ], dockerTimeout());
738
- const containerExists = listResult.stdout
739
- .split(/\r?\n/u)
740
- .map((lineArg) => lineArg.trim())
741
- .includes(containers.minio);
1152
+ await this.assertNoLegacyMinioResources(dockerTimeout);
1153
+ const existingId = await this.discoverContainerIdByExactName(containers.objectstorage, dockerTimeout);
742
1154
  let initialInspection;
743
- if (containerExists) {
744
- initialInspection = await this.inspectMinioContainer(containers.minio, containers.minio, dockerTimeout);
745
- // No existing container is started or receives an in-container command
746
- // until it proves current or unambiguous legacy ownership.
747
- await this.assertMinioOwnership(initialInspection, minioLabels, true);
1155
+ if (existingId) {
1156
+ initialInspection = await this.inspectObjectStorageContainer(existingId, containers.objectstorage, dockerTimeout);
1157
+ this.assertObjectStorageOwnership(initialInspection, expectedLabels);
1158
+ await this.repairObjectStorageMarkerFromOwnedContainer(directories.objectstorage);
748
1159
  }
749
- let needsRecreate = false;
750
- let credentialsChanged = false;
751
- if (initialInspection) {
752
- const apiMatches = minioPortMatches(initialInspection.portBindings, '9000/tcp', config.S3_PORT);
753
- const consoleMatches = minioPortMatches(initialInspection.portBindings, '9001/tcp', config.S3_CONSOLE_PORT);
754
- const readExactEnvironmentValue = (nameArg) => {
755
- const prefix = `${nameArg}=`;
756
- const matches = initialInspection.environmentEntries.filter((entryArg) => entryArg.startsWith(prefix));
757
- return matches.length === 1 ? matches[0].slice(prefix.length) : undefined;
758
- };
759
- credentialsChanged =
760
- readExactEnvironmentValue('MINIO_ROOT_USER') !== config.S3_ACCESSKEY ||
761
- readExactEnvironmentValue('MINIO_ROOT_PASSWORD') !== config.S3_SECRETKEY;
762
- needsRecreate = !apiMatches || !consoleMatches || credentialsChanged;
1160
+ else {
1161
+ await this.config.validateObjectStoragePorts();
763
1162
  }
1163
+ const needsRecreate = !!initialInspection &&
1164
+ !this.objectStorageConfigurationMatches(initialInspection, expectedLabels);
764
1165
  let activeInspection;
765
- let activeAllowsLegacyRegistry;
766
- if (initialInspection && needsRecreate) {
767
- logger.log('note', credentialsChanged
768
- ? ' Credential configuration changed, recreating container...'
769
- : ' Port configuration changed, recreating container...');
770
- await this.revalidateMinioContainer(initialInspection.id, containers.minio, minioLabels, true, dockerTimeout);
771
- await this.docker.execArgv(['rm', '-f', initialInspection.id], dockerTimeout());
772
- activeInspection = await this.createMinioContainer(minioLabels, dockerTimeout);
773
- activeAllowsLegacyRegistry = false;
774
- await startById(activeInspection.id);
775
- outcome = 'Recreated with configured ports and reconciled';
1166
+ if (!initialInspection || needsRecreate) {
1167
+ const labels = await this.prepareObjectStorageDataDirectory(dockerTimeout);
1168
+ if (initialInspection) {
1169
+ logger.log('note', ' Runtime configuration changed, recreating container...');
1170
+ await this.revalidateObjectStorageContainer(initialInspection.id, containers.objectstorage, expectedLabels, dockerTimeout);
1171
+ await this.docker.execArgv(['rm', '-f', initialInspection.id], dockerTimeout());
1172
+ }
1173
+ else {
1174
+ logger.log('note', ' Creating container...');
1175
+ }
1176
+ activeInspection = await this.createObjectStorageContainer(labels, dockerTimeout);
1177
+ await startById(activeInspection.id, true);
1178
+ outcome = initialInspection
1179
+ ? 'Recreated with canonical configuration and reconciled'
1180
+ : 'Created, started, and reconciled';
776
1181
  }
777
- else if (initialInspection && !initialInspection.running) {
1182
+ else if (!initialInspection.running) {
778
1183
  logger.log('note', ' Starting existing container...');
779
1184
  activeInspection = initialInspection;
780
- activeAllowsLegacyRegistry = true;
781
- await startById(activeInspection.id);
1185
+ await startById(activeInspection.id, false);
782
1186
  outcome = 'Started and reconciled';
783
1187
  }
784
- else if (!initialInspection) {
785
- logger.log('note', ' Creating container...');
786
- activeInspection = await this.createMinioContainer(minioLabels, dockerTimeout);
787
- activeAllowsLegacyRegistry = false;
788
- await startById(activeInspection.id);
789
- outcome = 'Created, started, and reconciled';
790
- }
791
1188
  else {
792
1189
  logger.log('note', ' Already running; reconciling bucket...');
793
1190
  activeInspection = initialInspection;
794
- activeAllowsLegacyRegistry = true;
795
1191
  outcome = 'Already running and reconciled';
796
1192
  }
797
- const reconciliationInspection = await this.revalidateMinioContainer(activeInspection.id, containers.minio, minioLabels, activeAllowsLegacyRegistry, dockerTimeout);
798
- await reconcileMinioBucket({
799
- docker: this.docker,
800
- containerId: reconciliationInspection.id,
1193
+ await this.revalidateObjectStorageContainer(activeInspection.id, containers.objectstorage, expectedLabels, dockerTimeout);
1194
+ await this.waitForObjectStorageReadiness(config, deadlineAt);
1195
+ await reconcileObjectStorageBucket({
1196
+ smartBucket: this.smartBucketFactory(config),
801
1197
  bucket: config.S3_BUCKET,
802
1198
  deadlineAt,
803
- clock: this.minioClock,
1199
+ clock: this.objectStorageClock,
804
1200
  });
1201
+ const finalInspection = await this.revalidateObjectStorageContainer(activeInspection.id, containers.objectstorage, expectedLabels, dockerTimeout);
1202
+ if (!finalInspection.running) {
1203
+ throw new Error(`ObjectStorage container ${containers.objectstorage} stopped during reconciliation.`);
1204
+ }
805
1205
  }
806
1206
  catch (error) {
807
- const originalError = normalizeMinioLifecycleError(error);
1207
+ const originalError = normalizeObjectStorageLifecycleError(error);
808
1208
  const rollbackErrors = [];
809
1209
  for (let index = startedContainerIds.length - 1; index >= 0; index--) {
810
1210
  try {
811
- await this.docker.execArgv(['stop', startedContainerIds[index]], {
812
- timeoutMs: minioRollbackTimeoutMs,
813
- });
1211
+ const rollbackInspection = await this.revalidateObjectStorageContainer(startedContainerIds[index], containers.objectstorage, expectedLabels, () => ({ timeoutMs: objectStorageRollbackTimeoutMs }));
1212
+ if (rollbackInspection.running) {
1213
+ await this.docker.execArgv(['stop', startedContainerIds[index]], {
1214
+ timeoutMs: objectStorageRollbackTimeoutMs,
1215
+ });
1216
+ }
814
1217
  }
815
1218
  catch (rollbackError) {
816
- rollbackErrors.push(normalizeMinioLifecycleError(rollbackError));
1219
+ rollbackErrors.push(normalizeObjectStorageLifecycleError(rollbackError));
817
1220
  }
818
1221
  }
819
1222
  if (rollbackErrors.length > 0) {
820
- throw new AggregateError([originalError, ...rollbackErrors], 'MinIO startup failed and rollback could not stop every container started by this invocation.');
1223
+ throw new AggregateError([originalError, ...rollbackErrors], 'ObjectStorage startup failed and rollback could not stop every container started by this invocation.');
821
1224
  }
822
1225
  throw originalError;
823
1226
  }
824
1227
  logger.log('ok', ` ${outcome} ✓`);
825
1228
  logger.log('ok', ` Bucket '${config.S3_BUCKET}' exists and is authenticated ✓`);
826
- logger.log('info', ` Container: ${containers.minio}`);
827
- logger.log('info', ` Port: ${config.S3_PORT}`);
1229
+ logger.log('info', ` Container: ${containers.objectstorage}`);
1230
+ logger.log('info', ` S3 API: http://127.0.0.1:${config.S3_PORT}`);
828
1231
  logger.log('info', ` Bucket: ${config.S3_BUCKET}`);
829
- logger.log('info', ` API: http://${config.S3_HOST}:${config.S3_PORT}`);
830
- logger.log('info', ` Console: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT} (credentials: ***)`);
831
- }
832
- /** Create stopped MinIO, inspect its id, and prove exact current labels. */
833
- async createMinioContainer(labelsArg, dockerTimeoutArg) {
834
- const config = this.config.getConfig();
835
- const containers = this.config.getContainerNames();
836
- const directories = this.config.getDataDirectories();
837
- const creationResult = await this.docker.createArgv({
838
- name: containers.minio,
839
- image: 'minio/minio',
840
- ports: {
841
- [config.S3_PORT]: '9000',
842
- [config.S3_CONSOLE_PORT]: '9001',
843
- },
844
- volumes: {
845
- [directories.minio]: '/data',
846
- },
847
- environment: {
848
- MINIO_ROOT_USER: config.S3_ACCESSKEY,
849
- MINIO_ROOT_PASSWORD: config.S3_SECRETKEY,
850
- },
851
- labels: labelsArg,
852
- restart: 'unless-stopped',
853
- command: ['server', '/data', '--console-address', ':9001'],
854
- }, dockerTimeoutArg());
855
- const containerId = creationResult.stdout.trim();
856
- if (!/^[a-f0-9]{64}$/u.test(containerId)) {
857
- throw new Error(`Docker returned an invalid id while creating ${containers.minio}.`);
858
- }
859
- const inspection = await this.inspectMinioContainer(containerId, containers.minio, dockerTimeoutArg);
860
- if (inspection.id !== containerId) {
861
- throw new Error(`Refusing to start MinIO container ${containers.minio}: ` +
862
- 'Docker inspection did not return the created immutable id.');
863
- }
864
- await this.assertMinioOwnership(inspection, labelsArg, false);
865
- return inspection;
1232
+ logger.log('info', ` Management UI: http://127.0.0.1:${config.S3_UI_PORT}`);
866
1233
  }
867
1234
  /**
868
1235
  * Start Elasticsearch service
869
1236
  */
870
1237
  async startElasticsearch() {
1238
+ await withServiceDataOperationLock(process.cwd(), 'elasticsearch', () => this.startElasticsearchLocked());
1239
+ }
1240
+ async startElasticsearchLocked() {
1241
+ await this.config.reloadFromDisk();
1242
+ await this.assertNoPendingDataDeletion('elasticsearch');
1243
+ await this.globalRegistry.touchProject(process.cwd());
871
1244
  logger.log('note', '📦 Elasticsearch:');
872
1245
  const config = this.config.getConfig();
873
1246
  const containers = this.config.getContainerNames();
@@ -959,6 +1332,10 @@ export class ServiceManager {
959
1332
  * Stop MongoDB service
960
1333
  */
961
1334
  async stopMongoDB() {
1335
+ await withServiceDataOperationLock(process.cwd(), 'mongodb', () => this.stopMongoDBLocked());
1336
+ }
1337
+ async stopMongoDBLocked() {
1338
+ await this.config.reloadFromDisk();
962
1339
  logger.log('note', '📦 MongoDB:');
963
1340
  const containers = this.config.getContainerNames();
964
1341
  const status = await this.docker.getStatus(containers.mongo);
@@ -974,29 +1351,42 @@ export class ServiceManager {
974
1351
  logger.log('note', ' Not running');
975
1352
  }
976
1353
  }
977
- /**
978
- * Stop MinIO service
979
- */
980
- async stopMinIO() {
981
- logger.log('note', '📦 S3/MinIO:');
1354
+ /** Stop only an exactly owned canonical ObjectStorage container. */
1355
+ async stopObjectStorage() {
1356
+ await withServiceDataOperationLock(process.cwd(), 'objectstorage', () => this.stopObjectStorageLocked());
1357
+ }
1358
+ async stopObjectStorageLocked() {
1359
+ await this.config.reloadFromDisk();
1360
+ logger.log('note', '📦 S3/ObjectStorage:');
982
1361
  const containers = this.config.getContainerNames();
983
- const status = await this.docker.getStatus(containers.minio);
984
- if (status === 'running') {
985
- if (await this.docker.stop(containers.minio)) {
986
- logger.log('ok', ' Stopped ✓');
987
- }
988
- else {
989
- logger.log('error', ' Failed to stop');
990
- }
1362
+ const directories = this.config.getDataDirectories();
1363
+ const labels = getServiceContainerLabels({
1364
+ projectPath: process.cwd(),
1365
+ service: 'objectstorage',
1366
+ dataPath: directories.objectstorage,
1367
+ });
1368
+ const timeout = () => ({ timeoutMs: 60_000 });
1369
+ const id = await this.discoverContainerIdByExactName(containers.objectstorage, timeout);
1370
+ if (!id) {
1371
+ logger.log('note', ' Not running');
1372
+ return;
991
1373
  }
992
- else {
1374
+ const inspection = await this.revalidateObjectStorageContainer(id, containers.objectstorage, labels, timeout);
1375
+ if (!inspection.running) {
993
1376
  logger.log('note', ' Not running');
1377
+ return;
994
1378
  }
1379
+ await this.docker.execArgv(['stop', inspection.id], timeout());
1380
+ logger.log('ok', ' Stopped ✓');
995
1381
  }
996
1382
  /**
997
1383
  * Stop Elasticsearch service
998
1384
  */
999
1385
  async stopElasticsearch() {
1386
+ await withServiceDataOperationLock(process.cwd(), 'elasticsearch', () => this.stopElasticsearchLocked());
1387
+ }
1388
+ async stopElasticsearchLocked() {
1389
+ await this.config.reloadFromDisk();
1000
1390
  logger.log('note', '📦 Elasticsearch:');
1001
1391
  const containers = this.config.getContainerNames();
1002
1392
  const status = await this.docker.getStatus(containers.elasticsearch);
@@ -1041,16 +1431,62 @@ export class ServiceManager {
1041
1431
  const mongo = await describe('mongodb', containers.mongo, directories.mongo, config.MONGODB_PORT, this.config.getMongoConnectionString());
1042
1432
  mongo.authEnabled = this.config.isMongoAuthEnabled();
1043
1433
  mongo.authSource = this.config.getMongoAuthSource();
1044
- const minio = await describe('minio', containers.minio, directories.minio, config.S3_PORT, `http://${config.S3_HOST}:${config.S3_PORT}`);
1434
+ const objectStorageDataExists = await plugins.smartfs.directory(directories.objectstorage).exists();
1435
+ const objectStorageLabels = getServiceContainerLabels({
1436
+ projectPath: process.cwd(),
1437
+ service: 'objectstorage',
1438
+ dataPath: directories.objectstorage,
1439
+ });
1440
+ const objectStorageId = await this.discoverContainerIdByExactName(containers.objectstorage, () => ({ timeoutMs: 60_000 }));
1441
+ let objectStorageStatus = 'not_exists';
1442
+ let objectStorageOwnership = 'absent';
1443
+ if (objectStorageId) {
1444
+ const inspection = await this.inspectObjectStorageIdentity(objectStorageId, containers.objectstorage, () => ({ timeoutMs: 60_000 }));
1445
+ objectStorageStatus = inspection.running ? 'running' : 'stopped';
1446
+ objectStorageOwnership = hasExactServiceContainerLabels(inspection.labels, objectStorageLabels)
1447
+ ? 'owned'
1448
+ : 'conflict';
1449
+ }
1450
+ const objectstorage = {
1451
+ service: 'objectstorage',
1452
+ enabled: this.isServiceEnabled('objectstorage'),
1453
+ container: containers.objectstorage,
1454
+ status: objectStorageStatus,
1455
+ port: config.S3_PORT,
1456
+ connectionString: `http://127.0.0.1:${config.S3_PORT}`,
1457
+ managementUi: `http://127.0.0.1:${config.S3_UI_PORT}`,
1458
+ dataDirectory: directories.objectstorage,
1459
+ dataSizeBytes: objectStorageDataExists
1460
+ ? await helpers.getDirectorySize(directories.objectstorage)
1461
+ : 0,
1462
+ portAvailable: objectStorageStatus === 'not_exists'
1463
+ ? await helpers.isPortAvailable(parseInt(config.S3_PORT))
1464
+ : null,
1465
+ ownership: objectStorageOwnership,
1466
+ };
1045
1467
  const elasticsearch = await describe('elasticsearch', containers.elasticsearch, directories.elasticsearch, config.ELASTICSEARCH_PORT, config.ELASTICSEARCH_URL);
1468
+ const projectPath = plugins.path.resolve(process.cwd());
1469
+ const registryProjects = await this.globalRegistry.getAllProjects();
1470
+ const registryProject = Object.entries(registryProjects).find(([registeredPath]) => plugins.path.resolve(registeredPath) === projectPath)?.[1];
1471
+ const legacyDataDirectory = getLegacyMinioDataDirectory(projectPath);
1472
+ const legacyContainerExists = await this.discoverContainerIdByExactName(containers.legacyMinio, () => ({ timeoutMs: 60_000 }));
1046
1473
  return {
1047
1474
  project: {
1048
1475
  name: config.PROJECT_NAME,
1049
1476
  path: process.cwd(),
1050
1477
  enabledServices: this.enabledServices || [],
1051
1478
  },
1052
- services: { mongodb: mongo, minio, elasticsearch },
1053
- totalDataBytes: mongo.dataSizeBytes + minio.dataSizeBytes + elasticsearch.dataSizeBytes,
1479
+ services: { mongodb: mongo, objectstorage, elasticsearch },
1480
+ legacy: {
1481
+ ...(registryProject?.legacy?.minioContainer
1482
+ ? { minioContainer: registryProject.legacy.minioContainer }
1483
+ : legacyContainerExists
1484
+ ? { minioContainer: containers.legacyMinio }
1485
+ : {}),
1486
+ minioDataDirectory: legacyDataDirectory,
1487
+ minioDataExists: await plugins.smartfs.directory(legacyDataDirectory).exists(),
1488
+ },
1489
+ totalDataBytes: mongo.dataSizeBytes + objectstorage.dataSizeBytes + elasticsearch.dataSizeBytes,
1054
1490
  };
1055
1491
  }
1056
1492
  /**
@@ -1060,6 +1496,7 @@ export class ServiceManager {
1060
1496
  helpers.printHeader('Service Status');
1061
1497
  const config = this.config.getConfig();
1062
1498
  const containers = this.config.getContainerNames();
1499
+ const structuredStatus = await this.collectStatus();
1063
1500
  logger.log('info', `Project: ${config.PROJECT_NAME}`);
1064
1501
  console.log();
1065
1502
  // MongoDB status
@@ -1096,48 +1533,56 @@ export class ServiceManager {
1096
1533
  }
1097
1534
  break;
1098
1535
  }
1099
- // MinIO status
1100
- const minioStatus = await this.docker.getStatus(containers.minio);
1101
- switch (minioStatus) {
1102
- case 'running':
1103
- logger.log('ok', '📦 S3/MinIO: 🟢 Running');
1104
- logger.log('info', ` ├─ Container: ${containers.minio}`);
1105
- logger.log('info', ` ├─ API: http://${config.S3_HOST}:${config.S3_PORT}`);
1106
- logger.log('info', ` ├─ Console: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT}`);
1107
- logger.log('info', ` └─ Bucket: ${config.S3_BUCKET}`);
1108
- break;
1109
- case 'stopped':
1110
- logger.log('note', '📦 S3/MinIO: 🟡 Stopped');
1111
- logger.log('info', ` ├─ Container: ${containers.minio}`);
1112
- logger.log('info', ` ├─ API Port: ${config.S3_PORT}`);
1113
- logger.log('info', ` └─ Console Port: ${config.S3_CONSOLE_PORT}`);
1114
- break;
1115
- case 'not_exists':
1116
- logger.log('info', '📦 S3/MinIO: ⚪ Not installed');
1117
- // Check port availability
1118
- const s3Port = parseInt(config.S3_PORT);
1119
- const s3ConsolePort = parseInt(config.S3_CONSOLE_PORT);
1120
- const s3Available = await helpers.isPortAvailable(s3Port);
1121
- const consoleAvailable = await helpers.isPortAvailable(s3ConsolePort);
1122
- if (!s3Available || !consoleAvailable) {
1123
- if (!s3Available) {
1124
- logger.log('error', ` ├─ ⚠️ API Port ${s3Port} is in use`);
1536
+ // ObjectStorage status
1537
+ const objectstorage = structuredStatus.services.objectstorage;
1538
+ if (objectstorage.ownership === 'conflict') {
1539
+ logger.log('error', `📦 S3/ObjectStorage: ownership conflict for ${objectstorage.container}; refusing to treat it as managed`);
1540
+ }
1541
+ else
1542
+ switch (objectstorage.status) {
1543
+ case 'running':
1544
+ logger.log('ok', '📦 S3/ObjectStorage: 🟢 Running');
1545
+ logger.log('info', ` ├─ Container: ${containers.objectstorage}`);
1546
+ logger.log('info', ` ├─ API: http://127.0.0.1:${config.S3_PORT}`);
1547
+ logger.log('info', ` ├─ Management UI: http://127.0.0.1:${config.S3_UI_PORT}`);
1548
+ logger.log('info', ` └─ Bucket: ${config.S3_BUCKET}`);
1549
+ break;
1550
+ case 'stopped':
1551
+ logger.log('note', '📦 S3/ObjectStorage: 🟡 Stopped');
1552
+ logger.log('info', ` ├─ Container: ${containers.objectstorage}`);
1553
+ logger.log('info', ` ├─ API Port: ${config.S3_PORT}`);
1554
+ logger.log('info', ` └─ Management UI Port: ${config.S3_UI_PORT}`);
1555
+ break;
1556
+ case 'not_exists':
1557
+ logger.log('info', '📦 S3/ObjectStorage: Not installed');
1558
+ // Check port availability
1559
+ const s3Port = parseInt(config.S3_PORT);
1560
+ const s3UiPort = parseInt(config.S3_UI_PORT);
1561
+ const s3Available = await helpers.isPortAvailable(s3Port);
1562
+ const uiAvailable = await helpers.isPortAvailable(s3UiPort);
1563
+ if (!s3Available || !uiAvailable) {
1564
+ if (!s3Available) {
1565
+ logger.log('error', ` ├─ ⚠️ API Port ${s3Port} is in use`);
1566
+ }
1567
+ else {
1568
+ logger.log('info', ` ├─ API Port ${s3Port} is available`);
1569
+ }
1570
+ if (!uiAvailable) {
1571
+ logger.log('error', ` └─ ⚠️ Management UI Port ${s3UiPort} is in use`);
1572
+ }
1573
+ else {
1574
+ logger.log('info', ` └─ Management UI Port ${s3UiPort} is available`);
1575
+ }
1125
1576
  }
1126
1577
  else {
1127
1578
  logger.log('info', ` ├─ API Port ${s3Port} is available`);
1579
+ logger.log('info', ` └─ Management UI Port ${s3UiPort} is available`);
1128
1580
  }
1129
- if (!consoleAvailable) {
1130
- logger.log('error', ` └─ ⚠️ Console Port ${s3ConsolePort} is in use`);
1131
- }
1132
- else {
1133
- logger.log('info', ` └─ Console Port ${s3ConsolePort} is available`);
1134
- }
1135
- }
1136
- else {
1137
- logger.log('info', ` ├─ API Port ${s3Port} is available`);
1138
- logger.log('info', ` └─ Console Port ${s3ConsolePort} is available`);
1139
- }
1140
- break;
1581
+ break;
1582
+ }
1583
+ if (structuredStatus.legacy.minioContainer ||
1584
+ structuredStatus.legacy.minioDataExists) {
1585
+ logger.log('note', ' Legacy MinIO resources are preserved and block automatic ObjectStorage startup; run `gitzone services start s3` for exact migration instructions.');
1141
1586
  }
1142
1587
  // Elasticsearch status
1143
1588
  const esStatus = await this.docker.getStatus(containers.elasticsearch);
@@ -1179,7 +1624,7 @@ export class ServiceManager {
1179
1624
  const directories = this.config.getDataDirectories();
1180
1625
  const entries = [
1181
1626
  { label: 'MongoDB', path: directories.mongo },
1182
- { label: 'S3/MinIO', path: directories.minio },
1627
+ { label: 'S3/ObjectStorage', path: directories.objectstorage },
1183
1628
  { label: 'Elasticsearch', path: directories.elasticsearch },
1184
1629
  ];
1185
1630
  console.log();
@@ -1193,11 +1638,20 @@ export class ServiceManager {
1193
1638
  total += size;
1194
1639
  logger.log('info', ` ${entry.label}: ${helpers.formatBytes(size)} (${entry.path})`);
1195
1640
  }
1641
+ const legacyDataPath = getLegacyMinioDataDirectory(process.cwd());
1642
+ const legacyDataExists = await plugins.smartfs.directory(legacyDataPath).exists();
1196
1643
  if (total === 0) {
1197
- logger.log('info', ' No service data directories present');
1644
+ logger.log('info', ' No canonical service data directories present');
1645
+ }
1646
+ else {
1647
+ logger.log('info', ` Total: ${helpers.formatBytes(total)}`);
1648
+ }
1649
+ if (legacyDataExists) {
1650
+ logger.log('note', ` Legacy MinIO data is preserved and excluded from cleanup: ${legacyDataPath}`);
1651
+ }
1652
+ if (total === 0 && !legacyDataExists) {
1198
1653
  return;
1199
1654
  }
1200
- logger.log('info', ` Total: ${helpers.formatBytes(total)}`);
1201
1655
  logger.log('note', ' Remove containers but keep data: `gitzone services remove`; remove data too: `gitzone services clean`');
1202
1656
  }
1203
1657
  /**
@@ -1217,18 +1671,20 @@ export class ServiceManager {
1217
1671
  logger.log('info', ` Data: ${this.config.getDataDirectories().mongo}`);
1218
1672
  logger.log('info', ` Connection: ${this.config.getMongoConnectionString()}`);
1219
1673
  console.log();
1220
- logger.log('note', 'S3/MinIO:');
1674
+ logger.log('note', 'S3/ObjectStorage:');
1221
1675
  logger.log('info', ` Host: ${config.S3_HOST}`);
1222
1676
  logger.log('info', ` API Port: ${config.S3_PORT}`);
1223
- logger.log('info', ` Console Port: ${config.S3_CONSOLE_PORT}`);
1677
+ logger.log('info', ` Management UI Port: ${config.S3_UI_PORT}`);
1224
1678
  logger.log('info', ' Access Key: ***');
1225
1679
  logger.log('info', ' Secret Key: ***');
1680
+ logger.log('info', ' Admin Password: ***');
1226
1681
  logger.log('info', ` Bucket: ${config.S3_BUCKET}`);
1227
1682
  logger.log('info', ` Use SSL: ${config.S3_USESSL}`);
1228
- logger.log('info', ` Container: ${this.config.getContainerNames().minio}`);
1229
- logger.log('info', ` Data: ${this.config.getDataDirectories().minio}`);
1683
+ logger.log('info', ` Region: ${config.S3_REGION}`);
1684
+ logger.log('info', ` Container: ${this.config.getContainerNames().objectstorage}`);
1685
+ logger.log('info', ` Data: ${this.config.getDataDirectories().objectstorage}`);
1230
1686
  logger.log('info', ` Endpoint: ${config.S3_ENDPOINT}`);
1231
- logger.log('info', ` Console URL: http://${config.S3_HOST}:${config.S3_CONSOLE_PORT}`);
1687
+ logger.log('info', ` Management UI: http://127.0.0.1:${config.S3_UI_PORT}`);
1232
1688
  console.log();
1233
1689
  logger.log('note', 'Elasticsearch:');
1234
1690
  logger.log('info', ` Host: ${config.ELASTICSEARCH_HOST}:${config.ELASTICSEARCH_PORT}`);
@@ -1278,15 +1734,35 @@ export class ServiceManager {
1278
1734
  logger.log('note', 'MongoDB container is not running');
1279
1735
  }
1280
1736
  break;
1281
- case 'minio':
1737
+ case 'objectstorage':
1282
1738
  case 's3':
1283
- if (await this.docker.isRunning(containers.minio)) {
1284
- helpers.printHeader(`S3/MinIO Logs (last ${lines} lines)`);
1285
- const logs = await this.docker.logs(containers.minio, lines);
1286
- console.log(logs);
1287
- }
1288
- else {
1289
- logger.log('note', 'S3/MinIO container is not running');
1739
+ {
1740
+ const directories = this.config.getDataDirectories();
1741
+ const labels = getServiceContainerLabels({
1742
+ projectPath: process.cwd(),
1743
+ service: 'objectstorage',
1744
+ dataPath: directories.objectstorage,
1745
+ });
1746
+ const timeout = () => ({ timeoutMs: 60_000 });
1747
+ const id = await this.discoverContainerIdByExactName(containers.objectstorage, timeout);
1748
+ if (!id) {
1749
+ logger.log('note', 'S3/ObjectStorage container does not exist');
1750
+ break;
1751
+ }
1752
+ await this.revalidateObjectStorageContainer(id, containers.objectstorage, labels, timeout);
1753
+ helpers.printHeader(`S3/ObjectStorage Logs (last ${lines} lines)`);
1754
+ const result = await this.docker.execArgv(['logs', '--tail', String(lines), id], timeout());
1755
+ const config = this.config.getConfig();
1756
+ let output = `${result.stdout}${result.stderr}`;
1757
+ const secrets = Array.from(new Set([
1758
+ config.S3_ACCESSKEY,
1759
+ config.S3_SECRETKEY,
1760
+ config.S3_ADMIN_PASSWORD,
1761
+ ].filter(Boolean))).sort((secretA, secretB) => secretB.length - secretA.length);
1762
+ for (const secret of secrets) {
1763
+ output = output.split(secret).join('***');
1764
+ }
1765
+ console.log(output);
1290
1766
  }
1291
1767
  break;
1292
1768
  case 'elasticsearch':
@@ -1304,7 +1780,7 @@ export class ServiceManager {
1304
1780
  case '':
1305
1781
  await this.showLogs('mongo', lines);
1306
1782
  console.log();
1307
- await this.showLogs('minio', lines);
1783
+ await this.showLogs('objectstorage', lines);
1308
1784
  console.log();
1309
1785
  await this.showLogs('elasticsearch', lines);
1310
1786
  break;
@@ -1317,36 +1793,132 @@ export class ServiceManager {
1317
1793
  * Remove containers
1318
1794
  */
1319
1795
  async removeContainers() {
1796
+ await this.withProjectServiceLocks(process.cwd(), () => this.removeContainersLocked());
1797
+ }
1798
+ async removeContainersLocked() {
1799
+ await this.config.reloadFromDisk();
1320
1800
  const containers = this.config.getContainerNames();
1321
- let removed = false;
1322
- if (await this.docker.exists(containers.mongo)) {
1323
- if (await this.docker.remove(containers.mongo, true)) {
1324
- logger.log('ok', ' MongoDB container removed ✓');
1325
- removed = true;
1801
+ const directories = this.config.getDataDirectories();
1802
+ const projectPath = plugins.path.resolve(process.cwd());
1803
+ const registryProjects = await this.globalRegistry.getAllProjects();
1804
+ const registryProject = Object.entries(registryProjects).find(([registeredPathArg]) => plugins.path.resolve(registeredPathArg) === projectPath)?.[1];
1805
+ const targets = new Map();
1806
+ const addTarget = (serviceArg, nameArg, registeredArg) => {
1807
+ if (!nameArg)
1808
+ return;
1809
+ const existing = targets.get(nameArg);
1810
+ if (existing && existing.service !== serviceArg) {
1811
+ throw new Error(`Refusing ambiguous service container name: ${nameArg}`);
1326
1812
  }
1327
- }
1328
- if (await this.docker.exists(containers.minio)) {
1329
- if (await this.docker.remove(containers.minio, true)) {
1330
- logger.log('ok', ' S3/MinIO container removed ✓');
1331
- removed = true;
1813
+ targets.set(nameArg, {
1814
+ service: serviceArg,
1815
+ name: nameArg,
1816
+ registered: registeredArg || existing?.registered === true,
1817
+ });
1818
+ };
1819
+ addTarget('mongodb', containers.mongo, false);
1820
+ addTarget('objectstorage', containers.objectstorage, false);
1821
+ addTarget('elasticsearch', containers.elasticsearch, false);
1822
+ addTarget('mongodb', registryProject?.containers.mongo, true);
1823
+ addTarget('objectstorage', registryProject?.containers.objectstorage, true);
1824
+ addTarget('elasticsearch', registryProject?.containers.elasticsearch, true);
1825
+ const plannedRemovals = [];
1826
+ for (const target of targets.values()) {
1827
+ const id = await this.discoverContainerIdByExactName(target.name, () => ({ timeoutMs: 60_000 }));
1828
+ if (!id)
1829
+ continue;
1830
+ const inspections = await this.docker.inspectMany([id]);
1831
+ const inspection = inspections[0];
1832
+ if (!inspection || inspection.id !== id || inspection.name !== target.name) {
1833
+ throw new Error(`Refusing ambiguous service container identity: ${target.name}`);
1332
1834
  }
1333
- }
1334
- if (await this.docker.exists(containers.elasticsearch)) {
1335
- if (await this.docker.remove(containers.elasticsearch, true)) {
1336
- logger.log('ok', ' Elasticsearch container removed ✓');
1337
- removed = true;
1835
+ const expectedLabels = getServiceContainerLabels({
1836
+ projectPath,
1837
+ service: target.service,
1838
+ dataPath: target.service === 'mongodb'
1839
+ ? directories.mongo
1840
+ : target.service === 'objectstorage'
1841
+ ? directories.objectstorage
1842
+ : directories.elasticsearch,
1843
+ });
1844
+ const labelOwned = hasExactServiceContainerLabels(inspection.labels, expectedLabels);
1845
+ const hasGitZoneLabels = Object.keys(inspection.labels).some((keyArg) => keyArg.startsWith('git.zone.'));
1846
+ const registryClaims = Object.entries(registryProjects).flatMap(([registeredPathArg, projectArg]) => {
1847
+ const claims = [];
1848
+ if (projectArg.containers.mongo === target.name) {
1849
+ claims.push({ projectPath: plugins.path.resolve(registeredPathArg), service: 'mongodb' });
1850
+ }
1851
+ if (projectArg.containers.objectstorage === target.name) {
1852
+ claims.push({
1853
+ projectPath: plugins.path.resolve(registeredPathArg),
1854
+ service: 'objectstorage',
1855
+ });
1856
+ }
1857
+ if (projectArg.containers.elasticsearch === target.name) {
1858
+ claims.push({
1859
+ projectPath: plugins.path.resolve(registeredPathArg),
1860
+ service: 'elasticsearch',
1861
+ });
1862
+ }
1863
+ return claims;
1864
+ });
1865
+ const registryOwned = !hasGitZoneLabels &&
1866
+ target.registered &&
1867
+ target.service !== 'objectstorage' &&
1868
+ registryClaims.length === 1 &&
1869
+ registryClaims[0].projectPath === projectPath &&
1870
+ registryClaims[0].service === target.service;
1871
+ if (!labelOwned && !registryOwned) {
1872
+ throw new Error(`Refusing to remove container with unproven ownership: ${target.name}`);
1338
1873
  }
1339
- }
1340
- if (!removed) {
1874
+ plannedRemovals.push({ service: target.service, name: target.name, inspection });
1875
+ }
1876
+ if (plannedRemovals.some((removalArg) => removalArg.service === 'objectstorage') &&
1877
+ (await plugins.smartfs.directory(directories.objectstorage).exists())) {
1878
+ await this.repairObjectStorageMarkerFromOwnedContainer(directories.objectstorage);
1879
+ }
1880
+ for (const removal of plannedRemovals) {
1881
+ await this.docker.execArgv(['rm', '-f', removal.inspection.id], { timeoutMs: 60_000 });
1882
+ const label = removal.service === 'mongodb'
1883
+ ? 'MongoDB'
1884
+ : removal.service === 'objectstorage'
1885
+ ? 'S3/ObjectStorage'
1886
+ : 'Elasticsearch';
1887
+ logger.log('ok', ` ${label} container removed ✓`);
1888
+ }
1889
+ if (plannedRemovals.length === 0) {
1341
1890
  logger.log('note', ' No containers to remove');
1342
1891
  }
1343
- // Check if all containers are gone, then unregister from global registry
1344
- const mongoExists = await this.docker.exists(containers.mongo);
1345
- const minioExists = await this.docker.exists(containers.minio);
1346
- const esExists = await this.docker.exists(containers.elasticsearch);
1347
- if (!mongoExists && !minioExists && !esExists) {
1348
- await this.globalRegistry.unregisterProject(process.cwd());
1892
+ // Re-read and prove every current claim absent while all service locks are
1893
+ // still held. A concurrent internal start cannot appear between this check
1894
+ // and the compare-delete registry transaction.
1895
+ const currentProjects = await this.globalRegistry.getAllProjects();
1896
+ const currentProject = Object.entries(currentProjects).find(([registeredPathArg]) => plugins.path.resolve(registeredPathArg) === projectPath)?.[1];
1897
+ const legacyDataExists = await plugins.smartfs.directory(getLegacyMinioDataDirectory(projectPath)).exists();
1898
+ if (currentProject && !currentProject.legacy?.minioContainer && !legacyDataExists) {
1899
+ const labeledIds = await this.docker.listIds([
1900
+ `label=git.zone.project-path=${projectPath}`,
1901
+ ]);
1902
+ let registeredContainerExists = labeledIds.length > 0;
1903
+ for (const containerName of Object.values(currentProject.containers)) {
1904
+ if (!containerName)
1905
+ continue;
1906
+ if (await this.discoverContainerIdByExactName(containerName, () => ({ timeoutMs: 60_000 }))) {
1907
+ registeredContainerExists = true;
1908
+ break;
1909
+ }
1910
+ }
1911
+ if (!registeredContainerExists) {
1912
+ await this.globalRegistry.unregisterProject(process.cwd(), currentProject);
1913
+ }
1914
+ }
1915
+ }
1916
+ async withProjectServiceLocks(projectPathArg, actionArg, serviceIndexArg = 0) {
1917
+ const service = serviceNames[serviceIndexArg];
1918
+ if (!service) {
1919
+ return actionArg();
1349
1920
  }
1921
+ return withServiceDataOperationLock(projectPathArg, service, () => this.withProjectServiceLocks(projectPathArg, actionArg, serviceIndexArg + 1));
1350
1922
  }
1351
1923
  /**
1352
1924
  * Clean data directories
@@ -1355,23 +1927,28 @@ export class ServiceManager {
1355
1927
  const directories = this.config.getDataDirectories();
1356
1928
  const targets = [
1357
1929
  { label: 'MongoDB', service: 'mongodb', path: directories.mongo },
1358
- { label: 'S3/MinIO', service: 'minio', path: directories.minio },
1930
+ { label: 'S3/ObjectStorage', service: 'objectstorage', path: directories.objectstorage },
1359
1931
  { label: 'Elasticsearch', service: 'elasticsearch', path: directories.elasticsearch },
1360
1932
  ];
1361
1933
  let cleaned = false;
1362
1934
  for (const target of targets) {
1363
- if (!(await plugins.smartfs.directory(target.path).exists())) {
1935
+ const removed = await this.docker.removeDataDirectory(target.path, serviceImages[target.service], {
1936
+ projectPath: process.cwd(),
1937
+ service: target.service,
1938
+ });
1939
+ if (!removed) {
1364
1940
  continue;
1365
1941
  }
1366
- // Escalates to a privileged one-off container when needed; throws rather
1367
- // than leaving a partially deleted (and for MongoDB, corrupt) directory.
1368
- await this.docker.removeDataDirectory(target.path, serviceImages[target.service]);
1369
1942
  logger.log('ok', ` ${target.label} data removed ✓`);
1370
1943
  cleaned = true;
1371
1944
  }
1372
1945
  if (!cleaned) {
1373
1946
  logger.log('note', ' No data to clean');
1374
1947
  }
1948
+ const legacyDataPath = getLegacyMinioDataDirectory(process.cwd());
1949
+ if (await plugins.smartfs.directory(legacyDataPath).exists()) {
1950
+ logger.log('note', ` Legacy MinIO data was preserved and not modified: ${legacyDataPath}`);
1951
+ }
1375
1952
  }
1376
1953
  /**
1377
1954
  * Configure which services are enabled
@@ -1379,7 +1956,7 @@ export class ServiceManager {
1379
1956
  async configureServices() {
1380
1957
  logger.log('note', 'Select which services to enable for this project:');
1381
1958
  console.log();
1382
- const currentServices = this.enabledServices || ['mongodb', 'minio', 'elasticsearch'];
1959
+ const currentServices = this.enabledServices || ['mongodb', 'objectstorage', 'elasticsearch'];
1383
1960
  const smartinteract = new plugins.smartinteract.SmartInteract();
1384
1961
  const response = await smartinteract.askQuestion({
1385
1962
  name: 'services',
@@ -1387,12 +1964,12 @@ export class ServiceManager {
1387
1964
  message: 'Which services do you want to enable?',
1388
1965
  choices: [
1389
1966
  { name: 'MongoDB', value: 'mongodb' },
1390
- { name: 'MinIO (S3)', value: 'minio' },
1967
+ { name: 'ObjectStorage (S3)', value: 'objectstorage' },
1391
1968
  { name: 'Elasticsearch', value: 'elasticsearch' }
1392
1969
  ],
1393
1970
  default: currentServices
1394
1971
  });
1395
- const enabledServices = response.value || ['mongodb', 'minio', 'elasticsearch'];
1972
+ const enabledServices = response.value || ['mongodb', 'objectstorage', 'elasticsearch'];
1396
1973
  this.enabledServices = enabledServices;
1397
1974
  // Save to .smartconfig.json
1398
1975
  await this.saveServiceConfiguration(enabledServices);
@@ -1403,24 +1980,9 @@ export class ServiceManager {
1403
1980
  */
1404
1981
  async reconfigure() {
1405
1982
  helpers.printHeader('Reconfiguring Services');
1406
- const containers = this.config.getContainerNames();
1407
- // Stop existing containers
1408
- logger.log('note', '🛑 Stopping existing containers...');
1409
- if (await this.docker.exists(containers.mongo)) {
1410
- await this.docker.stop(containers.mongo);
1411
- logger.log('ok', ' MongoDB stopped ✓');
1412
- }
1413
- if (await this.docker.exists(containers.minio)) {
1414
- await this.docker.stop(containers.minio);
1415
- logger.log('ok', ' S3/MinIO stopped ✓');
1416
- }
1417
- if (await this.docker.exists(containers.elasticsearch)) {
1418
- await this.docker.stop(containers.elasticsearch);
1419
- logger.log('ok', ' Elasticsearch stopped ✓');
1420
- }
1421
- // Reconfigure ports
1422
- await this.config.reconfigurePorts();
1423
- // Ask if user wants to restart services
1983
+ await this.withProjectServiceLocks(process.cwd(), () => this.reconfigureLocked());
1984
+ // Ask if user wants to restart services after releasing the reconfiguration
1985
+ // locks; startAll acquires the same locks one service at a time.
1424
1986
  const smartinteract = new plugins.smartinteract.SmartInteract();
1425
1987
  const response = await smartinteract.askQuestion({
1426
1988
  name: 'restart',
@@ -1431,7 +1993,19 @@ export class ServiceManager {
1431
1993
  if (response.value) {
1432
1994
  console.log();
1433
1995
  await this.startAll();
1996
+ await this.registerWithGlobalRegistry();
1434
1997
  }
1435
1998
  }
1999
+ async reconfigureLocked() {
2000
+ await this.config.reloadFromDisk();
2001
+ await this.assertNoLegacyMinioResources(() => ({ timeoutMs: 60_000 }));
2002
+ // Stop existing containers
2003
+ logger.log('note', '🛑 Stopping existing containers...');
2004
+ await this.stopMongoDBLocked();
2005
+ await this.stopObjectStorageLocked();
2006
+ await this.stopElasticsearchLocked();
2007
+ // Reconfigure ports
2008
+ await this.config.reconfigurePorts();
2009
+ }
1436
2010
  }
1437
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2aWNlbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9zZXJ2aWNlcy9jbGFzc2VzLnNlcnZpY2VtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQiw4QkFBOEIsR0FDL0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGtCQUFrQixHQUduQixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLDBCQUEwQixFQUMxQixhQUFhLEdBRWQsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFtQy9DLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLE1BQU07S0FDYjtDQUNnQyxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLE1BQU0sQ0FBQztBQUNuRCxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNyQyxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQUNqQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNyQyxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUM7QUFDbkMsTUFBTSxxQkFBcUIsR0FDekIsdUdBQXVHLENBQUM7QUFpQjFHLE1BQU0saUJBQWlCLEdBQThCO0lBQ25ELEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ3JCLEtBQUssRUFBRSxL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
2011
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zZXJ2aWNlbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL21vZF9zZXJ2aWNlcy9jbGFzc2VzLnNlcnZpY2VtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLG9CQUFvQixFQUNwQiw4QkFBOEIsR0FFL0IsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGtCQUFrQixHQUduQixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6Qix1QkFBdUIsRUFDdkIsOEJBQThCLEVBQzlCLGdDQUFnQyxFQUNoQyxrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQixvQkFBb0IsRUFDcEIsYUFBYSxFQUNiLFlBQVksRUFDWixxQkFBcUIsRUFDckIsZ0JBQWdCLEdBRWpCLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0UsT0FBTyxFQUNMLG9CQUFvQixHQUVyQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHVCQUF1QixFQUN2QixvQkFBb0IsR0FDckIsTUFBTSwyQkFBMkIsQ0FBQztBQXFDbkMsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsQ0FDOUMsWUFBc0MsRUFDWixFQUFFLENBQUM7SUFDN0IsaUJB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