@goldstack/template-hetzner-vps-cli 0.1.4 → 0.1.6
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/src/sshDeploy.d.ts +3 -0
- package/dist/src/sshDeploy.d.ts.map +1 -1
- package/dist/src/sshDeploy.js +49 -36
- package/dist/src/sshDeploy.js.map +1 -1
- package/dist/src/templateHetznerVPSCli.d.ts +1 -0
- package/dist/src/templateHetznerVPSCli.d.ts.map +1 -1
- package/dist/src/templateHetznerVPSCli.js +16 -1
- package/dist/src/templateHetznerVPSCli.js.map +1 -1
- package/package.json +1 -1
package/dist/src/sshDeploy.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
import { HetznerVPSDeployment } from '@goldstack/template-hetzner-vps';
|
|
2
|
+
export declare const build: (deployment: HetznerVPSDeployment) => Promise<{
|
|
3
|
+
zipPath: string;
|
|
4
|
+
}>;
|
|
2
5
|
export declare const sshDeploy: (deployment: HetznerVPSDeployment) => Promise<void>;
|
|
3
6
|
//# sourceMappingURL=sshDeploy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sshDeploy.d.ts","sourceRoot":"","sources":["../../src/sshDeploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"sshDeploy.d.ts","sourceRoot":"","sources":["../../src/sshDeploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAQvE,eAAO,MAAM,KAAK,eAAsB,oBAAoB;;EA+D3D,CAAC;AAmBF,eAAO,MAAM,SAAS,eAAsB,oBAAoB,kBAgC/D,CAAC"}
|
package/dist/src/sshDeploy.js
CHANGED
|
@@ -1,44 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.sshDeploy = void 0;
|
|
3
|
+
exports.sshDeploy = exports.build = void 0;
|
|
4
4
|
const utils_cli_1 = require("@goldstack/utils-cli");
|
|
5
5
|
const utils_sh_1 = require("@goldstack/utils-sh");
|
|
6
6
|
const fs_1 = require("fs");
|
|
7
7
|
const promises_1 = require("fs/promises");
|
|
8
8
|
const path_1 = require("path");
|
|
9
|
-
//
|
|
10
|
-
const
|
|
11
|
-
const sshCmd = `ssh -o StrictHostKeyChecking=no ${host} "${command}"`;
|
|
12
|
-
return (0, utils_sh_1.exec)(sshCmd);
|
|
13
|
-
};
|
|
14
|
-
// Helper function to upload files via SCP
|
|
15
|
-
const scpUpload = (localPath, remotePath, host) => {
|
|
16
|
-
const scpCmd = `scp -o StrictHostKeyChecking=no ${localPath} ${host}:${remotePath}`;
|
|
17
|
-
return (0, utils_sh_1.exec)(scpCmd);
|
|
18
|
-
};
|
|
19
|
-
// Method to create the zip file
|
|
20
|
-
const createZip = async (sourceDir, outputZip) => {
|
|
21
|
-
(0, utils_cli_1.logger)().info(`Creating zip from ${sourceDir}...`);
|
|
22
|
-
await (0, utils_sh_1.zip)({
|
|
23
|
-
directory: sourceDir,
|
|
24
|
-
target: outputZip,
|
|
25
|
-
});
|
|
26
|
-
// Get the size of the zip file
|
|
27
|
-
const stats = await (0, promises_1.stat)(outputZip);
|
|
28
|
-
const fileSizeInBytes = stats.size;
|
|
29
|
-
const fileSizeInMegabytes = (fileSizeInBytes / 1024).toFixed(2);
|
|
30
|
-
(0, utils_cli_1.logger)().info(`Zip file size: ${fileSizeInMegabytes} kB`);
|
|
31
|
-
};
|
|
32
|
-
// Deploy function
|
|
33
|
-
const sshDeploy = async (deployment) => {
|
|
34
|
-
const deploymentsInfo = JSON.parse((0, utils_sh_1.read)('src/state/deployments.json'));
|
|
35
|
-
const deploymentState = deploymentsInfo.find((e) => e.name === deployment.name);
|
|
36
|
-
if (!deploymentState) {
|
|
37
|
-
(0, utils_cli_1.logger)().error('Cannot deploy ' +
|
|
38
|
-
deployment.name +
|
|
39
|
-
' since infrastructure not provisioned yet.');
|
|
40
|
-
}
|
|
41
|
-
const host = 'goldstack@' + deploymentState.terraform.ipv4_address.value;
|
|
9
|
+
// Method to build the deployment files (preparing the staging directory, secrets, and creating the zip)
|
|
10
|
+
const build = async (deployment) => {
|
|
42
11
|
const sourceDir = 'server/';
|
|
43
12
|
const stagingDir = 'dist/server';
|
|
44
13
|
const zipPath = 'dist/server.zip';
|
|
@@ -72,8 +41,52 @@ const sshDeploy = async (deployment) => {
|
|
|
72
41
|
}
|
|
73
42
|
}
|
|
74
43
|
}
|
|
75
|
-
//
|
|
76
|
-
|
|
44
|
+
// Create the zip file
|
|
45
|
+
(0, utils_cli_1.logger)().info(`Creating zip from ${stagingDir}...`);
|
|
46
|
+
await (0, utils_sh_1.zip)({
|
|
47
|
+
directory: stagingDir,
|
|
48
|
+
target: zipPath,
|
|
49
|
+
});
|
|
50
|
+
// Get the size of the zip file
|
|
51
|
+
const stats = await (0, promises_1.stat)(zipPath);
|
|
52
|
+
const fileSizeInBytes = stats.size;
|
|
53
|
+
const fileSizeInMegabytes = (fileSizeInBytes / 1024).toFixed(2);
|
|
54
|
+
(0, utils_cli_1.logger)().info(`Zip file size: ${fileSizeInMegabytes} kB`);
|
|
55
|
+
(0, utils_cli_1.logger)().info('Build completed successfully.');
|
|
56
|
+
return {
|
|
57
|
+
zipPath,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
(0, utils_cli_1.logger)().error(`Error during build: ${error}`);
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
exports.build = build;
|
|
66
|
+
// Helper function to execute commands remotely via SSH
|
|
67
|
+
const sshExec = (host, command) => {
|
|
68
|
+
const sshCmd = `ssh -o StrictHostKeyChecking=no ${host} "${command}"`;
|
|
69
|
+
return (0, utils_sh_1.exec)(sshCmd);
|
|
70
|
+
};
|
|
71
|
+
// Helper function to upload files via SCP
|
|
72
|
+
const scpUpload = (localPath, remotePath, host) => {
|
|
73
|
+
const scpCmd = `scp -o StrictHostKeyChecking=no ${localPath} ${host}:${remotePath}`;
|
|
74
|
+
return (0, utils_sh_1.exec)(scpCmd);
|
|
75
|
+
};
|
|
76
|
+
// Deploy function
|
|
77
|
+
const sshDeploy = async (deployment) => {
|
|
78
|
+
try {
|
|
79
|
+
const deploymentsInfo = JSON.parse((0, utils_sh_1.read)('src/state/deployments.json'));
|
|
80
|
+
const deploymentState = deploymentsInfo.find((e) => e.name === deployment.name);
|
|
81
|
+
if (!deploymentState) {
|
|
82
|
+
(0, utils_cli_1.logger)().error('Cannot build ' +
|
|
83
|
+
deployment.name +
|
|
84
|
+
' since infrastructure not provisioned yet.');
|
|
85
|
+
throw new Error(`No deployment state found for ${deployment.name}`);
|
|
86
|
+
}
|
|
87
|
+
const host = 'goldstack@' + deploymentState.terraform.ipv4_address.value;
|
|
88
|
+
// Ensure build was completed separately and get the zip path and host
|
|
89
|
+
const { zipPath } = await (0, exports.build)(deployment);
|
|
77
90
|
// Step 2: Upload the zip file via SCP
|
|
78
91
|
(0, utils_cli_1.logger)().info('Uploading zip file...');
|
|
79
92
|
scpUpload(zipPath, '/home/goldstack', host);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sshDeploy.js","sourceRoot":"","sources":["../../src/sshDeploy.ts"],"names":[],"mappings":";;;AACA,oDAA8C;AAC9C,kDAAyE;AACzE,2BAA0D;AAC1D,0CAAmC;AACnC,+BAA4B;AAE5B,
|
|
1
|
+
{"version":3,"file":"sshDeploy.js","sourceRoot":"","sources":["../../src/sshDeploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templateHetznerVPSCli.d.ts","sourceRoot":"","sources":["../../src/templateHetznerVPSCli.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,GAAG,SAAgB,MAAM,EAAE,KAAG,QAAQ,IAAI,
|
|
1
|
+
{"version":3,"file":"templateHetznerVPSCli.d.ts","sourceRoot":"","sources":["../../src/templateHetznerVPSCli.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,QAAQ,QAAa,QAAQ,IAAI,CAY7C,CAAC;AAEF,eAAO,MAAM,GAAG,SAAgB,MAAM,EAAE,KAAG,QAAQ,IAAI,CAkDtD,CAAC"}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.run = void 0;
|
|
6
|
+
exports.run = exports.buildZip = void 0;
|
|
7
7
|
const utils_package_1 = require("@goldstack/utils-package");
|
|
8
8
|
const utils_cli_1 = require("@goldstack/utils-cli");
|
|
9
9
|
const utils_terraform_1 = require("@goldstack/utils-terraform");
|
|
@@ -13,6 +13,16 @@ const utils_package_config_1 = require("@goldstack/utils-package-config");
|
|
|
13
13
|
const yargs_1 = __importDefault(require("yargs"));
|
|
14
14
|
const utils_cli_2 = require("@goldstack/utils-cli");
|
|
15
15
|
const sshDeploy_1 = require("./sshDeploy");
|
|
16
|
+
const buildZip = async () => {
|
|
17
|
+
const args = process.argv.slice(2); // Skip the first two default args (node and script path)
|
|
18
|
+
const deploymentName = args[0]; // The first argument after `yarn build` will be `prod` if passed
|
|
19
|
+
const packageConfig = new utils_package_config_1.PackageConfig({
|
|
20
|
+
packagePath: './',
|
|
21
|
+
});
|
|
22
|
+
const deployment = packageConfig.getDeployment(deploymentName);
|
|
23
|
+
await (0, sshDeploy_1.build)(deployment);
|
|
24
|
+
};
|
|
25
|
+
exports.buildZip = buildZip;
|
|
16
26
|
const run = async (args) => {
|
|
17
27
|
await (0, utils_cli_1.wrapCli)(async () => {
|
|
18
28
|
const argv = await (0, utils_package_1.buildCli)({
|
|
@@ -31,6 +41,7 @@ const run = async (args) => {
|
|
|
31
41
|
if (command === 'deploy') {
|
|
32
42
|
(0, utils_cli_2.logger)().info('Starting deployment to Hetzner VPS.');
|
|
33
43
|
const deployment = packageConfig.getDeployment(opArgs[0]);
|
|
44
|
+
await (0, sshDeploy_1.build)(deployment);
|
|
34
45
|
await (0, sshDeploy_1.sshDeploy)(deployment);
|
|
35
46
|
return;
|
|
36
47
|
}
|
|
@@ -40,6 +51,10 @@ const run = async (args) => {
|
|
|
40
51
|
(0, utils_cli_2.logger)().info(`Running infrastructure operation ${infrastructureOp} for ${deployment.name}`);
|
|
41
52
|
// use remote managed state from Terraform
|
|
42
53
|
await (0, utils_terraform_aws_1.terraformAwsCli)(['create-state', opArgs[1]]);
|
|
54
|
+
if (infrastructureOp === 'destroy-state') {
|
|
55
|
+
await (0, utils_terraform_aws_1.terraformAwsCli)(['destroy-state', opArgs[1]]);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
43
58
|
const { awsProvider } = await (0, utils_terraform_aws_1.initTerraformEnvironment)(opArgs);
|
|
44
59
|
await (0, utils_terraform_hetzner_1.terraformHetznerCli)(opArgs, awsProvider);
|
|
45
60
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templateHetznerVPSCli.js","sourceRoot":"","sources":["../../src/templateHetznerVPSCli.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAyE;AACzE,oDAA+C;AAE/C,gEAA2D;AAC3D,wEAGwC;AACxC,gFAAyE;AACzE,0EAAgE;AAKhE,kDAA0B;AAE1B,oDAA8C;AAC9C,
|
|
1
|
+
{"version":3,"file":"templateHetznerVPSCli.js","sourceRoot":"","sources":["../../src/templateHetznerVPSCli.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAyE;AACzE,oDAA+C;AAE/C,gEAA2D;AAC3D,wEAGwC;AACxC,gFAAyE;AACzE,0EAAgE;AAKhE,kDAA0B;AAE1B,oDAA8C;AAC9C,2CAA+C;AAExC,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,yDAAyD;IAC7F,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,iEAAiE;IAEjG,MAAM,aAAa,GAAG,IAAI,oCAAa,CAGrC;QACA,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IAC/D,MAAM,IAAA,iBAAK,EAAC,UAAU,CAAC,CAAC;AAC1B,CAAC,CAAC;AAZW,QAAA,QAAQ,YAYnB;AAEK,MAAM,GAAG,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IACzD,MAAM,IAAA,mBAAO,EAAC,KAAK,IAAI,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,IAAA,wBAAQ,EAAC;YAC1B,KAAK,EAAL,eAAK;YACL,cAAc,EAAE,IAAA,mCAAmB,GAAE;YACrC,aAAa,EAAE,IAAA,+BAAa,GAAE;SAC/B,CAAC;aACC,IAAI,EAAE;aACN,KAAK,EAAE,CAAC;QAEX,MAAM,aAAa,GAAG,IAAI,oCAAa,CAGrC;YACA,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,EAAE,AAAD,EAAG,AAAD,EAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC;QAE/B,IAAI,OAAO,KAAK,QAAQ,EAAE;YACxB,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,IAAA,iBAAK,EAAC,UAAU,CAAC,CAAC;YACxB,MAAM,IAAA,qBAAS,EAAC,UAAU,CAAC,CAAC;YAC5B,OAAO;SACR;QAED,IAAI,OAAO,KAAK,OAAO,EAAE;YACvB,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACnC,IAAA,kBAAM,GAAE,CAAC,IAAI,CACX,oCAAoC,gBAAgB,QAAQ,UAAU,CAAC,IAAI,EAAE,CAC9E,CAAC;YACF,0CAA0C;YAC1C,MAAM,IAAA,qCAAe,EAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEnD,IAAI,gBAAgB,KAAK,eAAe,EAAE;gBACxC,MAAM,IAAA,qCAAe,EAAC,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,OAAO;aACR;YAED,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,8CAAwB,EAAC,MAAM,CAAC,CAAC;YAC/D,MAAM,IAAA,6CAAmB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAE/C,OAAO;SACR;QAED,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAlDW,QAAA,GAAG,OAkDd"}
|