spindb 0.71.1 → 0.71.3
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.
- package/dist/cli/commands/menu/container-handlers.js +36 -1
- package/dist/cli/commands/menu/container-handlers.js.map +1 -1
- package/dist/cli/commands/start.js +37 -35
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/config/version.js +1 -1
- package/dist/core/branch-manager.js +160 -10
- package/dist/core/branch-manager.js.map +1 -1
- package/dist/core/container-manager.js +12 -4
- package/dist/core/container-manager.js.map +1 -1
- package/dist/core/process-manager.js +10 -2
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/start-binaries.js +71 -0
- package/dist/core/start-binaries.js.map +1 -0
- package/dist/engines/base-engine.js +17 -0
- package/dist/engines/base-engine.js.map +1 -1
- package/dist/engines/postgresql/index.js +20 -1
- package/dist/engines/postgresql/index.js.map +1 -1
- package/dist/engines/postgresql/online-branch.js +325 -0
- package/dist/engines/postgresql/online-branch.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { appendFile, copyFile, mkdir, mkdtemp, open, readdir, rm, stat, lstat, statfs, readFile, writeFile, realpath, } from 'node:fs/promises';
|
|
4
|
+
import { dirname, join, relative, isAbsolute, sep } from 'node:path';
|
|
5
|
+
import { paths } from '../../config/paths.js';
|
|
6
|
+
import { defaults } from '../../config/defaults.js';
|
|
7
|
+
import { getBundledBinaryPath } from '../../core/pg-binary-resolver.js';
|
|
8
|
+
import { loadCredentials, listCredentials } from '../../core/credential-manager.js';
|
|
9
|
+
import { registerTempDump, trackDumpProcess, } from '../../core/temp-dump-cleanup.js';
|
|
10
|
+
import { Engine } from '../../types/index.js';
|
|
11
|
+
const execFileAsync = promisify(execFile);
|
|
12
|
+
async function directoryBytes(path) {
|
|
13
|
+
let total = 0;
|
|
14
|
+
for (const entry of await readdir(path, { withFileTypes: true })) {
|
|
15
|
+
const child = join(path, entry.name);
|
|
16
|
+
if (entry.isSymbolicLink()) {
|
|
17
|
+
throw new Error('Online PostgreSQL branching requires a self-contained data directory. External paths are not supported; the source remains running.');
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
if (entry.isDirectory())
|
|
21
|
+
total += await directoryBytes(child);
|
|
22
|
+
else if (entry.isFile())
|
|
23
|
+
total += (await stat(child)).size;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
// PostgreSQL can remove transient files while the source is running.
|
|
27
|
+
if (error.code !== 'ENOENT')
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return total;
|
|
32
|
+
}
|
|
33
|
+
/** PostgreSQL emits regular files and directories; refuse links and paths outside the backup. */
|
|
34
|
+
export async function validateBranchArchive(path) {
|
|
35
|
+
const file = await open(path, 'r');
|
|
36
|
+
try {
|
|
37
|
+
const { size } = await file.stat();
|
|
38
|
+
let offset = 0;
|
|
39
|
+
while (offset + 512 <= size) {
|
|
40
|
+
const header = Buffer.alloc(512);
|
|
41
|
+
await file.read(header, 0, 512, offset);
|
|
42
|
+
if (header.every((byte) => byte === 0))
|
|
43
|
+
return;
|
|
44
|
+
const field = (start, end) => header.subarray(start, end).toString('utf8').split('\0')[0];
|
|
45
|
+
const prefix = field(345, 500);
|
|
46
|
+
const name = `${prefix ? `${prefix}/` : ''}${field(0, 100)}`;
|
|
47
|
+
const type = header[156];
|
|
48
|
+
if (!name ||
|
|
49
|
+
name.startsWith('/') ||
|
|
50
|
+
name.includes('\\') ||
|
|
51
|
+
/^[a-z]:/i.test(name) ||
|
|
52
|
+
name.split('/').includes('..') ||
|
|
53
|
+
![0, 48, 53].includes(type)) {
|
|
54
|
+
throw new Error('Online PostgreSQL branch contains an unsupported archive entry. The source has not been stopped.');
|
|
55
|
+
}
|
|
56
|
+
const sizeText = field(124, 136).trim();
|
|
57
|
+
const entrySize = /^[0-7]+$/.test(sizeText) ? parseInt(sizeText, 8) : NaN;
|
|
58
|
+
if (!Number.isSafeInteger(entrySize) || entrySize < 0) {
|
|
59
|
+
throw new Error('Invalid PostgreSQL backup archive size');
|
|
60
|
+
}
|
|
61
|
+
offset += 512 + Math.ceil(entrySize / 512) * 512;
|
|
62
|
+
if (offset > size)
|
|
63
|
+
throw new Error('Truncated PostgreSQL backup archive');
|
|
64
|
+
}
|
|
65
|
+
throw new Error('PostgreSQL backup archive has no end marker');
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
await file.close();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function configString(value) {
|
|
72
|
+
return `'${value.replaceAll('\\', '/').replaceAll("'", "''")}'`;
|
|
73
|
+
}
|
|
74
|
+
export async function refreshOnlineBranchPaths(dataPath) {
|
|
75
|
+
try {
|
|
76
|
+
await readFile(join(dataPath, '.spindb-online-branch'), 'utf8');
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error.code === 'ENOENT')
|
|
80
|
+
return;
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
const file = join(dataPath, 'postgresql.auto.conf');
|
|
84
|
+
let content;
|
|
85
|
+
try {
|
|
86
|
+
content = await readFile(file, 'utf8');
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (error.code === 'ENOENT')
|
|
90
|
+
return;
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
for (const [key, value] of [
|
|
94
|
+
['data_directory', dataPath],
|
|
95
|
+
['hba_file', join(dataPath, 'pg_hba.conf')],
|
|
96
|
+
['ident_file', join(dataPath, 'pg_ident.conf')],
|
|
97
|
+
]) {
|
|
98
|
+
content = content.replace(new RegExp(`^${key}\\s*=.*\\n?`, 'gm'), '');
|
|
99
|
+
content += `\n${key} = ${configString(value)}\n`;
|
|
100
|
+
}
|
|
101
|
+
await writeFile(file, content);
|
|
102
|
+
}
|
|
103
|
+
/** Prevent a fork from writing into its parent's paths or running inherited replication/jobs. */
|
|
104
|
+
export function branchConfigOverrides(dataPath, major) {
|
|
105
|
+
return ('\n# SpinDB online branch: independent paths and background workers\n' +
|
|
106
|
+
[
|
|
107
|
+
`data_directory = ${configString(dataPath)}`,
|
|
108
|
+
`hba_file = ${configString(join(dataPath, 'pg_hba.conf'))}`,
|
|
109
|
+
`ident_file = ${configString(join(dataPath, 'pg_ident.conf'))}`,
|
|
110
|
+
"external_pid_file = ''",
|
|
111
|
+
...(process.platform === 'win32'
|
|
112
|
+
? []
|
|
113
|
+
: ["unix_socket_directories = '/tmp'"]),
|
|
114
|
+
'logging_collector = off',
|
|
115
|
+
'archive_mode = off',
|
|
116
|
+
"archive_command = ''",
|
|
117
|
+
...(major >= 15 ? ["archive_library = ''"] : []),
|
|
118
|
+
"restore_command = ''",
|
|
119
|
+
"archive_cleanup_command = ''",
|
|
120
|
+
"recovery_end_command = ''",
|
|
121
|
+
"primary_conninfo = ''",
|
|
122
|
+
"primary_slot_name = ''",
|
|
123
|
+
"synchronous_standby_names = ''",
|
|
124
|
+
'max_logical_replication_workers = 0',
|
|
125
|
+
"shared_preload_libraries = ''",
|
|
126
|
+
"session_preload_libraries = ''",
|
|
127
|
+
"local_preload_libraries = ''",
|
|
128
|
+
"ssl_passphrase_command = ''",
|
|
129
|
+
].join('\n') +
|
|
130
|
+
'\n');
|
|
131
|
+
}
|
|
132
|
+
export async function retargetPostgresBranchCredentials(container) {
|
|
133
|
+
for (const username of await listCredentials(container.name, Engine.PostgreSQL)) {
|
|
134
|
+
const credential = await loadCredentials(container.name, Engine.PostgreSQL, username);
|
|
135
|
+
if (!credential)
|
|
136
|
+
continue;
|
|
137
|
+
let connection;
|
|
138
|
+
try {
|
|
139
|
+
connection = new URL(credential.connectionString);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Cloud stores a host:port placeholder alongside the full credential fields.
|
|
143
|
+
if (!/^(127\.0\.0\.1|localhost):[0-9]+$/.test(credential.connectionString)) {
|
|
144
|
+
throw new Error('Cannot rewrite an invalid branch credential URL');
|
|
145
|
+
}
|
|
146
|
+
connection = new URL('postgresql://127.0.0.1');
|
|
147
|
+
connection.username = credential.username;
|
|
148
|
+
connection.password = credential.password;
|
|
149
|
+
connection.pathname = `/${credential.database || container.database}`;
|
|
150
|
+
}
|
|
151
|
+
connection.hostname = '127.0.0.1';
|
|
152
|
+
connection.port = String(container.port);
|
|
153
|
+
const credentialPath = join(paths.getContainerPath(container.name, { engine: Engine.PostgreSQL }), 'credentials', `.env.${username}`);
|
|
154
|
+
// Preserve the storage alias: Cloud's .env.spindb can contain another DB_USER.
|
|
155
|
+
const content = (await readFile(credentialPath, 'utf8'))
|
|
156
|
+
.split('\n')
|
|
157
|
+
.filter((line) => !/^\s*DB_(HOST|PORT|URL)\s*=/.test(line))
|
|
158
|
+
.join('\n');
|
|
159
|
+
await writeFile(credentialPath, `${content}\nDB_HOST=127.0.0.1\nDB_PORT=${container.port}\nDB_URL=${connection.toString()}\n`, { mode: 0o600 });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** Native streamed-WAL backup: never stops the source or falls back to an offline copy. */
|
|
163
|
+
export async function copyOnlinePostgresContainer(source, options) {
|
|
164
|
+
const major = Number(source.version.split('.')[0]);
|
|
165
|
+
const binary = getBundledBinaryPath('pg_basebackup', String(major));
|
|
166
|
+
const psql = getBundledBinaryPath('psql', String(major));
|
|
167
|
+
if (!binary || !psql) {
|
|
168
|
+
throw new Error(`Online branching needs pg_basebackup. Run "spindb engines download postgresql ${major}" and retry. The source has not been stopped.`);
|
|
169
|
+
}
|
|
170
|
+
const sourcePath = paths.getContainerPath(source.name, {
|
|
171
|
+
engine: Engine.PostgreSQL,
|
|
172
|
+
});
|
|
173
|
+
const credentials = await loadCredentials(source.name, Engine.PostgreSQL, defaults.superuser);
|
|
174
|
+
const { targetPath } = options;
|
|
175
|
+
const connectionArgs = [
|
|
176
|
+
'--host=127.0.0.1',
|
|
177
|
+
`--port=${source.port}`,
|
|
178
|
+
`--username=${credentials?.username || defaults.superuser}`,
|
|
179
|
+
'--no-password',
|
|
180
|
+
];
|
|
181
|
+
const environment = {
|
|
182
|
+
...process.env,
|
|
183
|
+
PGCONNECT_TIMEOUT: '10',
|
|
184
|
+
...(credentials?.password ? { PGPASSWORD: credentials.password } : {}),
|
|
185
|
+
};
|
|
186
|
+
const settingsResult = await execFileAsync(psql, [
|
|
187
|
+
...connectionArgs,
|
|
188
|
+
'--dbname=postgres',
|
|
189
|
+
'-X',
|
|
190
|
+
'-At',
|
|
191
|
+
'-v',
|
|
192
|
+
'ON_ERROR_STOP=1',
|
|
193
|
+
'-c',
|
|
194
|
+
`SELECT json_build_object(
|
|
195
|
+
'dataDirectory', current_setting('data_directory'),
|
|
196
|
+
'hba', current_setting('hba_file'),
|
|
197
|
+
'ident', current_setting('ident_file'),
|
|
198
|
+
'configFiles', (SELECT json_agg(DISTINCT sourcefile) FROM pg_file_settings WHERE sourcefile IS NOT NULL))`,
|
|
199
|
+
], { env: environment, timeout: 15_000, windowsHide: true });
|
|
200
|
+
const settings = JSON.parse(settingsResult.stdout);
|
|
201
|
+
const expectedData = await realpath(join(sourcePath, 'data'));
|
|
202
|
+
if ((await realpath(settings.dataDirectory)) !== expectedData ||
|
|
203
|
+
(await realpath(settings.hba)) !== join(expectedData, 'pg_hba.conf') ||
|
|
204
|
+
(await realpath(settings.ident)) !== join(expectedData, 'pg_ident.conf'))
|
|
205
|
+
throw new Error('Online PostgreSQL branching requires the standard self-contained data and authentication files; the source remains running.');
|
|
206
|
+
for (const path of settings.configFiles) {
|
|
207
|
+
const child = relative(expectedData, await realpath(path));
|
|
208
|
+
if (isAbsolute(child) || child === '..' || child.startsWith(`..${sep}`)) {
|
|
209
|
+
throw new Error('Online PostgreSQL branching does not support configuration includes outside its data directory; the source remains running.');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const sourceBytes = await directoryBytes(join(sourcePath, 'data'));
|
|
213
|
+
const available = await statfs(dirname(targetPath));
|
|
214
|
+
// The tar archives and extracted cluster coexist until verification finishes.
|
|
215
|
+
// Leave another copy's worth of headroom for concurrent WAL/data growth.
|
|
216
|
+
if (available.bavail * available.bsize <
|
|
217
|
+
sourceBytes * 3 + 256 * 1024 * 1024) {
|
|
218
|
+
throw new Error('Insufficient disk space for a safe online PostgreSQL branch. Free space for three copies of the source plus 256 MiB and retry; the source remains running.');
|
|
219
|
+
}
|
|
220
|
+
const releaseTarget = registerTempDump(targetPath);
|
|
221
|
+
let backupPath;
|
|
222
|
+
try {
|
|
223
|
+
backupPath = await mkdtemp(join(targetPath, '.online-backup-'));
|
|
224
|
+
// Tar format confines even external tablespaces to this scratch directory.
|
|
225
|
+
// Plain format can write tablespaces back to their original absolute paths.
|
|
226
|
+
const backup = execFileAsync(binary, [
|
|
227
|
+
...connectionArgs,
|
|
228
|
+
`--pgdata=${backupPath}`,
|
|
229
|
+
'--format=tar',
|
|
230
|
+
'--wal-method=stream',
|
|
231
|
+
'--checkpoint=fast',
|
|
232
|
+
], {
|
|
233
|
+
timeout: 30 * 60 * 1000,
|
|
234
|
+
env: environment,
|
|
235
|
+
windowsHide: true,
|
|
236
|
+
});
|
|
237
|
+
const releaseProcess = trackDumpProcess(backup.child);
|
|
238
|
+
try {
|
|
239
|
+
await backup;
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
releaseProcess();
|
|
243
|
+
}
|
|
244
|
+
const archives = await readdir(backupPath);
|
|
245
|
+
if (archives.some((name) => !['base.tar', 'pg_wal.tar', 'backup_manifest'].includes(name))) {
|
|
246
|
+
throw new Error('Online PostgreSQL branching does not yet support external tablespaces. The source has not been stopped or changed.');
|
|
247
|
+
}
|
|
248
|
+
// Validate both before extracting either. Never follow an inherited symlink.
|
|
249
|
+
for (const name of ['base.tar', 'pg_wal.tar']) {
|
|
250
|
+
await validateBranchArchive(join(backupPath, name));
|
|
251
|
+
}
|
|
252
|
+
const dataPath = join(targetPath, 'data');
|
|
253
|
+
await mkdir(dataPath, { mode: 0o700 });
|
|
254
|
+
for (const [name, destination] of [
|
|
255
|
+
['base.tar', dataPath],
|
|
256
|
+
['pg_wal.tar', join(dataPath, 'pg_wal')],
|
|
257
|
+
]) {
|
|
258
|
+
await mkdir(destination, { recursive: true, mode: 0o700 });
|
|
259
|
+
const extraction = execFileAsync('tar', ['-xf', join(backupPath, name), '-C', destination], { windowsHide: true });
|
|
260
|
+
const releaseExtraction = trackDumpProcess(extraction.child);
|
|
261
|
+
try {
|
|
262
|
+
await extraction;
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
releaseExtraction();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
await writeFile(join(dataPath, '.spindb-online-branch'), '1\n', {
|
|
269
|
+
mode: 0o600,
|
|
270
|
+
});
|
|
271
|
+
await appendFile(join(dataPath, 'postgresql.auto.conf'), branchConfigOverrides(dataPath, major));
|
|
272
|
+
for (const file of [
|
|
273
|
+
'standby.signal',
|
|
274
|
+
'recovery.signal',
|
|
275
|
+
'postmaster.pid',
|
|
276
|
+
'postmaster.opts',
|
|
277
|
+
]) {
|
|
278
|
+
await rm(join(dataPath, file), { force: true });
|
|
279
|
+
}
|
|
280
|
+
const credentialSource = join(sourcePath, 'credentials');
|
|
281
|
+
let credentialFiles = [];
|
|
282
|
+
try {
|
|
283
|
+
credentialFiles = await readdir(credentialSource);
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
if (error.code !== 'ENOENT')
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
if (credentialFiles.length) {
|
|
290
|
+
await mkdir(join(targetPath, 'credentials'), { mode: 0o700 });
|
|
291
|
+
for (const name of credentialFiles) {
|
|
292
|
+
if (!/^\.env\.[a-zA-Z][a-zA-Z0-9_]*$/.test(name))
|
|
293
|
+
continue;
|
|
294
|
+
const credential = join(credentialSource, name);
|
|
295
|
+
const info = await lstat(credential);
|
|
296
|
+
if (!info.isFile())
|
|
297
|
+
throw new Error('Unsupported credential file type');
|
|
298
|
+
await copyFile(credential, join(targetPath, 'credentials', name));
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Copy only metadata and credentials, never process state or auxiliary services.
|
|
302
|
+
for (const entry of await readdir(sourcePath, { withFileTypes: true })) {
|
|
303
|
+
if (entry.isFile() &&
|
|
304
|
+
(entry.name === 'container.json' ||
|
|
305
|
+
entry.name === '.env.spindb' ||
|
|
306
|
+
entry.name.startsWith('.env.spindb.'))) {
|
|
307
|
+
await copyFile(join(sourcePath, entry.name), join(targetPath, entry.name));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
await rm(targetPath, { recursive: true, force: true });
|
|
313
|
+
throw error;
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
try {
|
|
317
|
+
if (backupPath)
|
|
318
|
+
await rm(backupPath, { recursive: true, force: true });
|
|
319
|
+
}
|
|
320
|
+
finally {
|
|
321
|
+
releaseTarget();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=online-branch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"online-branch.js","sourceRoot":"","sources":["../../../engines/postgresql/online-branch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spindb",
|
|
3
|
-
"version": "0.71.
|
|
3
|
+
"version": "0.71.3",
|
|
4
4
|
"author": "Bob Bass <bob@bbass.co>",
|
|
5
5
|
"license": "PolyForm-Noncommercial-1.0.0",
|
|
6
6
|
"description": "Zero-config Docker-free local database containers. Create, backup, and clone a variety of popular databases.",
|