@styleflow.app/flowpress-deploy 1.0.0-beta.3 → 1.0.0-beta.30
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/CHANGELOG.md +156 -0
- package/README.md +5 -0
- package/composer.json +1 -1
- package/containers/cms/Dockerfile +35 -0
- package/containers/cms/Dockerfile.dockerignore +20 -0
- package/containers/cms/healthz.php +17 -0
- package/containers/cms/install-languages.sh +16 -0
- package/containers/cms/mpm.conf +10 -0
- package/containers/cms/php.ini +16 -0
- package/containers/cms/sanitize-integrations.php +14 -0
- package/containers/cms/sanitize.php +40 -0
- package/containers/cms/smtp.php +13 -0
- package/containers/cms/vhost.conf +61 -0
- package/containers/cms/wp-cli.yml +1 -0
- package/containers/local/cms/Dockerfile +18 -0
- package/containers/local/cms/entrypoint.sh +7 -0
- package/containers/local/cms/php.ini +8 -0
- package/containers/local/cms/vhost.conf +14 -0
- package/containers/local/runtimes.json +14 -0
- package/containers/local/web/Dockerfile +8 -0
- package/containers/local/web/entrypoint.sh +21 -0
- package/containers/php-runtime/Dockerfile +21 -0
- package/containers/web-ssr/Dockerfile +27 -0
- package/containers/web-ssr/Dockerfile.dockerignore +10 -0
- package/containers/web-static/Caddyfile +40 -0
- package/containers/web-static/Dockerfile +17 -0
- package/containers/web-static/Dockerfile.dockerignore +7 -0
- package/dist/development.d.ts +12 -0
- package/dist/development.d.ts.map +1 -0
- package/dist/development.js +57 -0
- package/dist/development.js.map +1 -0
- package/dist/node-fetch.d.ts +3 -0
- package/dist/node-fetch.d.ts.map +1 -0
- package/dist/node-fetch.js +20 -0
- package/dist/node-fetch.js.map +1 -0
- package/dist/ops/bootstrap.d.ts +24 -0
- package/dist/ops/bootstrap.d.ts.map +1 -0
- package/dist/ops/bootstrap.js +156 -0
- package/dist/ops/bootstrap.js.map +1 -0
- package/dist/ops/build.d.ts +45 -0
- package/dist/ops/build.d.ts.map +1 -0
- package/dist/ops/build.js +119 -0
- package/dist/ops/build.js.map +1 -0
- package/dist/ops/check.d.ts +14 -0
- package/dist/ops/check.d.ts.map +1 -0
- package/dist/ops/check.js +42 -0
- package/dist/ops/check.js.map +1 -0
- package/dist/ops/cli.d.ts +3 -0
- package/dist/ops/cli.d.ts.map +1 -0
- package/dist/ops/cli.js +198 -0
- package/dist/ops/cli.js.map +1 -0
- package/dist/ops/cms-migrate.d.ts +14 -0
- package/dist/ops/cms-migrate.d.ts.map +1 -0
- package/dist/ops/cms-migrate.js +133 -0
- package/dist/ops/cms-migrate.js.map +1 -0
- package/dist/ops/cms-template/command.d.mts +19 -0
- package/dist/ops/cms-template/command.d.mts.map +1 -0
- package/dist/ops/cms-template/command.mjs +145 -0
- package/dist/ops/cms-template/command.mjs.map +1 -0
- package/dist/ops/cms-template/confirm.d.mts +11 -0
- package/dist/ops/cms-template/confirm.d.mts.map +1 -0
- package/dist/ops/cms-template/confirm.mjs +18 -0
- package/dist/ops/cms-template/confirm.mjs.map +1 -0
- package/dist/ops/cms-template/entry.d.mts +2 -0
- package/dist/ops/cms-template/entry.d.mts.map +1 -0
- package/dist/ops/cms-template/entry.mjs +22 -0
- package/dist/ops/cms-template/entry.mjs.map +1 -0
- package/dist/ops/cms-template/git.d.mts +7 -0
- package/dist/ops/cms-template/git.d.mts.map +1 -0
- package/dist/ops/cms-template/git.mjs +22 -0
- package/dist/ops/cms-template/git.mjs.map +1 -0
- package/dist/ops/cms-template/plan.d.mts +7 -0
- package/dist/ops/cms-template/plan.d.mts.map +1 -0
- package/dist/ops/cms-template/plan.mjs +54 -0
- package/dist/ops/cms-template/plan.mjs.map +1 -0
- package/dist/ops/cms-template/store.d.mts +21 -0
- package/dist/ops/cms-template/store.d.mts.map +1 -0
- package/dist/ops/cms-template/store.mjs +184 -0
- package/dist/ops/cms-template/store.mjs.map +1 -0
- package/dist/ops/cms-template/target.d.mts +15 -0
- package/dist/ops/cms-template/target.d.mts.map +1 -0
- package/dist/ops/cms-template/target.mjs +24 -0
- package/dist/ops/cms-template/target.mjs.map +1 -0
- package/dist/ops/cms-template/transport.d.mts +26 -0
- package/dist/ops/cms-template/transport.d.mts.map +1 -0
- package/dist/ops/cms-template/transport.mjs +115 -0
- package/dist/ops/cms-template/transport.mjs.map +1 -0
- package/dist/ops/config.d.ts +54 -0
- package/dist/ops/config.d.ts.map +1 -0
- package/dist/ops/config.js +221 -0
- package/dist/ops/config.js.map +1 -0
- package/dist/ops/coolify.d.ts +2 -0
- package/dist/ops/coolify.d.ts.map +1 -0
- package/dist/ops/coolify.js +44 -0
- package/dist/ops/coolify.js.map +1 -0
- package/dist/ops/data.d.ts +31 -0
- package/dist/ops/data.d.ts.map +1 -0
- package/dist/ops/data.js +165 -0
- package/dist/ops/data.js.map +1 -0
- package/dist/ops/deploy.d.ts +38 -0
- package/dist/ops/deploy.d.ts.map +1 -0
- package/dist/ops/deploy.js +127 -0
- package/dist/ops/deploy.js.map +1 -0
- package/dist/ops/editorial.d.ts +23 -0
- package/dist/ops/editorial.d.ts.map +1 -0
- package/dist/ops/editorial.js +79 -0
- package/dist/ops/editorial.js.map +1 -0
- package/dist/ops/environment-files.d.ts +9 -0
- package/dist/ops/environment-files.d.ts.map +1 -0
- package/dist/ops/environment-files.js +128 -0
- package/dist/ops/environment-files.js.map +1 -0
- package/dist/ops/environment.d.ts +31 -0
- package/dist/ops/environment.d.ts.map +1 -0
- package/dist/ops/environment.js +165 -0
- package/dist/ops/environment.js.map +1 -0
- package/dist/ops/features.d.ts +12 -0
- package/dist/ops/features.d.ts.map +1 -0
- package/dist/ops/features.js +71 -0
- package/dist/ops/features.js.map +1 -0
- package/dist/ops/health.d.ts +26 -0
- package/dist/ops/health.d.ts.map +1 -0
- package/dist/ops/health.js +27 -0
- package/dist/ops/health.js.map +1 -0
- package/dist/ops/local.d.ts +198 -0
- package/dist/ops/local.d.ts.map +1 -0
- package/dist/ops/local.js +187 -0
- package/dist/ops/local.js.map +1 -0
- package/dist/ops/media-config.d.ts +61 -0
- package/dist/ops/media-config.d.ts.map +1 -0
- package/dist/ops/media-config.js +96 -0
- package/dist/ops/media-config.js.map +1 -0
- package/dist/ops/media.d.ts +31 -0
- package/dist/ops/media.d.ts.map +1 -0
- package/dist/ops/media.js +74 -0
- package/dist/ops/media.js.map +1 -0
- package/dist/ops/monitor.d.ts +25 -0
- package/dist/ops/monitor.d.ts.map +1 -0
- package/dist/ops/monitor.js +143 -0
- package/dist/ops/monitor.js.map +1 -0
- package/dist/ops/process.d.ts +9 -0
- package/dist/ops/process.d.ts.map +1 -0
- package/dist/ops/process.js +56 -0
- package/dist/ops/process.js.map +1 -0
- package/dist/ops/provision.d.ts +41 -0
- package/dist/ops/provision.d.ts.map +1 -0
- package/dist/ops/provision.js +268 -0
- package/dist/ops/provision.js.map +1 -0
- package/dist/ops/registry.d.ts +14 -0
- package/dist/ops/registry.d.ts.map +1 -0
- package/dist/ops/registry.js +112 -0
- package/dist/ops/registry.js.map +1 -0
- package/dist/ops/release.d.ts +26 -0
- package/dist/ops/release.d.ts.map +1 -0
- package/dist/ops/release.js +79 -0
- package/dist/ops/release.js.map +1 -0
- package/dist/ops/runtimes.d.ts +16 -0
- package/dist/ops/runtimes.d.ts.map +1 -0
- package/dist/ops/runtimes.js +70 -0
- package/dist/ops/runtimes.js.map +1 -0
- package/dist/ops/s3.d.ts +8 -0
- package/dist/ops/s3.d.ts.map +1 -0
- package/dist/ops/s3.js +38 -0
- package/dist/ops/s3.js.map +1 -0
- package/dist/ops/static-config.d.ts +14 -0
- package/dist/ops/static-config.d.ts.map +1 -0
- package/dist/ops/static-config.js +92 -0
- package/dist/ops/static-config.js.map +1 -0
- package/dist/ops/storage.d.ts +39 -0
- package/dist/ops/storage.d.ts.map +1 -0
- package/dist/ops/storage.js +108 -0
- package/dist/ops/storage.js.map +1 -0
- package/flowpress-deploy.php +2 -2
- package/includes/pilot-aliases.php +69 -0
- package/package.json +43 -6
- package/schema/deployment.schema.json +306 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export function validateMediaValue(value: any): any;
|
|
2
|
+
export function mediaConfiguration(manifest: any, name: any): {
|
|
3
|
+
storage: any;
|
|
4
|
+
provider: any;
|
|
5
|
+
shared: any;
|
|
6
|
+
prefix: any;
|
|
7
|
+
publicUrl: any;
|
|
8
|
+
};
|
|
9
|
+
export function mediaCredentialKeys(provider: any): string[];
|
|
10
|
+
export function mediaEnvironment(manifest: any, name: any, values?: {}, { strict }?: {
|
|
11
|
+
strict?: boolean | undefined;
|
|
12
|
+
}): {
|
|
13
|
+
config: {
|
|
14
|
+
publicUrl: any;
|
|
15
|
+
storage: any;
|
|
16
|
+
provider: any;
|
|
17
|
+
shared: any;
|
|
18
|
+
prefix: any;
|
|
19
|
+
};
|
|
20
|
+
missing: any;
|
|
21
|
+
values: {
|
|
22
|
+
FLOWPRESS_MEDIA_STORAGE: any;
|
|
23
|
+
FLOWPRESS_MEDIA_PROVIDER: any;
|
|
24
|
+
FLOWPRESS_MEDIA_SHARED: string;
|
|
25
|
+
FLOWPRESS_MEDIA_PREFIX: any;
|
|
26
|
+
FLOWPRESS_MEDIA: any;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export function sharedMediaImport(manifest: any, name: any, source: any, loadEnvironment: any): boolean;
|
|
30
|
+
/** Environment-owned native Advanced Media Offloader configuration. */
|
|
31
|
+
export const mediaProviders: Readonly<{
|
|
32
|
+
aws_s3: {
|
|
33
|
+
prefix: string;
|
|
34
|
+
required: string[];
|
|
35
|
+
};
|
|
36
|
+
cloudflare_r2: {
|
|
37
|
+
prefix: string;
|
|
38
|
+
required: string[];
|
|
39
|
+
};
|
|
40
|
+
digitalocean: {
|
|
41
|
+
prefix: string;
|
|
42
|
+
required: string[];
|
|
43
|
+
};
|
|
44
|
+
backblaze_b2: {
|
|
45
|
+
prefix: string;
|
|
46
|
+
required: string[];
|
|
47
|
+
};
|
|
48
|
+
wasabi: {
|
|
49
|
+
prefix: string;
|
|
50
|
+
required: string[];
|
|
51
|
+
};
|
|
52
|
+
minio: {
|
|
53
|
+
prefix: string;
|
|
54
|
+
required: string[];
|
|
55
|
+
};
|
|
56
|
+
}>;
|
|
57
|
+
export const mediaFields: string[];
|
|
58
|
+
export function withoutMediaCredentials(values: any): {
|
|
59
|
+
[k: string]: any;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=media-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-config.d.ts","sourceRoot":"","sources":["../../src/ops/media-config.js"],"names":[],"mappings":"AAUA,oDAQC;AACD;;;;;;EAaC;AACD,6DAGC;AAOD;;;;;;;;;;;;;;;;;;EAiBC;AAGD,wGAWC;AA1ED,uEAAuE;AACvE;;;;;;;;;;;;;;;;;;;;;;;;;GAOG;AACH,mCAAiJ;AA4B1I;;EAAiI"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/** Environment-owned native Advanced Media Offloader configuration. */
|
|
2
|
+
export const mediaProviders = Object.freeze({
|
|
3
|
+
aws_s3: { prefix: 'AWS', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN'] },
|
|
4
|
+
cloudflare_r2: { prefix: 'CLOUDFLARE_R2', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN', 'ENDPOINT'] },
|
|
5
|
+
digitalocean: { prefix: 'DOS', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN', 'ENDPOINT'] },
|
|
6
|
+
backblaze_b2: { prefix: 'BACKBLAZE_B2', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN', 'ENDPOINT'] },
|
|
7
|
+
wasabi: { prefix: 'WASABI', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN'] },
|
|
8
|
+
minio: { prefix: 'MINIO', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN', 'ENDPOINT'] },
|
|
9
|
+
});
|
|
10
|
+
export const mediaFields = ['KEY', 'SECRET', 'BUCKET', 'DOMAIN', 'ENDPOINT', 'REGION', 'PATH_STYLE_ENDPOINT', 'APPEND_BUCKET_TO_DOMAIN', 'NAME'];
|
|
11
|
+
export function validateMediaValue(value) {
|
|
12
|
+
if (!value || typeof value !== 'object' || Array.isArray(value) || !['local', 's3'].includes(value.storage))
|
|
13
|
+
throw new Error('Schema 2 media requires storage: local|s3.');
|
|
14
|
+
if (Object.keys(value).some(key => !['storage', 'provider', 'shared', 'prefix'].includes(key)))
|
|
15
|
+
throw new Error('Unknown media configuration property.');
|
|
16
|
+
if (value.storage === 'local' && Object.keys(value).some(key => key !== 'storage'))
|
|
17
|
+
throw new Error('Local media cannot declare cloud settings.');
|
|
18
|
+
if (value.storage === 's3' && !mediaProviders[value.provider])
|
|
19
|
+
throw new Error('Unsupported Advanced Media Offloader provider.');
|
|
20
|
+
if (value.shared !== undefined && typeof value.shared !== 'boolean')
|
|
21
|
+
throw new Error('media.shared must be boolean.');
|
|
22
|
+
if (value.prefix !== undefined && (typeof value.prefix !== 'string' || /(?:^|\/)\.\.(?:\/|$)|[\\\r\n?#]/.test(value.prefix) || value.prefix.startsWith('/')))
|
|
23
|
+
throw new Error('Invalid relative media prefix.');
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
export function mediaConfiguration(manifest, name) {
|
|
27
|
+
const target = manifest.environments[name];
|
|
28
|
+
if (!target)
|
|
29
|
+
throw new Error('Unknown media environment: ' + name);
|
|
30
|
+
const sourceName = target.backend || name, source = manifest.environments[sourceName];
|
|
31
|
+
if (!source)
|
|
32
|
+
throw new Error('Unknown media backend: ' + sourceName);
|
|
33
|
+
const value = source.media ?? manifest.media;
|
|
34
|
+
if (manifest.schemaVersion === 1) {
|
|
35
|
+
if (!['local', 's3'].includes(value))
|
|
36
|
+
throw new Error('Schema 1 media must be local|s3. Migrate explicitly before using media objects.');
|
|
37
|
+
return { storage: value, provider: value === 's3' ? 'cloudflare_r2' : '', shared: false, prefix: sourceName === 'production' ? '' : sourceName, publicUrl: source.mediaUrl || '' };
|
|
38
|
+
}
|
|
39
|
+
validateMediaValue(value);
|
|
40
|
+
if (value.storage === 's3' && !source.mediaUrl)
|
|
41
|
+
throw new Error('Cloud media requires mediaUrl for ' + sourceName + '.');
|
|
42
|
+
return { storage: value.storage, provider: value.provider || '', shared: value.shared || false, prefix: value.storage === 'local' ? '' : value.prefix ?? (value.shared || sourceName === 'production' ? '' : sourceName), publicUrl: source.mediaUrl || '' };
|
|
43
|
+
}
|
|
44
|
+
export function mediaCredentialKeys(provider) {
|
|
45
|
+
const definition = mediaProviders[provider];
|
|
46
|
+
return definition ? mediaFields.map(field => 'ADVMO_' + definition.prefix + '_' + field) : [];
|
|
47
|
+
}
|
|
48
|
+
export const withoutMediaCredentials = values => Object.fromEntries(Object.entries(values).filter(([key]) => !key.startsWith('ADVMO_')));
|
|
49
|
+
function normalizedUrl(value) {
|
|
50
|
+
const url = new URL(value);
|
|
51
|
+
if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)
|
|
52
|
+
throw new Error('Invalid media endpoint or public URL.');
|
|
53
|
+
return url.href.replace(/\/$/, '');
|
|
54
|
+
}
|
|
55
|
+
export function mediaEnvironment(manifest, name, values = {}, { strict = false } = {}) {
|
|
56
|
+
const config = mediaConfiguration(manifest, name), credentials = {}, definition = mediaProviders[config.provider];
|
|
57
|
+
for (const key of mediaCredentialKeys(config.provider))
|
|
58
|
+
if (values[key] !== undefined && values[key] !== '')
|
|
59
|
+
credentials[key] = values[key];
|
|
60
|
+
const prefix = definition ? 'ADVMO_' + definition.prefix + '_' : '';
|
|
61
|
+
const domain = credentials[prefix + 'DOMAIN'];
|
|
62
|
+
let publicUrl = config.publicUrl || domain || '';
|
|
63
|
+
if (publicUrl)
|
|
64
|
+
publicUrl = normalizedUrl(publicUrl);
|
|
65
|
+
if (domain && manifest.schemaVersion === 2) {
|
|
66
|
+
let effectiveDomain = normalizedUrl(domain);
|
|
67
|
+
if (config.provider === 'minio' && !['false', '0'].includes(String(credentials[prefix + 'APPEND_BUCKET_TO_DOMAIN'])))
|
|
68
|
+
effectiveDomain += '/' + credentials[prefix + 'BUCKET'];
|
|
69
|
+
if (effectiveDomain !== publicUrl)
|
|
70
|
+
throw new Error('mediaUrl conflicts with ' + prefix + 'DOMAIN for ' + name + '.');
|
|
71
|
+
}
|
|
72
|
+
if (credentials[prefix + 'ENDPOINT'])
|
|
73
|
+
normalizedUrl(credentials[prefix + 'ENDPOINT']);
|
|
74
|
+
for (const field of ['PATH_STYLE_ENDPOINT', 'APPEND_BUCKET_TO_DOMAIN'])
|
|
75
|
+
if (credentials[prefix + field] !== undefined && !['true', 'false', '0', '1'].includes(String(credentials[prefix + field])))
|
|
76
|
+
throw new Error('Invalid boolean ' + prefix + field + '.');
|
|
77
|
+
const missing = config.storage === 's3' ? definition.required.map(field => prefix + field).filter(key => !String(credentials[key] || '').trim()) : [];
|
|
78
|
+
if (strict && missing.length)
|
|
79
|
+
throw new Error('Incomplete media configuration for ' + name + ': ' + missing.join(', '));
|
|
80
|
+
return { config: { ...config, publicUrl }, missing, values: { FLOWPRESS_MEDIA_STORAGE: config.storage, FLOWPRESS_MEDIA_PROVIDER: config.provider, FLOWPRESS_MEDIA_SHARED: String(config.shared), FLOWPRESS_MEDIA_PREFIX: config.prefix, FLOWPRESS_MEDIA: publicUrl, ...credentials } };
|
|
81
|
+
}
|
|
82
|
+
// Imported attachment paths can be retained only for a proven shared namespace.
|
|
83
|
+
export function sharedMediaImport(manifest, name, source, loadEnvironment) {
|
|
84
|
+
const target = mediaConfiguration(manifest, name);
|
|
85
|
+
if (manifest.schemaVersion !== 2 || target.storage !== 's3' || !target.shared)
|
|
86
|
+
return false;
|
|
87
|
+
const origin = mediaConfiguration(manifest, source);
|
|
88
|
+
const key = 'ADVMO_' + mediaProviders[target.provider].prefix + '_BUCKET';
|
|
89
|
+
const targetBucket = loadEnvironment(name)[key], sourceBucket = loadEnvironment(source)[key];
|
|
90
|
+
if (origin.storage !== 's3' || !origin.shared || target.provider !== origin.provider || target.prefix !== origin.prefix
|
|
91
|
+
|| normalizedUrl(target.publicUrl) !== normalizedUrl(origin.publicUrl) || !targetBucket || targetBucket !== sourceBucket) {
|
|
92
|
+
throw new Error('Shared media import requires matching source/target provider, bucket, mediaUrl and prefix. Configure both profiles explicitly before preparing data.');
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=media-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-config.js","sourceRoot":"","sources":["../../src/ops/media-config.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function migrateMediaManifest(root: any, { apply }?: {
|
|
2
|
+
apply?: boolean | undefined;
|
|
3
|
+
}): {
|
|
4
|
+
changed: boolean;
|
|
5
|
+
applied: boolean;
|
|
6
|
+
schemaVersion?: undefined;
|
|
7
|
+
manifest?: undefined;
|
|
8
|
+
} | {
|
|
9
|
+
changed: boolean;
|
|
10
|
+
applied: boolean;
|
|
11
|
+
schemaVersion: number;
|
|
12
|
+
manifest: any;
|
|
13
|
+
};
|
|
14
|
+
export function mediaProgram(check: any): string;
|
|
15
|
+
export function mediaCommand(root: any, manifest: any, command: any, name: any): {
|
|
16
|
+
credentials: {
|
|
17
|
+
complete: boolean;
|
|
18
|
+
missing: any;
|
|
19
|
+
present: {
|
|
20
|
+
[k: string]: boolean;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
ok: boolean;
|
|
24
|
+
publicUrl: any;
|
|
25
|
+
storage: any;
|
|
26
|
+
provider: any;
|
|
27
|
+
shared: any;
|
|
28
|
+
prefix: any;
|
|
29
|
+
environment: any;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/ops/media.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;EA2BC;AACD,iDAEC;AACD;;;;;;;;;;;;;;;EAkBC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { readFileSync, copyFileSync, chmodSync, mkdirSync, writeFileSync, readdirSync, existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { parse, stringify } from 'yaml';
|
|
4
|
+
import { loadState } from './config.js';
|
|
5
|
+
import { manifestEnvironment } from './environment.js';
|
|
6
|
+
import { mediaCredentialKeys, mediaEnvironment } from './media-config.js';
|
|
7
|
+
import { localComposeArgs } from './local.js';
|
|
8
|
+
import { capture, containerFor, shellQuote, ssh } from './process.js';
|
|
9
|
+
export function migrateMediaManifest(root, { apply = false } = {}) {
|
|
10
|
+
const file = join(root, 'flowpress.deploy.yaml'), original = readFileSync(file, 'utf8'), manifest = parse(original);
|
|
11
|
+
if (manifest.schemaVersion === 2)
|
|
12
|
+
return { changed: false, applied: false };
|
|
13
|
+
if (manifest.schemaVersion !== 1)
|
|
14
|
+
throw new Error('Only schemaVersion 1 can migrate to 2.');
|
|
15
|
+
const cloud = manifest.media === 's3';
|
|
16
|
+
manifest.media = cloud ? { storage: 's3', provider: 'cloudflare_r2', shared: false } : { storage: 'local' };
|
|
17
|
+
// Make the old non-production prefix explicit; do not change any cloud path.
|
|
18
|
+
if (cloud)
|
|
19
|
+
for (const [name, target] of Object.entries(manifest.environments)) {
|
|
20
|
+
if (target.backend)
|
|
21
|
+
continue;
|
|
22
|
+
const values = manifestEnvironment(root, name);
|
|
23
|
+
if (!values.FLOWPRESS_MEDIA)
|
|
24
|
+
throw new Error('Set mediaUrl before migrating cloud media for ' + name + '.');
|
|
25
|
+
target.mediaUrl ||= values.FLOWPRESS_MEDIA;
|
|
26
|
+
target.media = { ...manifest.media, prefix: name === 'production' ? '' : name };
|
|
27
|
+
}
|
|
28
|
+
manifest.schemaVersion = 2;
|
|
29
|
+
if (apply) {
|
|
30
|
+
const backupRoot = join(root, '.local/flowpress-media-migration', new Date().toISOString().replaceAll(':', '-'));
|
|
31
|
+
const privateFiles = readdirSync(root, { withFileTypes: true }).filter(item => item.isFile() && /^\.env(?:\.[a-z]+)?$/.test(item.name)).map(item => item.name);
|
|
32
|
+
if (existsSync(join(root, '.secrets')))
|
|
33
|
+
for (const item of readdirSync(join(root, '.secrets'), { withFileTypes: true }))
|
|
34
|
+
if (item.isFile())
|
|
35
|
+
privateFiles.push('.secrets/' + item.name);
|
|
36
|
+
for (const relative of ['flowpress.deploy.yaml', ...privateFiles]) {
|
|
37
|
+
const backup = join(backupRoot, relative);
|
|
38
|
+
mkdirSync(dirname(backup), { recursive: true, mode: 0o700 });
|
|
39
|
+
copyFileSync(join(root, relative), backup);
|
|
40
|
+
chmodSync(backup, 0o600);
|
|
41
|
+
}
|
|
42
|
+
writeFileSync(file, stringify(manifest));
|
|
43
|
+
}
|
|
44
|
+
return { changed: true, applied: apply, schemaVersion: 2, manifest };
|
|
45
|
+
}
|
|
46
|
+
export function mediaProgram(check) {
|
|
47
|
+
return '<?php\nif (!function_exists("flowpress_media_status")) { echo "@@flowpress-media@@", json_encode(["ok"=>false,"error"=>"core_media_capability_missing"]); return; }\necho "@@flowpress-media@@", wp_json_encode(' + (check ? 'flowpress_media_check' : 'flowpress_media_status') + '());\n';
|
|
48
|
+
}
|
|
49
|
+
export function mediaCommand(root, manifest, command, name) {
|
|
50
|
+
if (!['status', 'check'].includes(command))
|
|
51
|
+
throw new Error('Use media status|check <environment>, or media migrate [--apply].');
|
|
52
|
+
const env = manifestEnvironment(root, name), resolved = mediaEnvironment(manifest, name, env);
|
|
53
|
+
const report = { environment: name, ...resolved.config, credentials: { complete: !resolved.missing.length, missing: resolved.missing,
|
|
54
|
+
present: Object.fromEntries(mediaCredentialKeys(resolved.config.provider).map(key => [key, Boolean(env[key])])) }, ok: false };
|
|
55
|
+
try {
|
|
56
|
+
const input = mediaProgram(command === 'check');
|
|
57
|
+
const output = name === 'local'
|
|
58
|
+
? capture('docker', [...localComposeArgs(root), 'exec', '-T', 'cms', '/workspace/apps/cms/vendor/bin/wp', '--allow-root', '--path=/workspace/apps/cms/web/wp', 'eval-file', '-'], { input })
|
|
59
|
+
: (() => { const state = loadState(root, name); const container = containerFor(state.platform, state.apps.cms.uuid); return ssh(state.platform, 'docker exec -i ' + shellQuote(container) + ' wp eval-file -', { input }); })();
|
|
60
|
+
const index = output.lastIndexOf('@@flowpress-media@@');
|
|
61
|
+
if (index < 0)
|
|
62
|
+
throw new Error('Missing media response');
|
|
63
|
+
report.runtime = JSON.parse(output.slice(index + '@@flowpress-media@@'.length));
|
|
64
|
+
report.configurationMatches = ['storage', 'provider', 'shared', 'prefix', 'publicUrl'].every(key => report.runtime[key] === resolved.config[key]);
|
|
65
|
+
report.ok = !resolved.missing.length && report.runtime.ok === true && report.configurationMatches;
|
|
66
|
+
if (!report.configurationMatches)
|
|
67
|
+
report.error = 'media_runtime_configuration_differs';
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
report.runtime = { ok: false, error: 'media_runtime_unavailable' };
|
|
71
|
+
}
|
|
72
|
+
return report;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/ops/media.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function backupRun(root: any, manifest: any, name: any): Promise<{
|
|
2
|
+
environment: any;
|
|
3
|
+
database: string;
|
|
4
|
+
uploads: string;
|
|
5
|
+
filename: any;
|
|
6
|
+
}>;
|
|
7
|
+
export function backupVerify(root: any, manifest: any, name: any): Promise<{
|
|
8
|
+
environment: any;
|
|
9
|
+
database: {
|
|
10
|
+
tables: number;
|
|
11
|
+
home: any;
|
|
12
|
+
object: any;
|
|
13
|
+
modified: any;
|
|
14
|
+
};
|
|
15
|
+
uploads: {
|
|
16
|
+
files: number;
|
|
17
|
+
};
|
|
18
|
+
offsite: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
export function status(root: any, manifest: any, only: any): Promise<{
|
|
21
|
+
ok: boolean;
|
|
22
|
+
checkedAt: string;
|
|
23
|
+
environments: {};
|
|
24
|
+
}>;
|
|
25
|
+
//# sourceMappingURL=monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/ops/monitor.js"],"names":[],"mappings":"AAYA;;;;;GAgBC;AAQD;;;;;;;;;;;;GAsCC;AACD;;;;GAgCC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { allowedComponents, loadState, operatorEnvironment, readEnv } from "./config.js";
|
|
5
|
+
import { coolifyClient } from "./coolify.js";
|
|
6
|
+
import { backupHealth, providerTimestamp } from "./health.js";
|
|
7
|
+
import { s3Get, s3List } from "./s3.js";
|
|
8
|
+
import { safeArchiveEntries } from "./data.js";
|
|
9
|
+
import { capture, run, sleep } from "./process.js";
|
|
10
|
+
import { imageMetadata } from "./registry.js";
|
|
11
|
+
const list = data => Array.isArray(data) ? data : data?.executions || data?.data || [];
|
|
12
|
+
export async function backupRun(root, manifest, name) {
|
|
13
|
+
allowedComponents(manifest, name, ["cms"]);
|
|
14
|
+
const state = loadState(root, name);
|
|
15
|
+
const api = coolifyClient(state.platform.coolifyUrl, operatorEnvironment(root).COOLIFY_TOKEN);
|
|
16
|
+
const before = Date.now() - 2000;
|
|
17
|
+
await api("PATCH", "/databases/" + state.platform.poolUuid + "/backups/" + state.database.backupUuid, { backup_now: true });
|
|
18
|
+
const app = state.apps.cms;
|
|
19
|
+
await api("POST", "/applications/" + app.uuid + "/storages/" + app.uploadsStorageUuid + "/backups/run");
|
|
20
|
+
for (let attempt = 0; attempt < 90; attempt++) {
|
|
21
|
+
const executions = list(await api("GET", "/databases/" + state.platform.poolUuid + "/backups/" + state.database.backupUuid + "/executions"));
|
|
22
|
+
const last = executions.filter(item => providerTimestamp(item.created_at) >= before).sort((a, b) => b.created_at.localeCompare(a.created_at))[0];
|
|
23
|
+
if (last?.status === "failed")
|
|
24
|
+
throw new Error("Offsite database backup failed.");
|
|
25
|
+
if (last?.status === "success")
|
|
26
|
+
return { environment: name, database: "success", uploads: "queued", filename: last.filename };
|
|
27
|
+
await sleep(4000);
|
|
28
|
+
}
|
|
29
|
+
throw new Error("Offsite database backup timed out.");
|
|
30
|
+
}
|
|
31
|
+
async function bucketConfig(root, state, api) {
|
|
32
|
+
const secret = readEnv(join(root, ".secrets/backup.env"));
|
|
33
|
+
if (secret.BACKUP_S3_ENDPOINT)
|
|
34
|
+
return { endpoint: secret.BACKUP_S3_ENDPOINT, bucket: secret.BACKUP_S3_BUCKET, region: secret.BACKUP_S3_REGION, user: secret.BACKUP_S3_ACCESS_KEY_ID + ":" + secret.BACKUP_S3_SECRET_ACCESS_KEY };
|
|
35
|
+
const storage = await api("GET", "/s3-storages/" + state.platform.backupStorageUuid);
|
|
36
|
+
if (!storage.key || !storage.secret)
|
|
37
|
+
throw new Error("Set private .secrets/backup.env to verify the offsite backup objects.");
|
|
38
|
+
return { endpoint: storage.endpoint, bucket: storage.bucket, region: storage.region, user: storage.key + ":" + storage.secret };
|
|
39
|
+
}
|
|
40
|
+
export async function backupVerify(root, manifest, name) {
|
|
41
|
+
allowedComponents(manifest, name, ["cms"]);
|
|
42
|
+
const state = loadState(root, name), values = readEnv(join(root, ".secrets", name + ".env"));
|
|
43
|
+
const api = coolifyClient(state.platform.coolifyUrl, operatorEnvironment(root).COOLIFY_TOKEN);
|
|
44
|
+
const bucket = await bucketConfig(root, state, api);
|
|
45
|
+
const objects = s3List(bucket, "data/coolify/backups/").filter(item => item.size > 0).sort((a, b) => b.modified.localeCompare(a.modified));
|
|
46
|
+
const database = objects.find(item => item.key.includes(state.platform.poolUuid) && item.key.includes(state.database.name));
|
|
47
|
+
const uploads = objects.find(item => item.key.includes(state.apps.cms.name + "-uploads"));
|
|
48
|
+
if (!database || !uploads)
|
|
49
|
+
throw new Error("Both nonempty offsite database and uploads backups are required.");
|
|
50
|
+
const directory = mkdtempSync(join(tmpdir(), "flowpress-restore-"));
|
|
51
|
+
const id = "flowpress-restore-" + process.pid;
|
|
52
|
+
try {
|
|
53
|
+
const file = join(directory, database.key.endsWith(".gz") ? "database.sql.gz" : "database.sql");
|
|
54
|
+
s3Get(bucket, database.key, file);
|
|
55
|
+
if (file.endsWith(".gz"))
|
|
56
|
+
run("gunzip", ["-k", file]);
|
|
57
|
+
run("docker", ["run", "--rm", "-d", "--network", "none", "--memory", "1536m", "--name", id, "-e", "MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1", "-e", "MARIADB_DATABASE=restore", "mariadb:11.4"], { stdio: "ignore" });
|
|
58
|
+
for (let attempt = 0; attempt < 60; attempt++) {
|
|
59
|
+
try {
|
|
60
|
+
capture("docker", ["exec", id, "healthcheck.sh", "--connect", "--innodb_initialized"]);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
if (attempt === 59)
|
|
65
|
+
throw new Error("Restore test database did not start.");
|
|
66
|
+
await sleep(2000);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const { readFileSync } = await import("node:fs");
|
|
70
|
+
run("docker", ["exec", "-i", id, "mariadb", "-uroot", "restore"], { input: readFileSync(file.replace(/\.gz$/, "")), stdio: ["pipe", "pipe", "pipe"] });
|
|
71
|
+
if (!/^[a-zA-Z0-9_]+$/.test(values.DB_PREFIX || ""))
|
|
72
|
+
throw new Error("Unsafe WordPress table prefix.");
|
|
73
|
+
const query = sql => capture("docker", ["exec", id, "mariadb", "-uroot", "-N", "restore", "-e", sql]);
|
|
74
|
+
const home = query("SELECT option_value FROM " + values.DB_PREFIX + "options WHERE option_name='home'");
|
|
75
|
+
const tables = Number(query("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='restore'"));
|
|
76
|
+
if (tables < 10 || new URL(home).origin !== new URL(state.apps.cms.url).origin)
|
|
77
|
+
throw new Error("Restored database identity mismatch.");
|
|
78
|
+
const archive = join(directory, "uploads.tar.gz");
|
|
79
|
+
s3Get(bucket, uploads.key, archive);
|
|
80
|
+
const options = ["run", "--rm", "--network", "none", "--read-only", "--user", String(process.getuid?.() || 0) + ":" + String(process.getgid?.() || 0),
|
|
81
|
+
"--cap-drop", "ALL", "--security-opt", "no-new-privileges", "--tmpfs", "/restore:rw,size=1g,mode=1777", "-v", archive + ":/backup.tar.gz:ro", "alpine:3.22"];
|
|
82
|
+
safeArchiveEntries(capture("docker", [...options, "tar", "-tzf", "/backup.tar.gz"]).split("\n").filter(Boolean));
|
|
83
|
+
const files = capture("docker", [...options, "sh", "-ec", 'tar -xzf /backup.tar.gz -C /restore; find /restore -type f | wc -l']);
|
|
84
|
+
if (Number(files) < 1)
|
|
85
|
+
throw new Error("Restored uploads are empty.");
|
|
86
|
+
return { environment: name, database: { tables, home, object: database.key, modified: database.modified }, uploads: { files: Number(files) }, offsite: true };
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
try {
|
|
90
|
+
run("docker", ["rm", "-fv", id], { stdio: "ignore" });
|
|
91
|
+
}
|
|
92
|
+
catch { /* startup may have failed */ }
|
|
93
|
+
rmSync(directory, { recursive: true, force: true });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export async function status(root, manifest, only) {
|
|
97
|
+
const report = { ok: true, checkedAt: new Date().toISOString(), environments: {} };
|
|
98
|
+
for (const name of only ? [only] : Object.keys(manifest.environments)) {
|
|
99
|
+
const state = loadState(root, name);
|
|
100
|
+
if (!Object.keys(state.apps || {}).length) {
|
|
101
|
+
report.environments[name] = { active: false, ok: true };
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const result = { active: true, ok: true, apps: {}, backups: {} };
|
|
105
|
+
const api = coolifyClient(state.platform.coolifyUrl, operatorEnvironment(root).COOLIFY_TOKEN);
|
|
106
|
+
for (const [component, app] of Object.entries(state.apps)) {
|
|
107
|
+
try {
|
|
108
|
+
const current = await api("GET", "/applications/" + app.uuid);
|
|
109
|
+
const response = await fetch(app.url + app.health + "?status=" + Date.now(), { signal: AbortSignal.timeout(10000), redirect: "error" });
|
|
110
|
+
const data = await response.json();
|
|
111
|
+
const configuredSha = (await imageMetadata(app.repository + ":" + current.docker_registry_image_tag, operatorEnvironment(root)))?.sha;
|
|
112
|
+
const ok = current.status === "running:healthy" && response.ok && data.status === "ok" && Boolean(configuredSha) && data.release === configuredSha;
|
|
113
|
+
result.apps[component] = { ok, status: current.status, release: data.release };
|
|
114
|
+
if (!ok)
|
|
115
|
+
result.ok = false;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
result.apps[component] = { ok: false, status: "unknown" };
|
|
119
|
+
result.ok = false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (state.database?.backupUuid) {
|
|
123
|
+
try {
|
|
124
|
+
const executions = list(await api("GET", "/databases/" + state.platform.poolUuid + "/backups/" + state.database.backupUuid + "/executions"));
|
|
125
|
+
const bucket = await bucketConfig(root, state, api);
|
|
126
|
+
const objects = s3List(bucket, "data/coolify/backups/");
|
|
127
|
+
result.backups.database = backupHealth({ executions, objects: objects.filter(item => item.key.includes(state.platform.poolUuid) && item.key.includes(state.database.name)), maxAgeHours: 36 });
|
|
128
|
+
result.backups.uploads = backupHealth({ objects: objects.filter(item => item.key.includes(state.apps.cms.name + "-uploads")), maxAgeHours: 36 });
|
|
129
|
+
if (!result.backups.database.ok || !result.backups.uploads.ok)
|
|
130
|
+
result.ok = false;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
result.backups = { ok: false, status: "unknown" };
|
|
134
|
+
result.ok = false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
report.environments[name] = result;
|
|
138
|
+
if (!result.ok)
|
|
139
|
+
report.ok = false;
|
|
140
|
+
}
|
|
141
|
+
return report;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/ops/monitor.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function run(command: any, args: any, options?: {}): import("child_process").SpawnSyncReturns<NonSharedBuffer>;
|
|
2
|
+
export function capture(command: any, args: any, options?: {}): any;
|
|
3
|
+
export function shellQuote(value: any): string;
|
|
4
|
+
export function ssh(platform: any, command: any, options?: {}): any;
|
|
5
|
+
export function sshFile(platform: any, command: any, { input, output }?: {}): Promise<void>;
|
|
6
|
+
export function argValue(args: any, flag: any): any;
|
|
7
|
+
export function containerFor(platform: any, uuid: any): any;
|
|
8
|
+
export function sleep(ms: any): Promise<any>;
|
|
9
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/ops/process.js"],"names":[],"mappings":"AAKA,sHAaC;AACD,oEAEC;AACD,+CAAgG;AAChG,oEAGC;AACD,4FAQC;AAED,oDAKC;AACD,4DAKC;AAZM,6CAAmE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { spawnSync, spawn } from "node:child_process";
|
|
2
|
+
import { createReadStream, createWriteStream, mkdirSync, writeFileSync, chmodSync } from "node:fs";
|
|
3
|
+
import { dirname, isAbsolute } from "node:path";
|
|
4
|
+
import { pipeline } from "node:stream/promises";
|
|
5
|
+
export function run(command, args, options = {}) {
|
|
6
|
+
const result = spawnSync(command, args, { stdio: "inherit", ...options });
|
|
7
|
+
if (result.error)
|
|
8
|
+
throw new Error("Cannot start " + command + ": " + result.error.code);
|
|
9
|
+
if (result.status !== 0) {
|
|
10
|
+
const diagnostic = process.env.FLOWPRESS_DIAGNOSTICS_FILE;
|
|
11
|
+
if (diagnostic && isAbsolute(diagnostic) && result.stderr) {
|
|
12
|
+
mkdirSync(dirname(diagnostic), { recursive: true, mode: 0o700 });
|
|
13
|
+
writeFileSync(diagnostic, String(result.stderr).slice(-65536), { mode: 0o600 });
|
|
14
|
+
chmodSync(diagnostic, 0o600);
|
|
15
|
+
}
|
|
16
|
+
throw new Error(command + " failed (exit " + result.status + ")." + (diagnostic ? " Private diagnostic saved to " + diagnostic : ""));
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
export function capture(command, args, options = {}) {
|
|
21
|
+
return run(command, args, { encoding: "utf8", stdio: ["pipe", "pipe", "pipe"], maxBuffer: 64 * 1024 * 1024, ...options }).stdout.trim();
|
|
22
|
+
}
|
|
23
|
+
export function shellQuote(value) { return "'" + String(value).replaceAll("'", "'\\''") + "'"; }
|
|
24
|
+
export function ssh(platform, command, options = {}) {
|
|
25
|
+
if (!/^[a-zA-Z0-9_.@-]+$/.test(platform.ssh || ""))
|
|
26
|
+
throw new Error("Invalid SSH target.");
|
|
27
|
+
return capture("ssh", ["-o", "BatchMode=yes", "-o", "ConnectTimeout=15", platform.ssh, command], options);
|
|
28
|
+
}
|
|
29
|
+
export async function sshFile(platform, command, { input, output } = {}) {
|
|
30
|
+
if (!/^[a-zA-Z0-9_.@-]+$/.test(platform.ssh || ""))
|
|
31
|
+
throw new Error("Invalid SSH target.");
|
|
32
|
+
const child = spawn("ssh", ["-o", "BatchMode=yes", "-o", "ConnectTimeout=15", platform.ssh, command], { stdio: [input ? "pipe" : "ignore", output ? "pipe" : "inherit", "inherit"] });
|
|
33
|
+
const completion = new Promise((resolve, reject) => {
|
|
34
|
+
child.on("error", reject);
|
|
35
|
+
child.on("exit", code => code === 0 ? resolve() : reject(new Error("SSH stream failed (exit " + code + ").")));
|
|
36
|
+
});
|
|
37
|
+
await Promise.all([completion, ...(input ? [pipeline(createReadStream(input), child.stdin)] : []), ...(output ? [pipeline(child.stdout, createWriteStream(output, { mode: 0o600 }))] : [])]);
|
|
38
|
+
}
|
|
39
|
+
export const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
40
|
+
export function argValue(args, flag) {
|
|
41
|
+
const index = args.indexOf(flag);
|
|
42
|
+
if (index < 0)
|
|
43
|
+
return undefined;
|
|
44
|
+
if (!args[index + 1] || args[index + 1].startsWith("--"))
|
|
45
|
+
throw new Error("Missing value for " + flag);
|
|
46
|
+
return args[index + 1];
|
|
47
|
+
}
|
|
48
|
+
export function containerFor(platform, uuid) {
|
|
49
|
+
if (!/^[a-z0-9]+$/.test(uuid || ""))
|
|
50
|
+
throw new Error("Invalid resource UUID.");
|
|
51
|
+
const names = ssh(platform, "docker ps --filter name=^" + uuid + " --format '{{.Names}}'").split("\n").filter(Boolean);
|
|
52
|
+
if (names.length !== 1)
|
|
53
|
+
throw new Error("Expected exactly one running container for " + uuid + ".");
|
|
54
|
+
return names[0];
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/ops/process.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function sqlIdentifier(value: any): any;
|
|
2
|
+
export function schemaSql(values: any): string;
|
|
3
|
+
export function poolSecretsPath(root: any, platformId: any): string;
|
|
4
|
+
export function poolSecrets(root: any, platformId: any, { create }?: {
|
|
5
|
+
create?: boolean | undefined;
|
|
6
|
+
}): import("dotenv").DotenvParseOutput;
|
|
7
|
+
export function poolSql(platform: any, password: any, sql: any): any;
|
|
8
|
+
export function provisionPlatform(root: any, manifest: any, { file, apply }?: {
|
|
9
|
+
apply?: boolean | undefined;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
actions: string[];
|
|
12
|
+
platform: {
|
|
13
|
+
id: any;
|
|
14
|
+
coolifyUrl: any;
|
|
15
|
+
serverUuid: any;
|
|
16
|
+
ssh: any;
|
|
17
|
+
network: any;
|
|
18
|
+
subnet: any;
|
|
19
|
+
registry: any;
|
|
20
|
+
registryProject: any;
|
|
21
|
+
backupStorageUuid: any;
|
|
22
|
+
poolUuid: any;
|
|
23
|
+
destinationUuid: any;
|
|
24
|
+
phpImage: any;
|
|
25
|
+
};
|
|
26
|
+
applied: boolean;
|
|
27
|
+
}>;
|
|
28
|
+
export function provision(root: any, manifest: any, name: any, { file, apply, components }?: {
|
|
29
|
+
apply?: boolean | undefined;
|
|
30
|
+
components?: never[] | undefined;
|
|
31
|
+
}): Promise<{
|
|
32
|
+
project: string;
|
|
33
|
+
environment: any;
|
|
34
|
+
components: any;
|
|
35
|
+
actions: string[];
|
|
36
|
+
applied: boolean;
|
|
37
|
+
}>;
|
|
38
|
+
export function syncEnvironment(root: any, name: any, api: any): Promise<{
|
|
39
|
+
keys: string[];
|
|
40
|
+
}>;
|
|
41
|
+
//# sourceMappingURL=provision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../../src/ops/provision.js"],"names":[],"mappings":"AAUA,+CAGC;AACD,+CAMC;AACD,oEAEC;AACD;;uCAUC;AACD,qEAKC;AASD;;;;;;;;;;;;;;;;;;;GA8EC;AAED;;;;;;;;;GAmGC;AACD;;GAWC"}
|