ninedeploy 0.18.25 → 0.18.27
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/commands/databaseUpgrade.d.ts +25 -0
- package/dist/commands/databaseUpgrade.d.ts.map +1 -0
- package/dist/commands/databaseUpgrade.js +136 -0
- package/dist/commands/databaseUpgrade.js.map +1 -0
- package/dist/commands/importApply.d.ts +114 -0
- package/dist/commands/importApply.d.ts.map +1 -0
- package/dist/commands/importApply.js +403 -0
- package/dist/commands/importApply.js.map +1 -0
- package/dist/commands/importCutover.d.ts +95 -0
- package/dist/commands/importCutover.d.ts.map +1 -0
- package/dist/commands/importCutover.js +293 -0
- package/dist/commands/importCutover.js.map +1 -0
- package/dist/commands/importData.d.ts +60 -0
- package/dist/commands/importData.d.ts.map +1 -0
- package/dist/commands/importData.js +286 -0
- package/dist/commands/importData.js.map +1 -0
- package/dist/commands/importPlan.d.ts +32 -0
- package/dist/commands/importPlan.d.ts.map +1 -0
- package/dist/commands/importPlan.js +138 -0
- package/dist/commands/importPlan.js.map +1 -0
- package/dist/commands/importVolumes.d.ts +38 -0
- package/dist/commands/importVolumes.d.ts.map +1 -0
- package/dist/commands/importVolumes.js +161 -0
- package/dist/commands/importVolumes.js.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/importers/caprover.d.ts +13 -0
- package/dist/lib/importers/caprover.d.ts.map +1 -0
- package/dist/lib/importers/caprover.js +150 -0
- package/dist/lib/importers/caprover.js.map +1 -0
- package/dist/lib/importers/connections.d.ts +39 -0
- package/dist/lib/importers/connections.d.ts.map +1 -0
- package/dist/lib/importers/connections.js +119 -0
- package/dist/lib/importers/connections.js.map +1 -0
- package/dist/lib/importers/coolify.d.ts +10 -0
- package/dist/lib/importers/coolify.d.ts.map +1 -0
- package/dist/lib/importers/coolify.js +174 -0
- package/dist/lib/importers/coolify.js.map +1 -0
- package/dist/lib/importers/dokploy.d.ts +13 -0
- package/dist/lib/importers/dokploy.d.ts.map +1 -0
- package/dist/lib/importers/dokploy.js +183 -0
- package/dist/lib/importers/dokploy.js.map +1 -0
- package/dist/lib/importers/heroku.d.ts +50 -0
- package/dist/lib/importers/heroku.d.ts.map +1 -0
- package/dist/lib/importers/heroku.js +159 -0
- package/dist/lib/importers/heroku.js.map +1 -0
- package/dist/lib/importers/plan.d.ts +137 -0
- package/dist/lib/importers/plan.d.ts.map +1 -0
- package/dist/lib/importers/plan.js +110 -0
- package/dist/lib/importers/plan.js.map +1 -0
- package/dist/lib/importers/shell.d.ts +24 -0
- package/dist/lib/importers/shell.d.ts.map +1 -0
- package/dist/lib/importers/shell.js +45 -0
- package/dist/lib/importers/shell.js.map +1 -0
- package/dist/lib/importers/sources.d.ts +26 -0
- package/dist/lib/importers/sources.d.ts.map +1 -0
- package/dist/lib/importers/sources.js +100 -0
- package/dist/lib/importers/sources.js.map +1 -0
- package/package.json +3 -3
- package/src/commands/databaseUpgrade.ts +124 -0
- package/src/commands/importApply.ts +445 -0
- package/src/commands/importCutover.ts +329 -0
- package/src/commands/importData.ts +302 -0
- package/src/commands/importPlan.ts +143 -0
- package/src/commands/importVolumes.ts +168 -0
- package/src/index.ts +61 -0
- package/src/lib/importers/caprover.ts +141 -0
- package/src/lib/importers/connections.ts +133 -0
- package/src/lib/importers/coolify.ts +164 -0
- package/src/lib/importers/dokploy.ts +167 -0
- package/src/lib/importers/heroku.ts +168 -0
- package/src/lib/importers/plan.ts +209 -0
- package/src/lib/importers/shell.ts +56 -0
- package/src/lib/importers/sources.ts +96 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/** The scheme each engine's panel connection string starts with (server engine/database.ts). */
|
|
2
|
+
const PANEL_SCHEME = {
|
|
3
|
+
postgres: 'postgres:', mysql: 'mysql:', mariadb: 'mariadb:', mongo: 'mongodb:',
|
|
4
|
+
redis: 'redis:', keydb: 'redis:', dragonfly: 'redis:', clickhouse: 'clickhouse:',
|
|
5
|
+
};
|
|
6
|
+
const REDIS_FAMILY = new Set(['redis', 'keydb', 'dragonfly']);
|
|
7
|
+
/**
|
|
8
|
+
* The names the source's apps reach a database by, from where it runs.
|
|
9
|
+
* CapRover: both the app name and the `srv-captain--` alias (1.16 names new
|
|
10
|
+
* apps' Swarm services plainly, older ones with the prefix). Coolify: the
|
|
11
|
+
* container name (its uuid). Dokploy: the Swarm service (appName).
|
|
12
|
+
*/
|
|
13
|
+
export function sourceHosts(kind, db) {
|
|
14
|
+
const name = db.runtime?.name?.toLowerCase();
|
|
15
|
+
if (!name)
|
|
16
|
+
return [];
|
|
17
|
+
switch (db.runtime.kind) {
|
|
18
|
+
case 'heroku-app':
|
|
19
|
+
// The name is the Heroku app, not a host: add-on URLs name Heroku's own hosts.
|
|
20
|
+
return [];
|
|
21
|
+
case 'container':
|
|
22
|
+
case 'swarm-service':
|
|
23
|
+
break;
|
|
24
|
+
default: {
|
|
25
|
+
const never = db.runtime.kind;
|
|
26
|
+
return never;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (kind === 'caprover') {
|
|
30
|
+
const app = name.replace(/^srv-captain--/, '');
|
|
31
|
+
return [app, `srv-captain--${app}`];
|
|
32
|
+
}
|
|
33
|
+
return [name];
|
|
34
|
+
}
|
|
35
|
+
/** `KEY=value` pairs of a .env file: quotes removed, `# comments` after an unquoted value dropped. */
|
|
36
|
+
export function envFileEntries(content) {
|
|
37
|
+
const out = [];
|
|
38
|
+
for (const line of content.split(/\r?\n/)) {
|
|
39
|
+
const m = /^[ \t]*(?:export[ \t]+)?([A-Za-z_][A-Za-z0-9_]*)[ \t]*=[ \t]*(.*)$/.exec(line);
|
|
40
|
+
if (!m)
|
|
41
|
+
continue;
|
|
42
|
+
let value = m[2];
|
|
43
|
+
const q = value[0];
|
|
44
|
+
if ((q === '"' || q === "'") && value.indexOf(q, 1) > 0)
|
|
45
|
+
value = value.slice(1, value.indexOf(q, 1));
|
|
46
|
+
else
|
|
47
|
+
value = value.replace(/[ \t]+#.*$/, '').trim();
|
|
48
|
+
out.push({ key: m[1], value });
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
function parseUrl(value) {
|
|
53
|
+
if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(value))
|
|
54
|
+
return null;
|
|
55
|
+
try {
|
|
56
|
+
return new URL(value);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Why the panel's string cannot replace this one, or null when it can. */
|
|
63
|
+
function attachProblem(engine, url) {
|
|
64
|
+
const want = PANEL_SCHEME[engine];
|
|
65
|
+
if (engine === 'mongo')
|
|
66
|
+
return 'the panel\'s Mongo string names no database, so the app would use the default one; set the new host and credentials here, keeping the database name';
|
|
67
|
+
if (engine === 'clickhouse')
|
|
68
|
+
return 'ClickHouse is not attached by the import; set the new host and credentials here';
|
|
69
|
+
if (url.protocol !== want)
|
|
70
|
+
return `the panel's string starts with ${want}// and this one with ${url.protocol}//, which the app's driver may need`;
|
|
71
|
+
if (url.search)
|
|
72
|
+
return 'it carries options (?…) that the panel\'s string would drop';
|
|
73
|
+
if (REDIS_FAMILY.has(engine) && url.pathname !== '' && url.pathname !== '/' && url.pathname !== '/0')
|
|
74
|
+
return `it selects Redis database ${url.pathname.slice(1)}, and the panel's string uses 0`;
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
/** Every value in the file that names a planned database's source host, or the source platform's own host. */
|
|
78
|
+
export function findConnections(plan, envContent) {
|
|
79
|
+
const byHost = new Map();
|
|
80
|
+
for (const db of plan.databases)
|
|
81
|
+
for (const h of sourceHosts(plan.source.kind, db))
|
|
82
|
+
byHost.set(h, db);
|
|
83
|
+
let platform = null;
|
|
84
|
+
try {
|
|
85
|
+
// A Heroku plan's URL is the repository, not a host the app could reach a database on.
|
|
86
|
+
if (plan.source.kind !== 'heroku')
|
|
87
|
+
platform = new URL(plan.source.url).hostname.toLowerCase().replace(/^\[|\]$/g, '');
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
platform = null;
|
|
91
|
+
}
|
|
92
|
+
const hits = [];
|
|
93
|
+
for (const { key, value } of envFileEntries(envContent)) {
|
|
94
|
+
const url = parseUrl(value);
|
|
95
|
+
const host = (url ? url.hostname : value.replace(/:\d+$/, '')).toLowerCase().replace(/^\[|\]$/g, '');
|
|
96
|
+
if (!host)
|
|
97
|
+
continue;
|
|
98
|
+
const db = byHost.get(host);
|
|
99
|
+
if (db) {
|
|
100
|
+
if (!url) {
|
|
101
|
+
hits.push({ key, database: db, host, action: 'manual', reason: `it holds the source database's host; set it to ${db.name}'s host in NineDeploy (Databases → ${db.name} → Connection)` });
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const problem = db.engine ? attachProblem(db.engine, url) : 'NineDeploy has no managed equivalent of this database';
|
|
105
|
+
hits.push(problem
|
|
106
|
+
? { key, database: db, host, action: 'manual', reason: problem }
|
|
107
|
+
: { key, database: db, host, action: 'attach', reason: '' });
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (platform && host === platform && !url?.protocol.startsWith('http')) {
|
|
111
|
+
hits.push({
|
|
112
|
+
key, database: null, host, action: 'manual',
|
|
113
|
+
reason: 'NineDeploy can still reach that host, so the app would keep using the old database. Point it at the new one',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return hits;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=connections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connections.js","sourceRoot":"","sources":["../../../src/lib/importers/connections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coolify v4 (field names checked against v4.7.0, eaaaf7a7): REST under
|
|
3
|
+
* /api/v1 with a team-bound Bearer token. A `read` token is enough for a plan:
|
|
4
|
+
* values that need `read:sensitive` (env values, compose YAML, passwords) are
|
|
5
|
+
* never asked for. Databases come from /databases, not from per-environment
|
|
6
|
+
* lists, which leave out KeyDB, Dragonfly, ClickHouse and SQLite.
|
|
7
|
+
*/
|
|
8
|
+
import { type ImportPlan, type SourceGet } from './plan.js';
|
|
9
|
+
export declare function planFromCoolify(get: SourceGet, url: string): Promise<ImportPlan>;
|
|
10
|
+
//# sourceMappingURL=coolify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coolify.d.ts","sourceRoot":"","sources":["../../../src/lib/importers/coolify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAEL,KAAK,UAAU,EAAwE,KAAK,SAAS,EACtG,MAAM,WAAW,CAAC;AAkJnB,wBAAsB,eAAe,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAOtF"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coolify v4 (field names checked against v4.7.0, eaaaf7a7): REST under
|
|
3
|
+
* /api/v1 with a team-bound Bearer token. A `read` token is enough for a plan:
|
|
4
|
+
* values that need `read:sensitive` (env values, compose YAML, passwords) are
|
|
5
|
+
* never asked for. Databases come from /databases, not from per-environment
|
|
6
|
+
* lists, which leave out KeyDB, Dragonfly, ClickHouse and SQLite.
|
|
7
|
+
*/
|
|
8
|
+
import { cpusToMilli, DATA_NOT_MOVED, domainsFrom, emptyPlan, firstVolumeMount, memToMb, stripUserinfo, } from './plan.js';
|
|
9
|
+
const str = (v) => (typeof v === 'string' && v.trim() ? v.trim() : undefined);
|
|
10
|
+
const list = (v) => (Array.isArray(v) ? v : []);
|
|
11
|
+
const ENGINES = {
|
|
12
|
+
'standalone-postgresql': 'postgres',
|
|
13
|
+
'standalone-mysql': 'mysql',
|
|
14
|
+
'standalone-mariadb': 'mariadb',
|
|
15
|
+
'standalone-mongodb': 'mongo',
|
|
16
|
+
'standalone-redis': 'redis',
|
|
17
|
+
'standalone-keydb': 'keydb',
|
|
18
|
+
'standalone-dragonfly': 'dragonfly',
|
|
19
|
+
'standalone-clickhouse': 'clickhouse',
|
|
20
|
+
'standalone-sqlite': null,
|
|
21
|
+
};
|
|
22
|
+
/** Coolify git_repository is a URL, or `owner/repo` for GitHub sources. */
|
|
23
|
+
function repoUrlOf(app, issues) {
|
|
24
|
+
const full = str(app['git_full_url']) ?? str(app['git_repository']);
|
|
25
|
+
if (!full)
|
|
26
|
+
return undefined;
|
|
27
|
+
if (/^(https?|ssh|git):\/\//i.test(full) || /^[^@\s]+@[^:\s]+:/.test(full))
|
|
28
|
+
return stripUserinfo(full);
|
|
29
|
+
if (/^[\w.-]+\/[\w.-]+$/.test(full)) {
|
|
30
|
+
issues.push({ level: 'info', option: 'git_repository', detail: `"${full}" read as a GitHub repository.` });
|
|
31
|
+
return `https://github.com/${full}`;
|
|
32
|
+
}
|
|
33
|
+
return stripUserinfo(full);
|
|
34
|
+
}
|
|
35
|
+
async function envKeys(get, path) {
|
|
36
|
+
const rows = list(await get(path));
|
|
37
|
+
const keys = new Set();
|
|
38
|
+
// Preview variables (is_preview) belong to PR previews, not the service itself.
|
|
39
|
+
for (const r of rows)
|
|
40
|
+
if (r['is_preview'] !== true && str(r['key']))
|
|
41
|
+
keys.add(String(r['key']));
|
|
42
|
+
return [...keys].map((key) => ({ key }));
|
|
43
|
+
}
|
|
44
|
+
async function volumesOf(get, path) {
|
|
45
|
+
const s = (await get(path));
|
|
46
|
+
const out = [];
|
|
47
|
+
for (const v of list(s?.['persistent_storages'])) {
|
|
48
|
+
const mountPath = str(v['mount_path']);
|
|
49
|
+
if (mountPath)
|
|
50
|
+
out.push({ mountPath, source: str(v['host_path']) ? 'bind' : 'volume', name: str(v['name']) });
|
|
51
|
+
}
|
|
52
|
+
for (const v of list(s?.['file_storages'])) {
|
|
53
|
+
const mountPath = str(v['mount_path']);
|
|
54
|
+
if (mountPath)
|
|
55
|
+
out.push({ mountPath, source: 'file' });
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
async function applicationItem(get, app) {
|
|
60
|
+
const ref = String(app['uuid']);
|
|
61
|
+
const name = str(app['name']) ?? ref;
|
|
62
|
+
const issues = [];
|
|
63
|
+
const pack = str(app['build_pack']) ?? 'nixpacks';
|
|
64
|
+
const base = { name, type: 'docker' };
|
|
65
|
+
let kind = 'git';
|
|
66
|
+
let create = base;
|
|
67
|
+
if (pack === 'dockerimage') {
|
|
68
|
+
kind = 'image';
|
|
69
|
+
const image = str(app['docker_registry_image_name']);
|
|
70
|
+
const tag = str(app['docker_registry_image_tag']) ?? 'latest';
|
|
71
|
+
create = { ...base, image: image ? `${image}:${tag}` : undefined };
|
|
72
|
+
if (!image)
|
|
73
|
+
issues.push({ level: 'manual', option: 'docker_registry_image_name', detail: 'No image name in the source; set one before importing.' });
|
|
74
|
+
}
|
|
75
|
+
else if (pack === 'dockercompose') {
|
|
76
|
+
kind = 'compose';
|
|
77
|
+
create = { name, type: 'compose', repoUrl: repoUrlOf(app, issues), branch: str(app['git_branch']) };
|
|
78
|
+
const loc = str(app['docker_compose_location']);
|
|
79
|
+
issues.push({ level: 'info', option: 'docker_compose_location', detail: `Compose file ${loc ?? '/docker-compose.yaml'} in the repository; NineDeploy reads it from there.` });
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const buildPack = pack === 'nixpacks' || pack === 'static' || pack === 'dockerfile' || pack === 'railpack' ? pack : 'auto';
|
|
83
|
+
if (buildPack === 'auto')
|
|
84
|
+
issues.push({ level: 'unsupported', option: 'build_pack', detail: `Build pack "${pack}" has no NineDeploy equivalent; the plan uses auto-detect.` });
|
|
85
|
+
const dockerfile = str(app['dockerfile_location'])?.replace(/^\/+/, '');
|
|
86
|
+
create = {
|
|
87
|
+
...base,
|
|
88
|
+
repoUrl: repoUrlOf(app, issues),
|
|
89
|
+
branch: str(app['git_branch']),
|
|
90
|
+
build: {
|
|
91
|
+
buildPack,
|
|
92
|
+
baseDir: str(app['base_directory']) ?? '/',
|
|
93
|
+
...(buildPack === 'dockerfile' && dockerfile ? { dockerfilePath: dockerfile } : {}),
|
|
94
|
+
...(buildPack === 'static' && str(app['publish_directory']) ? { outputDir: str(app['publish_directory']).replace(/^\/+/, '') } : {}),
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
if (!create.repoUrl)
|
|
98
|
+
issues.push({ level: 'manual', option: 'git_repository', detail: 'No repository in the source.' });
|
|
99
|
+
}
|
|
100
|
+
const sourceType = str(app['source_type']) ?? '';
|
|
101
|
+
// Coolify gives every app made from a public repository its built-in "Public GitHub"
|
|
102
|
+
// source, GithubApp id 0 (checked live on 4.7.5). Only another source needs credentials.
|
|
103
|
+
const publicSource = /GithubApp/i.test(sourceType) && app['source_id'] != null && Number(app['source_id']) === 0;
|
|
104
|
+
const gitSource = /Github|Gitlab|Gitea|Bitbucket/i.test(sourceType) && !publicSource;
|
|
105
|
+
// A read token hides private_key_id, so a deploy-key app shows as an SSH repository URL.
|
|
106
|
+
const sshRepo = /^(ssh:\/\/|[^@\s/]+@[^:\s]+:)/i.test(str(app['git_repository']) ?? '');
|
|
107
|
+
if (gitSource || app['private_key_id'] != null || sshRepo || str(app['git_https_username'])) {
|
|
108
|
+
issues.push({ level: 'manual', option: 'source', detail: 'Private repository access does not transfer: reconnect it in NineDeploy (GitHub App, token or deploy key).' });
|
|
109
|
+
}
|
|
110
|
+
const ports = (str(app['ports_exposes']) ?? '').split(',').map((p) => Number(p.trim())).filter((p) => Number.isInteger(p) && p > 0 && p < 65536);
|
|
111
|
+
if (ports[0])
|
|
112
|
+
create.port = ports[0];
|
|
113
|
+
if (ports.length > 1)
|
|
114
|
+
issues.push({ level: 'info', option: 'ports_exposes', detail: `Exposes ${ports.join(', ')}; NineDeploy routes one port (${ports[0]}).` });
|
|
115
|
+
const mapping = str(app['ports_mappings']);
|
|
116
|
+
if (mapping)
|
|
117
|
+
issues.push({ level: 'manual', option: 'ports_mappings', detail: `Host port mappings (${mapping}) are not carried; set Public Host Port or port mappings by hand.` });
|
|
118
|
+
if (app['health_check_enabled'] === true && str(app['health_check_path']))
|
|
119
|
+
create.healthPath = str(app['health_check_path']);
|
|
120
|
+
const mem = memToMb(str(app['limits_memory']));
|
|
121
|
+
if (mem)
|
|
122
|
+
create.memLimitMb = mem;
|
|
123
|
+
const cpu = cpusToMilli(str(app['limits_cpus']));
|
|
124
|
+
if (cpu)
|
|
125
|
+
create.cpuLimitMilli = cpu;
|
|
126
|
+
const volumes = kind === 'compose' ? [] : await volumesOf(get, `/api/v1/applications/${ref}/storages`);
|
|
127
|
+
const mount = kind === 'compose' ? undefined : firstVolumeMount(volumes, issues);
|
|
128
|
+
if (mount)
|
|
129
|
+
create.volumeMount = mount;
|
|
130
|
+
return {
|
|
131
|
+
ref, name, kind, create,
|
|
132
|
+
domains: domainsFrom(str(app['fqdn'])),
|
|
133
|
+
env: await envKeys(get, `/api/v1/applications/${ref}/envs`),
|
|
134
|
+
volumes, issues,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
async function serviceStackItem(get, svc) {
|
|
138
|
+
const ref = String(svc['uuid']);
|
|
139
|
+
const name = str(svc['name']) ?? ref;
|
|
140
|
+
const issues = [
|
|
141
|
+
{ level: 'manual', option: 'docker_compose', detail: 'The stack\'s compose file needs a read:sensitive token to read; paste it into a new compose service.' },
|
|
142
|
+
];
|
|
143
|
+
const template = str(svc['service_type']);
|
|
144
|
+
if (template)
|
|
145
|
+
issues.push({ level: 'info', option: 'service_type', detail: `Coolify one-click template "${template}"; the NineDeploy Hub may have an equivalent.` });
|
|
146
|
+
const detail = (await get(`/api/v1/services/${ref}`));
|
|
147
|
+
const domains = list(detail?.['applications']).flatMap((a) => domainsFrom(str(a['fqdn'])));
|
|
148
|
+
return { ref, name, kind: 'compose', create: { name, type: 'compose' }, domains, env: await envKeys(get, `/api/v1/services/${ref}/envs`), volumes: [], issues };
|
|
149
|
+
}
|
|
150
|
+
function databaseItem(db) {
|
|
151
|
+
const type = str(db['database_type']) ?? '';
|
|
152
|
+
const engine = type in ENGINES ? ENGINES[type] : null;
|
|
153
|
+
const issues = [];
|
|
154
|
+
if (engine === null)
|
|
155
|
+
issues.push({ level: 'unsupported', option: 'database_type', detail: type === 'standalone-sqlite' ? 'SQLite is a file inside an app, not a managed server; NineDeploy has no managed SQLite.' : `Unknown database type "${type}".` });
|
|
156
|
+
else
|
|
157
|
+
issues.push(DATA_NOT_MOVED);
|
|
158
|
+
if (db['is_public'] === true)
|
|
159
|
+
issues.push({ level: 'manual', option: 'is_public', detail: 'Public access was on; turn on public access in NineDeploy if you still need it.' });
|
|
160
|
+
// Coolify names a standalone database's container after its uuid.
|
|
161
|
+
return { ref: String(db['uuid']), name: str(db['name']) ?? String(db['uuid']), engine, image: str(db['image']) ?? null, runtime: { kind: 'container', name: String(db['uuid']) }, issues };
|
|
162
|
+
}
|
|
163
|
+
export async function planFromCoolify(get, url) {
|
|
164
|
+
const version = await get('/api/v1/version').then((v) => (typeof v === 'string' ? v.trim() : null), () => null);
|
|
165
|
+
const plan = emptyPlan('coolify', url, version, 'the team the API token belongs to');
|
|
166
|
+
for (const app of list(await get('/api/v1/applications')))
|
|
167
|
+
plan.services.push(await applicationItem(get, app));
|
|
168
|
+
for (const svc of list(await get('/api/v1/services')))
|
|
169
|
+
plan.services.push(await serviceStackItem(get, svc));
|
|
170
|
+
for (const db of list(await get('/api/v1/databases')))
|
|
171
|
+
plan.databases.push(databaseItem(db));
|
|
172
|
+
return plan;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=coolify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coolify.js","sourceRoot":"","sources":["../../../src/lib/importers/coolify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dokploy (field names checked against v0.31.0, 3ac1c8f2): tRPC procedures
|
|
3
|
+
* exposed as REST by @dokploy/trpc-openapi, `GET /api/<procedure>?<input>`,
|
|
4
|
+
* with an `x-api-key` bound to one organization. There is no application.all:
|
|
5
|
+
* the plan walks project.all, then reads each item with its `*.one`.
|
|
6
|
+
*
|
|
7
|
+
* Dokploy returns secrets in plain text (decrypted env, database passwords,
|
|
8
|
+
* the registry password): the adapter reads names only and never copies a
|
|
9
|
+
* value into the plan.
|
|
10
|
+
*/
|
|
11
|
+
import { type ImportPlan, type SourceGet } from './plan.js';
|
|
12
|
+
export declare function planFromDokploy(get: SourceGet, url: string): Promise<ImportPlan>;
|
|
13
|
+
//# sourceMappingURL=dokploy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dokploy.d.ts","sourceRoot":"","sources":["../../../src/lib/importers/dokploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAEL,KAAK,UAAU,EAAwE,KAAK,SAAS,EACtG,MAAM,WAAW,CAAC;AA+HnB,wBAAsB,eAAe,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA0BtF"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dokploy (field names checked against v0.31.0, 3ac1c8f2): tRPC procedures
|
|
3
|
+
* exposed as REST by @dokploy/trpc-openapi, `GET /api/<procedure>?<input>`,
|
|
4
|
+
* with an `x-api-key` bound to one organization. There is no application.all:
|
|
5
|
+
* the plan walks project.all, then reads each item with its `*.one`.
|
|
6
|
+
*
|
|
7
|
+
* Dokploy returns secrets in plain text (decrypted env, database passwords,
|
|
8
|
+
* the registry password): the adapter reads names only and never copies a
|
|
9
|
+
* value into the plan.
|
|
10
|
+
*/
|
|
11
|
+
import { DATA_NOT_MOVED, emptyPlan, envNames, firstVolumeMount, memToMb, planDomain, replicasFor, stripUserinfo, } from './plan.js';
|
|
12
|
+
const str = (v) => (typeof v === 'string' && v.trim() ? v.trim() : undefined);
|
|
13
|
+
const list = (v) => (Array.isArray(v) ? v : []);
|
|
14
|
+
const q = (procedure, input) => `/api/${procedure}?${new URLSearchParams(input).toString()}`;
|
|
15
|
+
/** The repository a Dokploy application or compose builds from, per source type. */
|
|
16
|
+
function repoOf(row, issues) {
|
|
17
|
+
const type = str(row['sourceType']);
|
|
18
|
+
const hosted = (host, owner, repo) => (owner && repo ? `https://${host}/${owner}/${repo}` : undefined);
|
|
19
|
+
let out = {};
|
|
20
|
+
if (type === 'github')
|
|
21
|
+
out = { repoUrl: hosted('github.com', str(row['owner']), str(row['repository'])), branch: str(row['branch']) };
|
|
22
|
+
else if (type === 'gitlab')
|
|
23
|
+
out = { repoUrl: hosted('gitlab.com', str(row['gitlabOwner']), str(row['gitlabRepository'])), branch: str(row['gitlabBranch']) };
|
|
24
|
+
else if (type === 'bitbucket')
|
|
25
|
+
out = { repoUrl: hosted('bitbucket.org', str(row['bitbucketOwner']), str(row['bitbucketRepository'])), branch: str(row['bitbucketBranch']) };
|
|
26
|
+
else if (type === 'gitea') {
|
|
27
|
+
out = { branch: str(row['giteaBranch']) };
|
|
28
|
+
issues.push({ level: 'manual', option: 'sourceType', detail: `Gitea repository ${str(row['giteaOwner']) ?? '?'}/${str(row['giteaRepository']) ?? '?'}: enter its URL by hand (the Gitea host is not in the record).` });
|
|
29
|
+
}
|
|
30
|
+
else if (type === 'git') {
|
|
31
|
+
const raw = str(row['customGitUrl']);
|
|
32
|
+
out = { repoUrl: raw ? stripUserinfo(raw) : undefined, branch: str(row['customGitBranch']) };
|
|
33
|
+
}
|
|
34
|
+
if (type === 'github' || type === 'gitlab' || type === 'bitbucket' || type === 'gitea' || (type === 'git' && row['customGitSSHKeyId'] != null)) {
|
|
35
|
+
issues.push({ level: 'manual', option: 'source', detail: 'Repository access does not transfer: reconnect it in NineDeploy (GitHub App, token or deploy key).' });
|
|
36
|
+
}
|
|
37
|
+
if (type === 'gitlab' || type === 'bitbucket')
|
|
38
|
+
issues.push({ level: 'info', option: 'sourceType', detail: `Assumed the hosted ${type === 'gitlab' ? 'gitlab.com' : 'bitbucket.org'}; change the URL for a self-hosted instance.` });
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
function volumesOf(mounts) {
|
|
42
|
+
const out = [];
|
|
43
|
+
for (const m of list(mounts)) {
|
|
44
|
+
const mountPath = str(m['mountPath']);
|
|
45
|
+
if (!mountPath)
|
|
46
|
+
continue;
|
|
47
|
+
const type = str(m['type']);
|
|
48
|
+
out.push({ mountPath, source: type === 'bind' ? 'bind' : type === 'file' ? 'file' : 'volume', name: str(m['volumeName']) });
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
const BUILD_PACKS = {
|
|
53
|
+
nixpacks: 'nixpacks', dockerfile: 'dockerfile', static: 'static', railpack: 'railpack', heroku_buildpacks: 'heroku', paketo_buildpacks: 'paketo',
|
|
54
|
+
};
|
|
55
|
+
async function applicationItem(get, id) {
|
|
56
|
+
const app = ((await get(q('application.one', { applicationId: id }))) ?? {});
|
|
57
|
+
const name = str(app['name']) ?? str(app['appName']) ?? id;
|
|
58
|
+
const issues = [];
|
|
59
|
+
const base = { name, type: 'docker' };
|
|
60
|
+
const sourceType = str(app['sourceType']);
|
|
61
|
+
let kind = 'git';
|
|
62
|
+
let create = base;
|
|
63
|
+
if (sourceType === 'docker') {
|
|
64
|
+
kind = 'image';
|
|
65
|
+
create = { ...base, image: str(app['dockerImage']) };
|
|
66
|
+
if (str(app['username']) || app['registryUrl'])
|
|
67
|
+
issues.push({ level: 'manual', option: 'registry', detail: 'A private registry login does not transfer: add the registry credentials in NineDeploy.' });
|
|
68
|
+
}
|
|
69
|
+
else if (sourceType === 'drop') {
|
|
70
|
+
issues.push({ level: 'unsupported', option: 'sourceType', detail: 'Uploaded ("drop") source: the archive is not readable over the API. Re-upload it as a ZIP source in NineDeploy.' });
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const { repoUrl, branch } = repoOf(app, issues);
|
|
74
|
+
const buildType = str(app['buildType']) ?? 'nixpacks';
|
|
75
|
+
const buildPack = BUILD_PACKS[buildType] ?? 'auto';
|
|
76
|
+
if (buildPack === 'auto')
|
|
77
|
+
issues.push({ level: 'unsupported', option: 'buildType', detail: `Build type "${buildType}" has no NineDeploy equivalent; the plan uses auto-detect.` });
|
|
78
|
+
const dockerfile = str(app['dockerfile']);
|
|
79
|
+
const base_dir = str(app['customGitBuildPath']) ?? str(app['buildPath']);
|
|
80
|
+
create = {
|
|
81
|
+
...base, repoUrl, branch,
|
|
82
|
+
build: {
|
|
83
|
+
buildPack,
|
|
84
|
+
...(base_dir ? { baseDir: base_dir } : {}),
|
|
85
|
+
...(buildPack === 'dockerfile' && dockerfile ? { dockerfilePath: dockerfile.replace(/^\.?\/+/, '') } : {}),
|
|
86
|
+
...(buildPack === 'static' && str(app['publishDirectory']) ? { outputDir: str(app['publishDirectory']).replace(/^\.?\/+/, '') } : {}),
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
if (!repoUrl && sourceType !== 'gitea')
|
|
90
|
+
issues.push({ level: 'manual', option: 'repository', detail: 'No repository in the source.' });
|
|
91
|
+
}
|
|
92
|
+
const domains = list(app['domains']).map((d) => ({ host: str(d['host']) ?? '', https: d['https'] === true, port: Number(d['port']) })).filter((d) => d.host);
|
|
93
|
+
const port = domains.find((d) => Number.isInteger(d.port) && d.port > 0)?.port;
|
|
94
|
+
if (port)
|
|
95
|
+
create.port = port;
|
|
96
|
+
const portsList = list(app['ports']);
|
|
97
|
+
if (portsList.length)
|
|
98
|
+
issues.push({ level: 'manual', option: 'ports', detail: `${portsList.length} published port(s) (${portsList.map((p) => `${p['publishedPort']}:${p['targetPort']}`).join(', ')}); set Public Host Port or port mappings by hand.` });
|
|
99
|
+
const mem = memToMb(str(app['memoryLimit']) ?? app['memoryLimit']);
|
|
100
|
+
if (mem)
|
|
101
|
+
create.memLimitMb = mem;
|
|
102
|
+
// Dokploy passes these straight to Docker: memoryLimit as MemoryBytes and
|
|
103
|
+
// cpuLimit as NanoCPUs (1e9 = one core), both as strings.
|
|
104
|
+
const nano = Number(app['cpuLimit']);
|
|
105
|
+
const cpu = Number.isFinite(nano) && nano > 0 ? Math.round(nano / 1_000_000) : undefined;
|
|
106
|
+
if (cpu)
|
|
107
|
+
create.cpuLimitMilli = cpu;
|
|
108
|
+
const replicas = replicasFor(app['replicas'], issues);
|
|
109
|
+
if (replicas)
|
|
110
|
+
create.replicas = replicas;
|
|
111
|
+
if (str(app['command']))
|
|
112
|
+
issues.push({ level: 'manual', option: 'command', detail: 'A custom start command is set; add it as the start command under Settings → Build & start.' });
|
|
113
|
+
const volumes = volumesOf(app['mounts']);
|
|
114
|
+
const mount = firstVolumeMount(volumes, issues);
|
|
115
|
+
if (mount)
|
|
116
|
+
create.volumeMount = mount;
|
|
117
|
+
const appName = str(app['appName']);
|
|
118
|
+
return {
|
|
119
|
+
ref: id, name, kind, create, domains: domains.map(({ host, https }) => planDomain(host, https)), env: envNames(str(app['env'])), volumes, issues,
|
|
120
|
+
// Dokploy runs an application as a Swarm service named after its appName.
|
|
121
|
+
...(appName ? { runtime: { kind: 'swarm-service', name: appName } } : {}),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
async function composeItem(get, id) {
|
|
125
|
+
const row = ((await get(q('compose.one', { composeId: id }))) ?? {});
|
|
126
|
+
const name = str(row['name']) ?? str(row['appName']) ?? id;
|
|
127
|
+
const issues = [];
|
|
128
|
+
const create = { name, type: 'compose' };
|
|
129
|
+
if (str(row['sourceType']) === 'raw') {
|
|
130
|
+
issues.push({ level: 'manual', option: 'composeFile', detail: 'An inline compose file: paste it into a new compose service (the plan does not copy file contents).' });
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
Object.assign(create, repoOf(row, issues));
|
|
134
|
+
issues.push({ level: 'info', option: 'composePath', detail: `Compose file ${str(row['composePath']) ?? './docker-compose.yml'} in the repository.` });
|
|
135
|
+
}
|
|
136
|
+
if (str(row['composeType']) === 'stack')
|
|
137
|
+
issues.push({ level: 'info', option: 'composeType', detail: 'A Swarm stack; NineDeploy runs it as a Compose stack unless you choose Swarm.' });
|
|
138
|
+
const domains = list(row['domains']).map((d) => planDomain(str(d['host']) ?? '', d['https'] === true)).filter((d) => d.host);
|
|
139
|
+
return { ref: id, name, kind: 'compose', create, domains, env: envNames(str(row['env'])), volumes: volumesOf(row['mounts']), issues };
|
|
140
|
+
}
|
|
141
|
+
const DB_KINDS = [
|
|
142
|
+
{ key: 'postgres', idField: 'postgresId', procedure: 'postgres.one', engine: 'postgres' },
|
|
143
|
+
{ key: 'mysql', idField: 'mysqlId', procedure: 'mysql.one', engine: 'mysql' },
|
|
144
|
+
{ key: 'mariadb', idField: 'mariadbId', procedure: 'mariadb.one', engine: 'mariadb' },
|
|
145
|
+
{ key: 'mongo', idField: 'mongoId', procedure: 'mongo.one', engine: 'mongo' },
|
|
146
|
+
{ key: 'redis', idField: 'redisId', procedure: 'redis.one', engine: 'redis' },
|
|
147
|
+
{ key: 'libsql', idField: 'libsqlId', procedure: 'libsql.one', engine: null },
|
|
148
|
+
];
|
|
149
|
+
export async function planFromDokploy(get, url) {
|
|
150
|
+
const version = await get('/api/settings.getDokployVersion').then((v) => (typeof v === 'string' ? v.trim() : null), () => null);
|
|
151
|
+
const plan = emptyPlan('dokploy', url, version, "the organization the API key belongs to (other organizations are not read)");
|
|
152
|
+
for (const project of list(await get('/api/project.all'))) {
|
|
153
|
+
for (const env of list(project['environments'])) {
|
|
154
|
+
for (const a of list(env['applications']))
|
|
155
|
+
if (str(a['applicationId']))
|
|
156
|
+
plan.services.push(await applicationItem(get, String(a['applicationId'])));
|
|
157
|
+
for (const c of list(env['compose']))
|
|
158
|
+
if (str(c['composeId']))
|
|
159
|
+
plan.services.push(await composeItem(get, String(c['composeId'])));
|
|
160
|
+
for (const kind of DB_KINDS) {
|
|
161
|
+
for (const d of list(env[kind.key])) {
|
|
162
|
+
const id = str(d[kind.idField]);
|
|
163
|
+
if (!id)
|
|
164
|
+
continue;
|
|
165
|
+
const row = ((await get(q(kind.procedure, { [kind.idField]: id }))) ?? {});
|
|
166
|
+
const issues = kind.engine
|
|
167
|
+
? [DATA_NOT_MOVED]
|
|
168
|
+
: [{ level: 'unsupported', option: 'libsql', detail: 'libSQL has no managed NineDeploy equivalent.' }];
|
|
169
|
+
if (row['externalPort'] != null)
|
|
170
|
+
issues.push({ level: 'manual', option: 'externalPort', detail: 'Public access was on; turn on public access in NineDeploy if you still need it.' });
|
|
171
|
+
const item = { ref: id, name: str(row['name']) ?? str(d['name']) ?? id, engine: kind.engine, image: str(row['dockerImage']) ?? null, issues };
|
|
172
|
+
// Dokploy runs each database as a Swarm service named after its appName.
|
|
173
|
+
const appName = str(row['appName']) ?? str(d['appName']);
|
|
174
|
+
if (appName)
|
|
175
|
+
item.runtime = { kind: 'swarm-service', name: appName };
|
|
176
|
+
plan.databases.push(item);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return plan;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=dokploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dokploy.js","sourceRoot":"","sources":["../../../src/lib/importers/dokploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACL,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,GAEvG,MAAM,WAAW,CAAC;AAGnB,MAAM,GAAG,GAAG,CAAC,CAAU,EAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC3G,MAAM,IAAI,GAAG,CAAC,CAAU,EAAS,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC3E,MAAM,CAAC,GAAG,CAAC,SAAiB,EAAE,KAA6B,EAAE,EAAE,CAAC,QAAQ,SAAS,IAAI,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;AAE7H,oFAAoF;AACpF,SAAS,MAAM,CAAC,GAAQ,EAAE,MAAmB;IAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,KAAc,EAAE,IAAa,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjI,IAAI,GAAG,GAA0C,EAAE,CAAC;IACpD,IAAI,IAAI,KAAK,QAAQ;QAAE,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;SACjI,IAAI,IAAI,KAAK,QAAQ;QAAE,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;SACxJ,IAAI,IAAI,KAAK,WAAW;QAAE,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;SACvK,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,oBAAoB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,GAAG,gEAAgE,EAAE,CAAC,CAAC;IAC1N,CAAC;SAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;QACrC,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;IAC/F,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;QAC/I,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,oGAAoG,EAAE,CAAC,CAAC;IACnK,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,WAAW;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,sBAAsB,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,8CAA8C,EAAE,CAAC,CAAC;IACpO,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,MAAe;IAChC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9H,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,WAAW,GAA0F;IACzG,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ;CACjJ,CAAC;AAEF,KAAK,UAAU,eAAe,CAAC,GAAc,EAAE,EAAU;IACvD,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAQ,CAAC;IACpF,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1C,IAAI,IAAI,GAAwB,KAAK,CAAC;IACtC,IAAI,MAAM,GAA0B,IAAI,CAAC;IACzC,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,OAAO,CAAC;QACf,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACrD,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,yFAAyF,EAAE,CAAC,CAAC;IAC1M,CAAC;SAAM,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,iHAAiH,EAAE,CAAC,CAAC;IACzL,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,UAAU,CAAC;QACtD,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC;QACnD,IAAI,SAAS,KAAK,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,SAAS,4DAA4D,EAAE,CAAC,CAAC;QACnL,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;QACzE,MAAM,GAAG;YACP,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM;YACxB,KAAK,EAAE;gBACL,SAAS;gBACT,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,GAAG,CAAC,SAAS,KAAK,YAAY,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1G,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvI;SACF,CAAC;QACF,IAAI,CAAC,OAAO,IAAI,UAAU,KAAK,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC,CAAC;IACzI,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7J,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;IAC/E,IAAI,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,uBAAuB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,mDAAmD,EAAE,CAAC,CAAC;IAC1P,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAK,GAAG,CAAC,aAAa,CAAwB,CAAC,CAAC;IAC3F,IAAI,GAAG;QAAE,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;IACjC,0EAA0E;IAC1E,0DAA0D;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,IAAI,GAAG;QAAE,MAAM,CAAC,aAAa,GAAG,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IACtD,IAAI,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACzC,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,4FAA4F,EAAE,CAAC,CAAC;IACnL,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,KAAK;QAAE,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACpC,OAAO;QACL,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM;QAChJ,0EAA0E;QAC1E,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,eAAwB,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAc,EAAE,EAAU;IACnD,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAQ,CAAC;IAC5E,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,MAAM,GAA0B,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAChE,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,qGAAqG,EAAE,CAAC,CAAC;IACzK,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,gBAAgB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,sBAAsB,qBAAqB,EAAE,CAAC,CAAC;IACxJ,CAAC;IACD,IAAI,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,KAAK,OAAO;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,+EAA+E,EAAE,CAAC,CAAC;IACxL,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7H,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;AACxI,CAAC;AAED,MAAM,QAAQ,GAA0F;IACtG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE;IACzF,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;IAC7E,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE;IACrF,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;IAC7E,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;IAC7E,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE;CAC9E,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAc,EAAE,GAAW;IAC/D,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChI,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,4EAA4E,CAAC,CAAC;IAC9H,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;QAC1D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;YAChD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAAE,IAAI,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;oBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YACnJ,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAAE,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;oBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAClI,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;oBAChC,IAAI,CAAC,EAAE;wBAAE,SAAS;oBAClB,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAQ,CAAC;oBAClF,MAAM,MAAM,GAAgB,IAAI,CAAC,MAAM;wBACrC,CAAC,CAAC,CAAC,cAAc,CAAC;wBAClB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,8CAA8C,EAAE,CAAC,CAAC;oBACzG,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,iFAAiF,EAAE,CAAC,CAAC;oBACrL,MAAM,IAAI,GAAiB,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;oBAC5J,yEAAyE;oBACzE,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;oBACzD,IAAI,OAAO;wBAAE,IAAI,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oBACrE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A1: an import plan from a Heroku app's own files: `app.json` and the
|
|
3
|
+
* `Procfile` in a checkout of its repository. No Heroku API and no
|
|
4
|
+
* credential: the mapping follows Heroku's documented formats
|
|
5
|
+
* (devcenter: app-json-schema, procfile).
|
|
6
|
+
*
|
|
7
|
+
* - Every Procfile process except `release` becomes a service built from the
|
|
8
|
+
* repository with Nixpacks, whose start command is that process's line.
|
|
9
|
+
* Nixpacks is the build pack that honours a per-service start command, runs
|
|
10
|
+
* it through a shell (so `$PORT` expands) and sets PORT to the service port
|
|
11
|
+
* (checked live on a NineDeploy panel; the heroku/paketo buildpacks and
|
|
12
|
+
* Dockerfile builds ignore the start command).
|
|
13
|
+
* - A process other than `web` gets the `running` health check (it answers
|
|
14
|
+
* no HTTP), no port routing and no domain.
|
|
15
|
+
* - `release` is not mapped to NineDeploy's pre-deploy hook, which runs in
|
|
16
|
+
* the panel's own container before the build, without a shell (checked
|
|
17
|
+
* live). Nixpacks itself runs the Procfile's release line as a build step
|
|
18
|
+
* of every service built from the repository, with the attached
|
|
19
|
+
* DATABASE_URL (checked live), so it is flagged with what that means.
|
|
20
|
+
* - Nixpacks reads the Procfile itself, as YAML: a line with `: ` inside its
|
|
21
|
+
* command fails the build (checked live), so such lines are flagged.
|
|
22
|
+
* - `heroku-postgresql` and `heroku-redis` add-ons become databases attached
|
|
23
|
+
* to every service under DATABASE_URL / REDIS_URL, as Heroku sets them.
|
|
24
|
+
* - Config var names come from app.json `env`; values only ever come from a
|
|
25
|
+
* .env file at apply time (`heroku config --shell`).
|
|
26
|
+
*/
|
|
27
|
+
import { type ImportPlan } from './plan.js';
|
|
28
|
+
export interface HerokuFiles {
|
|
29
|
+
/** app.json content, if the repository has one. */
|
|
30
|
+
appJson?: string;
|
|
31
|
+
/** Procfile content, if the repository has one. */
|
|
32
|
+
procfile?: string;
|
|
33
|
+
/** The repository has a heroku.yml (container builds). */
|
|
34
|
+
herokuYml?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface HerokuOptions {
|
|
37
|
+
repoUrl: string;
|
|
38
|
+
branch: string;
|
|
39
|
+
/** The Heroku app name, for the pg:backups command (optional). */
|
|
40
|
+
app?: string;
|
|
41
|
+
/** Fallback service name (the checkout's directory name). */
|
|
42
|
+
dirName: string;
|
|
43
|
+
}
|
|
44
|
+
/** Procfile process types in file order: `<type>: <command>` lines. */
|
|
45
|
+
export declare function parseProcfile(content: string): Array<{
|
|
46
|
+
type: string;
|
|
47
|
+
command: string;
|
|
48
|
+
}>;
|
|
49
|
+
export declare function planFromHeroku(files: HerokuFiles, opts: HerokuOptions): ImportPlan;
|
|
50
|
+
//# sourceMappingURL=heroku.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heroku.d.ts","sourceRoot":"","sources":["../../../src/lib/importers/heroku.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,KAAK,UAAU,EAAmF,MAAM,WAAW,CAAC;AAO7H,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AACD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAOvF;AAUD,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,GAAG,UAAU,CAmGlF"}
|