anycloud 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/config/edit.js +15 -0
- package/dist/cli/commands/config/edit.js.map +1 -1
- package/dist/cli/commands/config/list.js +53 -18
- package/dist/cli/commands/config/list.js.map +1 -1
- package/dist/cli/commands/config/new.js +21 -0
- package/dist/cli/commands/config/new.js.map +1 -1
- package/dist/cli/commands/config/remove.js +10 -0
- package/dist/cli/commands/config/remove.js.map +1 -1
- package/dist/cli/commands/credentials/delete.js +10 -0
- package/dist/cli/commands/credentials/delete.js.map +1 -1
- package/dist/cli/commands/credentials/edit.js +16 -0
- package/dist/cli/commands/credentials/edit.js.map +1 -1
- package/dist/cli/commands/credentials/list.js +35 -13
- package/dist/cli/commands/credentials/list.js.map +1 -1
- package/dist/cli/commands/credentials/new.js +25 -0
- package/dist/cli/commands/credentials/new.js.map +1 -1
- package/dist/cli/commands/daemon/index.js +5 -3
- package/dist/cli/commands/daemon/index.js.map +1 -1
- package/dist/cli/commands/list.js +64 -14
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/login.js +10 -0
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logs.js +95 -11
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/{job.js → run.js} +45 -6
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/serve.js +15 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/status.js +113 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/terminate.js +79 -10
- package/dist/cli/commands/terminate.js.map +1 -1
- package/dist/cli/commands/upgrade.js +64 -6
- package/dist/cli/commands/upgrade.js.map +1 -1
- package/dist/cli/index.js +6 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/services/api-client.js +29 -7
- package/dist/cli/services/api-client.js.map +1 -1
- package/dist/cli/services/config.js +2 -0
- package/dist/cli/services/config.js.map +1 -1
- package/dist/cli/services/oauth.js +4 -5
- package/dist/cli/services/oauth.js.map +1 -1
- package/dist/cli/utils/env-parser.js +27 -0
- package/dist/cli/utils/env-parser.js.map +1 -0
- package/dist/cli/utils/output.js +42 -0
- package/dist/cli/utils/output.js.map +1 -1
- package/dist/daemon/cluster.js +113 -8
- package/dist/daemon/cluster.js.map +1 -1
- package/dist/daemon/docker.js +61 -20
- package/dist/daemon/docker.js.map +1 -1
- package/dist/daemon/preemption.js +127 -0
- package/dist/daemon/preemption.js.map +1 -0
- package/dist/daemon/server.js +118 -6
- package/dist/daemon/server.js.map +1 -1
- package/dist/shared/id-generator.js +20 -0
- package/dist/shared/id-generator.js.map +1 -0
- package/dist/shared/types.js +5 -1
- package/dist/shared/types.js.map +1 -1
- package/package.json +9 -3
- package/dist/cli/commands/job.js.map +0 -1
- package/dist/cli/commands/new.js +0 -15
- package/dist/cli/commands/new.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster.js","sourceRoot":"","sources":["../../src/daemon/cluster.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"cluster.js","sourceRoot":"","sources":["../../src/daemon/cluster.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/docker.js
CHANGED
|
@@ -5,7 +5,7 @@ import Docker from 'dockerode';
|
|
|
5
5
|
import { log } from './logger.js';
|
|
6
6
|
import { DeploymentType } from '../shared/types.js';
|
|
7
7
|
const docker = new Docker();
|
|
8
|
-
const
|
|
8
|
+
const DEFAULT_SERVER_PORT = 8088;
|
|
9
9
|
export class DockerManager {
|
|
10
10
|
constructor() {
|
|
11
11
|
this.containerId = null;
|
|
@@ -14,22 +14,50 @@ export class DockerManager {
|
|
|
14
14
|
/**
|
|
15
15
|
* Run container from pre-built image
|
|
16
16
|
*/
|
|
17
|
-
async runFromImage(
|
|
17
|
+
async runFromImage(props) {
|
|
18
|
+
const { githubUsername, githubToken, image } = props;
|
|
18
19
|
try {
|
|
19
|
-
log.info('Pulling Docker image', {
|
|
20
|
-
//
|
|
21
|
-
const
|
|
20
|
+
log.info('Pulling Docker image', { image });
|
|
21
|
+
// Prepare authentication for private registries
|
|
22
|
+
const pullOptions = {};
|
|
23
|
+
if (githubToken && githubUsername && image.includes('ghcr.io')) {
|
|
24
|
+
log.info('Using GitHub authentication for private registry', {
|
|
25
|
+
username: githubUsername,
|
|
26
|
+
});
|
|
27
|
+
// GitHub Container Registry authentication using OAuth token
|
|
28
|
+
pullOptions.authconfig = {
|
|
29
|
+
username: githubUsername,
|
|
30
|
+
password: githubToken, // OAuth access token with read:packages scope
|
|
31
|
+
serveraddress: 'ghcr.io',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Pull image with optional authentication
|
|
35
|
+
const stream = await docker.pull(image, pullOptions);
|
|
22
36
|
await new Promise((resolve, reject) => {
|
|
23
37
|
docker.modem.followProgress(stream, (err, res) => {
|
|
24
|
-
if (err)
|
|
38
|
+
if (err) {
|
|
39
|
+
log.error('Image pull failed', { error: err, image });
|
|
25
40
|
reject(err);
|
|
26
|
-
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
27
43
|
resolve(res);
|
|
44
|
+
}
|
|
45
|
+
}, (event) => {
|
|
46
|
+
// Log pull progress events
|
|
47
|
+
if (event.error) {
|
|
48
|
+
log.error('Pull event error', { event });
|
|
49
|
+
}
|
|
50
|
+
else if (event.status) {
|
|
51
|
+
log.debug('Pull progress', {
|
|
52
|
+
status: event.status,
|
|
53
|
+
id: event.id,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
28
56
|
});
|
|
29
57
|
});
|
|
30
|
-
log.info('Image pulled successfully', {
|
|
58
|
+
log.info('Image pulled successfully', { image });
|
|
31
59
|
// Run container
|
|
32
|
-
await this.runContainer(
|
|
60
|
+
await this.runContainer(props);
|
|
33
61
|
}
|
|
34
62
|
catch (error) {
|
|
35
63
|
log.error('Failed to run from image', error);
|
|
@@ -39,30 +67,43 @@ export class DockerManager {
|
|
|
39
67
|
/**
|
|
40
68
|
* Run Docker container with proper configuration
|
|
41
69
|
*/
|
|
42
|
-
async runContainer(
|
|
70
|
+
async runContainer(props) {
|
|
71
|
+
const { id, image, deploymentType, domain, env, githubToken } = props;
|
|
43
72
|
this.containerName = `anycloud-${id}`;
|
|
44
73
|
// Stop and remove existing container if it exists
|
|
45
74
|
await this.stopContainer();
|
|
46
75
|
log.info('Starting container', {
|
|
47
|
-
|
|
76
|
+
image,
|
|
48
77
|
containerName: this.containerName,
|
|
49
78
|
deploymentType,
|
|
50
79
|
});
|
|
51
80
|
// Only expose ports for app deployments (not for jobs)
|
|
52
81
|
const isJob = deploymentType === DeploymentType.Job;
|
|
53
|
-
const exposedPorts = isJob ? {} : { [`${
|
|
82
|
+
const exposedPorts = isJob ? {} : { [`${DEFAULT_SERVER_PORT}/tcp`]: {} };
|
|
54
83
|
const portBindings = isJob
|
|
55
84
|
? {}
|
|
56
|
-
: {
|
|
85
|
+
: {
|
|
86
|
+
[`${DEFAULT_SERVER_PORT}/tcp`]: [
|
|
87
|
+
{ HostPort: String(DEFAULT_SERVER_PORT) },
|
|
88
|
+
],
|
|
89
|
+
};
|
|
90
|
+
// Merge user-provided env vars with system env vars
|
|
91
|
+
// System env vars take priority
|
|
92
|
+
const userEnvArray = env
|
|
93
|
+
? Object.entries(env).map(([key, value]) => `${key}=${value}`)
|
|
94
|
+
: [];
|
|
95
|
+
const systemEnvArray = [
|
|
96
|
+
`ID=${id}`,
|
|
97
|
+
`DOMAIN=${domain}`,
|
|
98
|
+
`PORT=${DEFAULT_SERVER_PORT}`,
|
|
99
|
+
`DEPLOYMENT_TYPE=${deploymentType}`,
|
|
100
|
+
`GITHUB_TOKEN=${githubToken}`,
|
|
101
|
+
];
|
|
102
|
+
const mergedEnv = [...userEnvArray, ...systemEnvArray];
|
|
57
103
|
const container = await docker.createContainer({
|
|
58
|
-
Image:
|
|
104
|
+
Image: image,
|
|
59
105
|
name: this.containerName,
|
|
60
|
-
Env:
|
|
61
|
-
`ID=${id}`,
|
|
62
|
-
`DOMAIN=${domain}`,
|
|
63
|
-
`PORT=${APP_PORT}`,
|
|
64
|
-
`DEPLOYMENT_TYPE=${deploymentType}`,
|
|
65
|
-
],
|
|
106
|
+
Env: mergedEnv,
|
|
66
107
|
ExposedPorts: exposedPorts,
|
|
67
108
|
HostConfig: {
|
|
68
109
|
PortBindings: portBindings,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/daemon/docker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/daemon/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spot instance preemption detection for AWS, Azure, and GCP
|
|
3
|
+
*/
|
|
4
|
+
import axios from 'axios';
|
|
5
|
+
import { CloudType } from '../shared/types.js';
|
|
6
|
+
import { log } from './logger.js';
|
|
7
|
+
const PREEMPTION_CHECK_INTERVAL = 5 * 1000; // 5 seconds
|
|
8
|
+
// Configurable metadata endpoints (for testing)
|
|
9
|
+
const AWS_METADATA_URL = process.env.AWS_METADATA_URL || 'http://169.254.169.254';
|
|
10
|
+
const AZURE_METADATA_URL = process.env.AZURE_METADATA_URL || 'http://169.254.169.254';
|
|
11
|
+
const GCP_METADATA_URL = process.env.GCP_METADATA_URL || 'http://metadata.google.internal';
|
|
12
|
+
/**
|
|
13
|
+
* Detects spot/preemptible instance preemption signals across cloud providers
|
|
14
|
+
*/
|
|
15
|
+
export class PreemptionDetector {
|
|
16
|
+
constructor(cloudProvider) {
|
|
17
|
+
this.checkInterval = null;
|
|
18
|
+
this.cloudProvider = cloudProvider;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Start monitoring for preemption signals
|
|
22
|
+
*/
|
|
23
|
+
startMonitoring(onPreemptionDetected) {
|
|
24
|
+
log.info('Starting preemption detection', {
|
|
25
|
+
provider: this.cloudProvider,
|
|
26
|
+
interval: PREEMPTION_CHECK_INTERVAL,
|
|
27
|
+
});
|
|
28
|
+
this.checkInterval = setInterval(async () => {
|
|
29
|
+
try {
|
|
30
|
+
const isPreempted = await this.checkForPreemption();
|
|
31
|
+
if (isPreempted) {
|
|
32
|
+
log.error('Preemption detected!', { provider: this.cloudProvider });
|
|
33
|
+
// Stop monitoring after detection
|
|
34
|
+
this.stopMonitoring();
|
|
35
|
+
onPreemptionDetected();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// Don't log every failed check to avoid spam
|
|
40
|
+
// Metadata service may be temporarily unavailable
|
|
41
|
+
log.debug('Preemption check failed', error);
|
|
42
|
+
}
|
|
43
|
+
}, PREEMPTION_CHECK_INTERVAL);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Stop monitoring for preemption
|
|
47
|
+
*/
|
|
48
|
+
stopMonitoring() {
|
|
49
|
+
if (this.checkInterval) {
|
|
50
|
+
clearInterval(this.checkInterval);
|
|
51
|
+
this.checkInterval = null;
|
|
52
|
+
log.info('Stopped preemption detection');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Check metadata service for preemption signal based on cloud provider
|
|
57
|
+
*/
|
|
58
|
+
async checkForPreemption() {
|
|
59
|
+
switch (this.cloudProvider) {
|
|
60
|
+
case CloudType.AWS:
|
|
61
|
+
return this.checkAwsPreemption();
|
|
62
|
+
case CloudType.Azure:
|
|
63
|
+
return this.checkAzurePreemption();
|
|
64
|
+
case CloudType.GCP:
|
|
65
|
+
return this.checkGcpPreemption();
|
|
66
|
+
default:
|
|
67
|
+
throw new Error(`Unsupported cloud provider: ${this.cloudProvider}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check AWS EC2 Spot Instance metadata for termination notice
|
|
72
|
+
*/
|
|
73
|
+
async checkAwsPreemption() {
|
|
74
|
+
// First, get IMDSv2 token
|
|
75
|
+
const tokenRes = await axios.put(`${AWS_METADATA_URL}/latest/api/token`, null, {
|
|
76
|
+
headers: {
|
|
77
|
+
'X-aws-ec2-metadata-token-ttl-seconds': '21600',
|
|
78
|
+
},
|
|
79
|
+
timeout: 2000,
|
|
80
|
+
});
|
|
81
|
+
const token = tokenRes.data;
|
|
82
|
+
// Query spot instance action endpoint
|
|
83
|
+
const res = await axios.get(`${AWS_METADATA_URL}/latest/meta-data/spot/instance-action`, {
|
|
84
|
+
headers: {
|
|
85
|
+
'X-aws-ec2-metadata-token': token,
|
|
86
|
+
},
|
|
87
|
+
timeout: 2000,
|
|
88
|
+
validateStatus: (status) => status === 200 || status === 404,
|
|
89
|
+
});
|
|
90
|
+
// 404 means no preemption scheduled
|
|
91
|
+
return res.status === 200;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Check Azure Scheduled Events API for preemption signal
|
|
95
|
+
*/
|
|
96
|
+
async checkAzurePreemption() {
|
|
97
|
+
const res = await axios.get(`${AZURE_METADATA_URL}/metadata/scheduledevents?api-version=2020-07-01`, {
|
|
98
|
+
headers: {
|
|
99
|
+
Metadata: 'true',
|
|
100
|
+
},
|
|
101
|
+
timeout: 2000,
|
|
102
|
+
validateStatus: (status) => status === 200 || status === 404,
|
|
103
|
+
});
|
|
104
|
+
if (res.status === 404 ||
|
|
105
|
+
!res.data.Events ||
|
|
106
|
+
res.data.Events.length === 0) {
|
|
107
|
+
return false; // No events scheduled
|
|
108
|
+
}
|
|
109
|
+
// Look for Preempt event type
|
|
110
|
+
const preemptEvent = res.data.Events.find((e) => e.EventType === 'Preempt');
|
|
111
|
+
return !!preemptEvent;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check GCP Preemptible VM metadata for preemption signal
|
|
115
|
+
*/
|
|
116
|
+
async checkGcpPreemption() {
|
|
117
|
+
const res = await axios.get(`${GCP_METADATA_URL}/computeMetadata/v1/instance/scheduling/preempted`, {
|
|
118
|
+
headers: {
|
|
119
|
+
'Metadata-Flavor': 'Google',
|
|
120
|
+
},
|
|
121
|
+
timeout: 2000,
|
|
122
|
+
validateStatus: () => true,
|
|
123
|
+
});
|
|
124
|
+
return res.data === 'true' || res.data === true;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=preemption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preemption.js","sourceRoot":"","sources":["../../src/daemon/preemption.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/server.js
CHANGED
|
@@ -8,7 +8,7 @@ import { generateSelfSignedCert } from './cert.js';
|
|
|
8
8
|
import { DockerManager } from './docker.js';
|
|
9
9
|
import { MetricsCollector } from './metrics.js';
|
|
10
10
|
import { Coordinator } from './cluster.js';
|
|
11
|
-
const CONTROL_PORT = 4142;
|
|
11
|
+
export const CONTROL_PORT = 4142;
|
|
12
12
|
let dockerManager;
|
|
13
13
|
let metricsCollector;
|
|
14
14
|
let clusterCoordinator;
|
|
@@ -25,10 +25,14 @@ function authenticateRequest(deploymentSecret) {
|
|
|
25
25
|
next();
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// Application Factory
|
|
30
|
+
// ============================================================================
|
|
28
31
|
/**
|
|
29
|
-
*
|
|
32
|
+
* Creates and configures the Express application.
|
|
33
|
+
* Exported for testability - doesn't start the server.
|
|
30
34
|
*/
|
|
31
|
-
export
|
|
35
|
+
export function createApp(deploymentSecret, conductorUrl) {
|
|
32
36
|
const app = express();
|
|
33
37
|
app.use(express.json({ limit: '100mb' }));
|
|
34
38
|
// Authentication middleware
|
|
@@ -69,6 +73,25 @@ export async function startServer(deploymentSecret, conductorUrl) {
|
|
|
69
73
|
res.status(500).json({ status: 'error', error: String(error) });
|
|
70
74
|
}
|
|
71
75
|
});
|
|
76
|
+
/**
|
|
77
|
+
* GET /logs
|
|
78
|
+
* Get Docker container logs
|
|
79
|
+
*/
|
|
80
|
+
app.get('/logs', async (req, res) => {
|
|
81
|
+
try {
|
|
82
|
+
const tail = req.query.tail ? parseInt(req.query.tail) : 100;
|
|
83
|
+
log.info('Fetching container logs', { tail });
|
|
84
|
+
const logs = await dockerManager.getLogs(tail);
|
|
85
|
+
res.json(logs);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
log.error('Failed to fetch logs', error);
|
|
89
|
+
const errorResponse = {
|
|
90
|
+
error: error instanceof Error ? error.message : String(error),
|
|
91
|
+
};
|
|
92
|
+
res.status(500).json(errorResponse);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
72
95
|
/**
|
|
73
96
|
* POST /start
|
|
74
97
|
* Receive deployment configuration and start the container
|
|
@@ -84,14 +107,17 @@ export async function startServer(deploymentSecret, conductorUrl) {
|
|
|
84
107
|
throw new Error('Image parameter is required');
|
|
85
108
|
}
|
|
86
109
|
// Pull and run container from image
|
|
87
|
-
await dockerManager.runFromImage(props
|
|
110
|
+
await dockerManager.runFromImage(props);
|
|
88
111
|
// Start deployment coordination (metrics, scaling, etc.)
|
|
89
112
|
await clusterCoordinator.start(props);
|
|
90
|
-
res.
|
|
113
|
+
res.sendStatus(200);
|
|
91
114
|
}
|
|
92
115
|
catch (error) {
|
|
93
116
|
log.error('Failed to start', error);
|
|
94
|
-
|
|
117
|
+
const errorResponse = {
|
|
118
|
+
error: error instanceof Error ? error.message : String(error),
|
|
119
|
+
};
|
|
120
|
+
res.status(500).json(errorResponse);
|
|
95
121
|
}
|
|
96
122
|
});
|
|
97
123
|
/**
|
|
@@ -101,10 +127,82 @@ export async function startServer(deploymentSecret, conductorUrl) {
|
|
|
101
127
|
log.error('Unhandled error', err);
|
|
102
128
|
res.status(500).json({ error: err.message });
|
|
103
129
|
});
|
|
130
|
+
return app;
|
|
131
|
+
}
|
|
132
|
+
// ============================================================================
|
|
133
|
+
// Process-Level Error Handlers
|
|
134
|
+
// ============================================================================
|
|
135
|
+
/**
|
|
136
|
+
* Sets up process-level error handlers for graceful degradation.
|
|
137
|
+
* Exported for testability.
|
|
138
|
+
*/
|
|
139
|
+
export function setupProcessHandlers() {
|
|
140
|
+
// Process-level error handlers to prevent crashes
|
|
141
|
+
process.on('uncaughtException', (error) => {
|
|
142
|
+
log.error('Uncaught exception - shutting down gracefully', {
|
|
143
|
+
error: error.message,
|
|
144
|
+
stack: error.stack,
|
|
145
|
+
});
|
|
146
|
+
// For uncaught exceptions, we should exit as the process is in an unknown state
|
|
147
|
+
// Give time for logs to flush
|
|
148
|
+
setTimeout(() => {
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}, 1000);
|
|
151
|
+
});
|
|
152
|
+
process.on('unhandledRejection', (reason) => {
|
|
153
|
+
log.warn('Unhandled promise rejection', {
|
|
154
|
+
reason: String(reason),
|
|
155
|
+
});
|
|
156
|
+
// Log but don't exit - might be a background task
|
|
157
|
+
// Note: Future Node.js versions will exit on unhandled rejections
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// ============================================================================
|
|
161
|
+
// Cluster Coordinator Access
|
|
162
|
+
// ============================================================================
|
|
163
|
+
/**
|
|
164
|
+
* Get the cluster coordinator instance.
|
|
165
|
+
* Exported for shutdown sequence.
|
|
166
|
+
*/
|
|
167
|
+
export function getCoordinator() {
|
|
168
|
+
return clusterCoordinator;
|
|
169
|
+
}
|
|
170
|
+
// ============================================================================
|
|
171
|
+
// Server Startup
|
|
172
|
+
// ============================================================================
|
|
173
|
+
/**
|
|
174
|
+
* Start the daemon HTTPS server.
|
|
175
|
+
* Used by CLI for backwards compatibility.
|
|
176
|
+
*/
|
|
177
|
+
export async function startServer(deploymentSecret, conductorUrl) {
|
|
178
|
+
// Setup process handlers first
|
|
179
|
+
setupProcessHandlers();
|
|
180
|
+
const app = createApp(deploymentSecret, conductorUrl);
|
|
104
181
|
// Generate self-signed SSL certificate
|
|
105
182
|
const { cert, key } = generateSelfSignedCert();
|
|
106
183
|
// Start HTTPS server
|
|
107
184
|
const server = https.createServer({ cert, key }, app);
|
|
185
|
+
// Graceful shutdown handlers
|
|
186
|
+
const shutdown = async () => {
|
|
187
|
+
log.info('Shutdown signal received, shutting down gracefully');
|
|
188
|
+
// Stop coordinator intervals
|
|
189
|
+
const coordinator = getCoordinator();
|
|
190
|
+
if (coordinator) {
|
|
191
|
+
await coordinator.stop();
|
|
192
|
+
}
|
|
193
|
+
// Close server
|
|
194
|
+
server.close(() => {
|
|
195
|
+
log.info('HTTPS server closed');
|
|
196
|
+
process.exit(0);
|
|
197
|
+
});
|
|
198
|
+
// Force exit if graceful shutdown takes too long
|
|
199
|
+
setTimeout(() => {
|
|
200
|
+
log.error('Graceful shutdown timed out, forcing exit');
|
|
201
|
+
process.exit(1);
|
|
202
|
+
}, 10000);
|
|
203
|
+
};
|
|
204
|
+
process.on('SIGTERM', shutdown);
|
|
205
|
+
process.on('SIGINT', shutdown);
|
|
108
206
|
await new Promise((resolve) => {
|
|
109
207
|
server.listen(CONTROL_PORT, () => {
|
|
110
208
|
log.info(`Daemon control port listening on https://0.0.0.0:${CONTROL_PORT}`);
|
|
@@ -112,4 +210,18 @@ export async function startServer(deploymentSecret, conductorUrl) {
|
|
|
112
210
|
});
|
|
113
211
|
});
|
|
114
212
|
}
|
|
213
|
+
// ============================================================================
|
|
214
|
+
// Server Startup (only when run directly)
|
|
215
|
+
// ============================================================================
|
|
216
|
+
// Only start server if this file is run directly (not imported)
|
|
217
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
218
|
+
// Parse command line arguments
|
|
219
|
+
const deploymentSecret = process.argv[2];
|
|
220
|
+
const conductorUrl = process.argv[3];
|
|
221
|
+
if (!deploymentSecret || !conductorUrl) {
|
|
222
|
+
console.error('Usage: node server.js <deploymentSecret> <conductorUrl>');
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
await startServer(deploymentSecret, conductorUrl);
|
|
226
|
+
}
|
|
115
227
|
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAA4C,MAAM,SAAS,CAAC;AACnE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,YAAY,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { uniqueNamesGenerator, animals, NumberDictionary, colors, } from 'unique-names-generator';
|
|
2
|
+
const NUMBER_DICT = NumberDictionary.generate({ min: 1, max: 99 });
|
|
3
|
+
/**
|
|
4
|
+
* Generate a unique server/app ID using readable names
|
|
5
|
+
* Example: "blue-dolphin-42"
|
|
6
|
+
*/
|
|
7
|
+
export function generateServerId() {
|
|
8
|
+
return uniqueNamesGenerator({
|
|
9
|
+
dictionaries: [colors, animals, NUMBER_DICT],
|
|
10
|
+
separator: '-',
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate a unique job ID using timestamp
|
|
15
|
+
* Example: "anycloud-1732019234567"
|
|
16
|
+
*/
|
|
17
|
+
export function generateJobId() {
|
|
18
|
+
return `anycloud-${Date.now()}`;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=id-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-generator.js","sourceRoot":"","sources":["../../src/shared/id-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,OAAO,EACP,gBAAgB,EAChB,MAAM,GACP,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,oBAAoB,CAAC;QAC1B,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC;QAC5C,SAAS,EAAE,GAAG;KACf,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAClC,CAAC"}
|
package/dist/shared/types.js
CHANGED
|
@@ -15,7 +15,7 @@ export var CloudType;
|
|
|
15
15
|
// Deployment type enum
|
|
16
16
|
export var DeploymentType;
|
|
17
17
|
(function (DeploymentType) {
|
|
18
|
-
DeploymentType["
|
|
18
|
+
DeploymentType["Server"] = "server";
|
|
19
19
|
DeploymentType["Job"] = "job";
|
|
20
20
|
})(DeploymentType || (DeploymentType = {}));
|
|
21
21
|
// Credential classes
|
|
@@ -78,4 +78,8 @@ export class CloudConfig {
|
|
|
78
78
|
return USRegions.length ? USRegions[0] : regionsPerType[0];
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
|
+
// GET /health - Daemon basic health check
|
|
82
|
+
// Response: 200 status code if healthy
|
|
83
|
+
// GET /deploymentHealth - Daemon detailed health check
|
|
84
|
+
// Response: 200 status code if container running and healthy
|
|
81
85
|
//# sourceMappingURL=types.js.map
|
package/dist/shared/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,iBAAiB,MAAM,2CAA2C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrG,OAAO,KAAK,iBAAiB,MAAM,2CAA2C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrG,OAAO,KAAK,mBAAmB,MAAM,6CAA6C,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEzG,sBAAsB;AACtB,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,wBAAW,CAAA;IACX,4BAAe,CAAA;AACjB,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED,uBAAuB;AACvB,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "anycloud",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "Deploy
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"description": "Deploy containerized jobs and servers to any cloud provider",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
7
|
"bin": {
|
|
@@ -26,11 +26,14 @@
|
|
|
26
26
|
"start:conductor": "node ./dist/conductor/server.js",
|
|
27
27
|
"test": "LOCAL=true vitest run",
|
|
28
28
|
"test:watch": "LOCAL=true vitest",
|
|
29
|
-
"test:integration": "yarn test:daemon",
|
|
29
|
+
"test:integration": "yarn test:daemon && yarn test:preemption",
|
|
30
30
|
"terminate": "export $(cat .dev.vars.staging | xargs) && ts-node-dev scripts/forceTerminate.ts",
|
|
31
31
|
"watch:daemon": "ts-node-dev src/cli/index.ts daemon start",
|
|
32
32
|
"test:daemon": "bash test/integration/daemon-basic.test.sh",
|
|
33
|
+
"test:daemon:private": "gh auth refresh --scopes write:packages,read:packages && GITHUB_TOKEN=$(gh auth token) bash test/integration/daemon-private-image.test.sh",
|
|
34
|
+
"test:preemption": "bash test/integration/daemon-preemption.test.sh",
|
|
33
35
|
"test:vmstartup": "bash test/integration/vmstartup.test.sh",
|
|
36
|
+
"test:conductor": "bash test/integration/conductor-startup.test.sh",
|
|
34
37
|
"test:e2e:azure": "bash scripts/test-jobs-integration-azure.sh",
|
|
35
38
|
"test:all": "yarn test && yarn test:integration",
|
|
36
39
|
"style": "yarn eslint . --ext .js,.ts && yarn prettier --check .",
|
|
@@ -47,12 +50,15 @@
|
|
|
47
50
|
"@cloudflare/containers": "^0.0.30",
|
|
48
51
|
"@google-cloud/compute": "^6.4.0",
|
|
49
52
|
"@octokit/rest": "^21.0.2",
|
|
53
|
+
"@types/dotenv": "^8.2.3",
|
|
50
54
|
"@types/express": "^5.0.5",
|
|
51
55
|
"@types/node": "^22.0.0",
|
|
52
56
|
"axios": "^1.6.0",
|
|
53
57
|
"chalk": "^5.6.2",
|
|
58
|
+
"cli-table3": "^0.6.5",
|
|
54
59
|
"commander": "^14.0.2",
|
|
55
60
|
"dockerode": "^4.0.0",
|
|
61
|
+
"dotenv": "^17.2.3",
|
|
56
62
|
"express": "^5.1.0",
|
|
57
63
|
"gce-images": "^5.0.0",
|
|
58
64
|
"ini": "^6.0.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"job.js","sourceRoot":"","sources":["../../../src/cli/commands/job.ts"],"names":[],"mappings":"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"}
|