@peerbit/server 6.0.42 → 7.0.0
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/cli.d.ts.map +1 -1
- package/dist/src/cli.js +161 -352
- package/dist/src/cli.js.map +1 -1
- package/dist/src/client.d.ts +1 -1
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +2 -5
- package/dist/src/client.js.map +1 -1
- package/dist/src/docker.d.ts +70 -1
- package/dist/src/docker.d.ts.map +1 -1
- package/dist/src/docker.js +559 -14
- package/dist/src/docker.js.map +1 -1
- package/dist/src/domain-lease.d.ts +126 -0
- package/dist/src/domain-lease.d.ts.map +1 -0
- package/dist/src/domain-lease.js +800 -0
- package/dist/src/domain-lease.js.map +1 -0
- package/dist/src/domain.d.ts +50 -2
- package/dist/src/domain.d.ts.map +1 -1
- package/dist/src/domain.js +484 -67
- package/dist/src/domain.js.map +1 -1
- package/dist/src/hetzner.d.ts +4 -21
- package/dist/src/hetzner.d.ts.map +1 -1
- package/dist/src/hetzner.js +4 -116
- package/dist/src/hetzner.js.map +1 -1
- package/dist/src/nginx-template.conf +19 -1
- package/dist/src/remotes.browser.d.ts +4 -1
- package/dist/src/remotes.browser.d.ts.map +1 -1
- package/dist/src/remotes.browser.js +1 -2
- package/dist/src/remotes.browser.js.map +1 -1
- package/dist/src/remotes.d.ts +2 -1
- package/dist/src/remotes.d.ts.map +1 -1
- package/dist/src/remotes.js +1 -0
- package/dist/src/remotes.js.map +1 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +3 -5
- package/dist/src/server.js.map +1 -1
- package/dist/test/api.spec.js +2 -1
- package/dist/test/api.spec.js.map +1 -1
- package/dist/test/cli.spec.js +48 -1
- package/dist/test/cli.spec.js.map +1 -1
- package/dist/test/docker.spec.d.ts +2 -0
- package/dist/test/docker.spec.d.ts.map +1 -0
- package/dist/test/docker.spec.js +822 -0
- package/dist/test/docker.spec.js.map +1 -0
- package/dist/test/domain-lease.spec.d.ts +2 -0
- package/dist/test/domain-lease.spec.d.ts.map +1 -0
- package/dist/test/domain-lease.spec.js +530 -0
- package/dist/test/domain-lease.spec.js.map +1 -0
- package/dist/test/domain.integration.spec.js +358 -75
- package/dist/test/domain.integration.spec.js.map +1 -1
- package/dist/test/remotes.spec.d.ts +2 -0
- package/dist/test/remotes.spec.d.ts.map +1 -0
- package/dist/test/remotes.spec.js +15 -0
- package/dist/test/remotes.spec.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/assets/index-CjZwCewh.js +10 -0
- package/dist/ui/assets/index-e3g42MbC.js +9 -0
- package/dist/ui/index.html +1 -1
- package/package.json +14 -19
- package/src/cli.ts +204 -408
- package/src/client.ts +2 -6
- package/src/docker.ts +841 -20
- package/src/domain-lease.ts +1118 -0
- package/src/domain.ts +650 -90
- package/src/hetzner.ts +4 -184
- package/src/nginx-template.conf +19 -1
- package/src/remotes.browser.ts +7 -1
- package/src/remotes.ts +6 -1
- package/src/server.ts +3 -5
- package/dist/src/aws.browser.d.ts +0 -2
- package/dist/src/aws.browser.d.ts.map +0 -1
- package/dist/src/aws.browser.js +0 -3
- package/dist/src/aws.browser.js.map +0 -1
- package/dist/src/aws.d.ts +0 -30
- package/dist/src/aws.d.ts.map +0 -1
- package/dist/src/aws.js +0 -240
- package/dist/src/aws.js.map +0 -1
- package/dist/test/launch.spec.d.ts +0 -2
- package/dist/test/launch.spec.d.ts.map +0 -1
- package/dist/test/launch.spec.js +0 -23
- package/dist/test/launch.spec.js.map +0 -1
- package/dist/ui/assets/index-BBTKOM0z.js +0 -6
- package/dist/ui/assets/index-DVtj_GOf.js +0 -13
- package/src/aws.browser.ts +0 -1
- package/src/aws.ts +0 -327
package/src/hetzner.ts
CHANGED
|
@@ -1,30 +1,3 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
/* eslint-disable @typescript-eslint/naming-convention */
|
|
3
|
-
import { type PeerId } from "@libp2p/interface";
|
|
4
|
-
import { delay } from "@peerbit/time";
|
|
5
|
-
|
|
6
|
-
export const HETZNER_LOCATIONS = [
|
|
7
|
-
"fsn1",
|
|
8
|
-
"nbg1",
|
|
9
|
-
"hel1",
|
|
10
|
-
"ash",
|
|
11
|
-
"hil",
|
|
12
|
-
] as const;
|
|
13
|
-
export type HetznerLocation = (typeof HETZNER_LOCATIONS)[number];
|
|
14
|
-
|
|
15
|
-
export const HETZNER_SERVER_TYPES = [
|
|
16
|
-
"cx11",
|
|
17
|
-
"cx21",
|
|
18
|
-
"cx31",
|
|
19
|
-
"cx41",
|
|
20
|
-
"cx51",
|
|
21
|
-
"cax11",
|
|
22
|
-
"cax21",
|
|
23
|
-
"cax31",
|
|
24
|
-
"cax41",
|
|
25
|
-
] as const;
|
|
26
|
-
export type HetznerServerType = (typeof HETZNER_SERVER_TYPES)[number];
|
|
27
|
-
|
|
28
1
|
const HCLOUD_API_BASE = "https://api.hetzner.cloud/v1";
|
|
29
2
|
|
|
30
3
|
const getToken = (token?: string): string => {
|
|
@@ -41,34 +14,6 @@ const getToken = (token?: string): string => {
|
|
|
41
14
|
return resolved;
|
|
42
15
|
};
|
|
43
16
|
|
|
44
|
-
const setupUserData = (
|
|
45
|
-
email: string,
|
|
46
|
-
grantAccess: PeerId[] = [],
|
|
47
|
-
serverVersion?: string,
|
|
48
|
-
) => {
|
|
49
|
-
const peerIdStrings = grantAccess.map((x) => x.toString());
|
|
50
|
-
const grantArgs = peerIdStrings.map((key) => `--ga ${key}`).join(" ");
|
|
51
|
-
const versionSpec = serverVersion ? `@${serverVersion}` : "";
|
|
52
|
-
|
|
53
|
-
// better-sqlite3 forces users to install build-essentials for `make` command
|
|
54
|
-
return `#!/bin/bash
|
|
55
|
-
set -e
|
|
56
|
-
cd /root
|
|
57
|
-
curl -fsSL https://deb.nodesource.com/setup_22.x | bash - &&\
|
|
58
|
-
apt-get install -y nodejs
|
|
59
|
-
apt-get install -y build-essential
|
|
60
|
-
npm install -g @peerbit/server${versionSpec}
|
|
61
|
-
peerbit domain test --email ${email}
|
|
62
|
-
peerbit start ${grantArgs} > log.txt 2>&1 &
|
|
63
|
-
`;
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
type HcloudServer = {
|
|
67
|
-
id: number;
|
|
68
|
-
name: string;
|
|
69
|
-
public_net?: { ipv4?: { ip?: string } };
|
|
70
|
-
};
|
|
71
|
-
|
|
72
17
|
const createHcloudClient = async (token: string) => {
|
|
73
18
|
const { default: axios } = await import("axios");
|
|
74
19
|
return axios.create({
|
|
@@ -92,135 +37,10 @@ const parseAxiosError = (error: any): string => {
|
|
|
92
37
|
return `${message} (HTTP ${status})${details ? `: ${details}` : ""}`;
|
|
93
38
|
};
|
|
94
39
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
servers: HcloudServer[],
|
|
100
|
-
prefix: string,
|
|
101
|
-
): number => {
|
|
102
|
-
const pattern = new RegExp(`^${escapeRegExp(prefix)}-(\\d+)$`);
|
|
103
|
-
let max = 0;
|
|
104
|
-
for (const server of servers) {
|
|
105
|
-
const match = server.name.match(pattern);
|
|
106
|
-
if (!match) continue;
|
|
107
|
-
const n = Number(match[1]);
|
|
108
|
-
if (Number.isFinite(n)) {
|
|
109
|
-
max = Math.max(max, n);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return max;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
const waitForServerPublicIp = async (
|
|
116
|
-
client: Awaited<ReturnType<typeof createHcloudClient>>,
|
|
117
|
-
serverId: number,
|
|
118
|
-
timeoutMs = 3 * 60 * 1000,
|
|
119
|
-
pollIntervalMs = 5000,
|
|
120
|
-
): Promise<string> => {
|
|
121
|
-
const start = Date.now();
|
|
122
|
-
while (Date.now() - start < timeoutMs) {
|
|
123
|
-
try {
|
|
124
|
-
const info = await client.get(`/servers/${serverId}`);
|
|
125
|
-
const server: HcloudServer | undefined = info.data?.server;
|
|
126
|
-
const ip = server?.public_net?.ipv4?.ip;
|
|
127
|
-
if (ip) {
|
|
128
|
-
return ip;
|
|
129
|
-
}
|
|
130
|
-
} catch (error: any) {
|
|
131
|
-
if (error?.response?.status !== 404 && error?.response?.status !== 429) {
|
|
132
|
-
throw new Error(
|
|
133
|
-
`Failed while waiting for Hetzner server ${serverId} IP: ${parseAxiosError(
|
|
134
|
-
error,
|
|
135
|
-
)}`,
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
await delay(pollIntervalMs);
|
|
140
|
-
}
|
|
141
|
-
throw new Error(
|
|
142
|
-
`Timed out waiting for Hetzner server ${serverId} to get a public IPv4`,
|
|
143
|
-
);
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
export const launchNodes = async (properties: {
|
|
147
|
-
token?: string;
|
|
148
|
-
location?: string;
|
|
149
|
-
email: string;
|
|
150
|
-
count?: number;
|
|
151
|
-
serverType?: string;
|
|
152
|
-
namePrefix?: string;
|
|
153
|
-
grantAccess?: PeerId[];
|
|
154
|
-
serverVersion?: string;
|
|
155
|
-
image?: string;
|
|
156
|
-
}): Promise<
|
|
157
|
-
{ serverId: number; publicIp: string; name: string; location: string }[]
|
|
158
|
-
> => {
|
|
159
|
-
if (properties.count && properties.count > 10) {
|
|
160
|
-
throw new Error(
|
|
161
|
-
"Unexpected node launch count: " +
|
|
162
|
-
properties.count +
|
|
163
|
-
". To prevent unwanted behaviour you can also launch 10 nodes at once",
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
const count = properties.count || 1;
|
|
167
|
-
|
|
168
|
-
const token = getToken(properties.token);
|
|
169
|
-
const client = await createHcloudClient(token);
|
|
170
|
-
|
|
171
|
-
const location = properties.location || "fsn1";
|
|
172
|
-
const serverType = properties.serverType || "cx11";
|
|
173
|
-
const image = properties.image || "ubuntu-22.04";
|
|
174
|
-
const namePrefix = properties.namePrefix || "peerbit-node";
|
|
175
|
-
|
|
176
|
-
const existingServers = (await client.get("/servers")).data?.servers as
|
|
177
|
-
| HcloudServer[]
|
|
178
|
-
| undefined;
|
|
179
|
-
const existingCounter = getHighestNameCounter(
|
|
180
|
-
existingServers || [],
|
|
181
|
-
namePrefix,
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
const created: Array<{ serverId: number; name: string }> = [];
|
|
185
|
-
for (let ix = 1; ix <= count; ix++) {
|
|
186
|
-
const name = `${namePrefix}-${existingCounter + ix}`;
|
|
187
|
-
try {
|
|
188
|
-
const resp = await client.post("/servers", {
|
|
189
|
-
name,
|
|
190
|
-
server_type: serverType,
|
|
191
|
-
image,
|
|
192
|
-
location,
|
|
193
|
-
user_data: setupUserData(
|
|
194
|
-
properties.email,
|
|
195
|
-
properties.grantAccess,
|
|
196
|
-
properties.serverVersion,
|
|
197
|
-
),
|
|
198
|
-
});
|
|
199
|
-
const serverId: number | undefined = resp.data?.server?.id;
|
|
200
|
-
if (!serverId) {
|
|
201
|
-
throw new Error("Missing server id in Hetzner response");
|
|
202
|
-
}
|
|
203
|
-
created.push({ serverId, name });
|
|
204
|
-
} catch (error: any) {
|
|
205
|
-
throw new Error(
|
|
206
|
-
`Failed to create Hetzner server '${name}': ${parseAxiosError(error)}`,
|
|
207
|
-
);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
const nodes: Array<{
|
|
212
|
-
serverId: number;
|
|
213
|
-
publicIp: string;
|
|
214
|
-
name: string;
|
|
215
|
-
location: string;
|
|
216
|
-
}> = [];
|
|
217
|
-
for (const { serverId, name } of created) {
|
|
218
|
-
const publicIp = await waitForServerPublicIp(client, serverId);
|
|
219
|
-
nodes.push({ serverId, publicIp, name, location });
|
|
220
|
-
}
|
|
221
|
-
return nodes;
|
|
222
|
-
};
|
|
223
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Retained so users can clean up Hetzner servers recorded by older releases.
|
|
42
|
+
* Creating new provider-managed servers is no longer supported.
|
|
43
|
+
*/
|
|
224
44
|
export const terminateNode = async (properties: {
|
|
225
45
|
token?: string;
|
|
226
46
|
serverId: number | string;
|
package/src/nginx-template.conf
CHANGED
|
@@ -35,6 +35,14 @@ server {
|
|
|
35
35
|
root /usr/share/nginx/html;
|
|
36
36
|
index index.html index.htm;
|
|
37
37
|
|
|
38
|
+
# Each staged configuration writes an unpredictable file here. The CLI
|
|
39
|
+
# requires the exact value over HTTPS before activating that generation.
|
|
40
|
+
location ^~ /.well-known/peerbit-generation/ {
|
|
41
|
+
default_type text/plain;
|
|
42
|
+
add_header Cache-Control "no-store" always;
|
|
43
|
+
try_files $uri =404;
|
|
44
|
+
}
|
|
45
|
+
|
|
38
46
|
location / {
|
|
39
47
|
try_files $uri $uri/ =404;
|
|
40
48
|
}
|
|
@@ -82,8 +90,18 @@ server {
|
|
|
82
90
|
default_type text/plain;
|
|
83
91
|
}
|
|
84
92
|
|
|
93
|
+
# Managed DNS leases prove continued control through a short-lived local
|
|
94
|
+
# challenge server. Keep the helper bound to loopback; only NGINX exposes
|
|
95
|
+
# this exact path on public port 80.
|
|
96
|
+
location ^~ /.well-known/peerbit-dns/ {
|
|
97
|
+
proxy_pass http://127.0.0.1:8093;
|
|
98
|
+
proxy_http_version 1.1;
|
|
99
|
+
proxy_buffering off;
|
|
100
|
+
proxy_set_header Host $host;
|
|
101
|
+
}
|
|
102
|
+
|
|
85
103
|
# Everything else: redirect to HTTPS
|
|
86
104
|
location / {
|
|
87
105
|
return 301 https://$host$request_uri;
|
|
88
106
|
}
|
|
89
|
-
}
|
|
107
|
+
}
|
package/src/remotes.browser.ts
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
export const getRetiredAWSManagementError = (origin: {
|
|
2
|
+
instanceId: string;
|
|
3
|
+
region: string;
|
|
4
|
+
}): Error =>
|
|
5
|
+
new Error(
|
|
6
|
+
`Automatic AWS management has been retired. Terminate EC2 instance ${origin.instanceId} in region ${origin.region} from the AWS console, then remove the local remote entry.`,
|
|
7
|
+
);
|
package/src/remotes.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
2
|
|
|
3
|
-
interface AWSOrigin {
|
|
3
|
+
export interface AWSOrigin {
|
|
4
4
|
type: "aws";
|
|
5
5
|
region: string;
|
|
6
6
|
instanceId: string;
|
|
@@ -14,6 +14,11 @@ interface HetznerOrigin {
|
|
|
14
14
|
|
|
15
15
|
export type RemoteOrigin = AWSOrigin | HetznerOrigin;
|
|
16
16
|
|
|
17
|
+
export const getRetiredAWSManagementError = (origin: AWSOrigin): Error =>
|
|
18
|
+
new Error(
|
|
19
|
+
`Automatic AWS management has been retired. Terminate EC2 instance ${origin.instanceId} in region ${origin.region} from the AWS console, then remove the local remote entry.`,
|
|
20
|
+
);
|
|
21
|
+
|
|
17
22
|
export const DEFAULT_REMOTE_GROUP = "default";
|
|
18
23
|
|
|
19
24
|
export interface RemoteObject {
|
package/src/server.ts
CHANGED
|
@@ -228,6 +228,9 @@ export const startServerWithNode = async (properties: {
|
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
const trust = new Trust(getTrustPath(properties.directory));
|
|
231
|
+
for (const id of trustPeerIds) {
|
|
232
|
+
trust.add(getPublicKeyFromPeerId(id).hashcode());
|
|
233
|
+
}
|
|
231
234
|
const server = await startApiServer(peer, {
|
|
232
235
|
port: properties.ports?.api,
|
|
233
236
|
trust,
|
|
@@ -278,11 +281,6 @@ export const startServerWithNode = async (properties: {
|
|
|
278
281
|
};
|
|
279
282
|
await shutDownHook(peer, server);
|
|
280
283
|
|
|
281
|
-
if (trustPeerIds.length > 0) {
|
|
282
|
-
for (const id of trustPeerIds) {
|
|
283
|
-
trust.add(getPublicKeyFromPeerId(id).hashcode());
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
284
|
return { server, node: peer };
|
|
287
285
|
};
|
|
288
286
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aws.browser.d.ts","sourceRoot":"","sources":["../../src/aws.browser.ts"],"names":[],"mappings":""}
|
package/dist/src/aws.browser.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aws.browser.js","sourceRoot":"","sources":["../../src/aws.browser.ts"],"names":[],"mappings":";AAAA,cAAc"}
|
package/dist/src/aws.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { type PeerId } from "@libp2p/interface";
|
|
2
|
-
export declare const createRecord: (options: {
|
|
3
|
-
domain: string;
|
|
4
|
-
region?: string;
|
|
5
|
-
hostedZoneId: string;
|
|
6
|
-
credentials?: {
|
|
7
|
-
accessKeyId: string;
|
|
8
|
-
secretAccessKey: string;
|
|
9
|
-
};
|
|
10
|
-
}) => Promise<void>;
|
|
11
|
-
export declare const AWS_LINUX_ARM_AMIs: Record<string, string>;
|
|
12
|
-
export declare const launchNodes: (properties: {
|
|
13
|
-
region?: string;
|
|
14
|
-
email: string;
|
|
15
|
-
count?: number;
|
|
16
|
-
size?: "micro" | "small" | "medium" | "large" | "xlarge" | "2xlarge";
|
|
17
|
-
namePrefix?: string;
|
|
18
|
-
grantAccess?: PeerId[];
|
|
19
|
-
serverVersion?: string;
|
|
20
|
-
}) => Promise<{
|
|
21
|
-
instanceId: string;
|
|
22
|
-
publicIp: string;
|
|
23
|
-
name: string;
|
|
24
|
-
region: string;
|
|
25
|
-
}[]>;
|
|
26
|
-
export declare const terminateNode: (properties: {
|
|
27
|
-
instanceId: string;
|
|
28
|
-
region?: string;
|
|
29
|
-
}) => Promise<void>;
|
|
30
|
-
//# sourceMappingURL=aws.d.ts.map
|
package/dist/src/aws.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aws.d.ts","sourceRoot":"","sources":["../../src/aws.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,eAAO,MAAM,YAAY,GAAU,SAAS;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D,KAAG,OAAO,CAAC,IAAI,CAyCf,CAAC;AA0BF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgCrD,CAAC;AACF,eAAO,MAAM,WAAW,GAAU,YAAY;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,KAAG,OAAO,CACV;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,CAkMxE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,YAAY;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,kBAQA,CAAC"}
|
package/dist/src/aws.js
DELETED
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
/* eslint-disable @typescript-eslint/naming-convention */
|
|
3
|
-
import {} from "@libp2p/interface";
|
|
4
|
-
import { delay } from "@peerbit/time";
|
|
5
|
-
export const createRecord = async (options) => {
|
|
6
|
-
const { Route53Client, ChangeResourceRecordSetsCommand } = await import("@aws-sdk/client-route-53");
|
|
7
|
-
const { isIPv4, isIPv6 } = await import("net");
|
|
8
|
-
const { getMyIp } = await import("./domain.js");
|
|
9
|
-
const myIp = await getMyIp();
|
|
10
|
-
const v4 = isIPv4(myIp);
|
|
11
|
-
const v6 = isIPv6(myIp);
|
|
12
|
-
if (!v6 && !v4) {
|
|
13
|
-
throw new Error("Unknown ip type");
|
|
14
|
-
}
|
|
15
|
-
// TODO, make sure it works for ipv6 addresses with leading and trailing colon
|
|
16
|
-
const client = new Route53Client({
|
|
17
|
-
region: options.region,
|
|
18
|
-
credentials: options.credentials
|
|
19
|
-
? {
|
|
20
|
-
accessKeyId: options.credentials.accessKeyId,
|
|
21
|
-
secretAccessKey: options.credentials.secretAccessKey,
|
|
22
|
-
}
|
|
23
|
-
: undefined,
|
|
24
|
-
});
|
|
25
|
-
const cmd = new ChangeResourceRecordSetsCommand({
|
|
26
|
-
ChangeBatch: {
|
|
27
|
-
Changes: [
|
|
28
|
-
{
|
|
29
|
-
Action: "CREATE",
|
|
30
|
-
ResourceRecordSet: {
|
|
31
|
-
Name: options.domain,
|
|
32
|
-
Type: v4 ? "A" : "AAAA",
|
|
33
|
-
TTL: 60,
|
|
34
|
-
ResourceRecords: [{ Value: myIp }],
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
},
|
|
39
|
-
HostedZoneId: options.hostedZoneId,
|
|
40
|
-
});
|
|
41
|
-
await client.send(cmd);
|
|
42
|
-
};
|
|
43
|
-
const setupUserData = (email, grantAccess = [], serverVersion) => {
|
|
44
|
-
const peerIdStrings = grantAccess.map((x) => x.toString());
|
|
45
|
-
const grantArgs = peerIdStrings.map((key) => `--ga ${key}`).join(" ");
|
|
46
|
-
// better-sqlite3 force use to install build-essentials for `make` command, TOOD dont bundle better-sqlite3 by default?
|
|
47
|
-
const versionSpec = serverVersion ? `@${serverVersion}` : "";
|
|
48
|
-
return `#!/bin/bash
|
|
49
|
-
cd /home/ubuntu
|
|
50
|
-
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - &&\
|
|
51
|
-
sudo apt-get install -y nodejs
|
|
52
|
-
sudo apt-get install -y build-essential
|
|
53
|
-
npm install -g @peerbit/server${versionSpec}
|
|
54
|
-
sudo peerbit domain test --email ${email}
|
|
55
|
-
peerbit start ${grantArgs} > log.txt 2>&1 &
|
|
56
|
-
`;
|
|
57
|
-
};
|
|
58
|
-
const PURPOSE_TAG_NAME = "Purpose";
|
|
59
|
-
const PURPOSE_TAG_VALUE = "Peerbit";
|
|
60
|
-
// Ubuntu Server 20.04 LTS (HVM), SSD Volume Type (64-bit (Arm))
|
|
61
|
-
export const AWS_LINUX_ARM_AMIs = {
|
|
62
|
-
/* "af-south-1" */
|
|
63
|
-
"ap-northeast-1": "ami-01444f83954203c6f",
|
|
64
|
-
"ap-northeast-2": "ami-0ac62099928d25fec",
|
|
65
|
-
"ap-northeast-3": "ami-0efdceaebc778c5f3",
|
|
66
|
-
"ap-south-1": "ami-0df6182e39efe7c4d",
|
|
67
|
-
"ap-southeast-1": "ami-01d87e25d3c65ec37",
|
|
68
|
-
"ap-southeast-2": "ami-0641fc20c25fdd380",
|
|
69
|
-
/* "ap-south-2", */
|
|
70
|
-
/* "ap-southeast-3",
|
|
71
|
-
"ap-southeast-4", */
|
|
72
|
-
"ca-central-1": "ami-0a3e942fe4813672b",
|
|
73
|
-
/* "cn-north-1",
|
|
74
|
-
"cn-northwest-1", */
|
|
75
|
-
"eu-central-1": "ami-0d85ad3aa712d96af",
|
|
76
|
-
/* "eu-central-2", */
|
|
77
|
-
"eu-north-1": "ami-0ff124a3d7381bfec",
|
|
78
|
-
/* "eu-south-1",
|
|
79
|
-
"eu-south-2", */
|
|
80
|
-
"eu-west-1": "ami-09c59b011574e4c96",
|
|
81
|
-
"eu-west-2": "ami-03e26d11b665ac7be",
|
|
82
|
-
"eu-west-3": "ami-00771c0ac817397bd",
|
|
83
|
-
/* "il-central-1",
|
|
84
|
-
"me-central-1",
|
|
85
|
-
"me-south-1", */
|
|
86
|
-
"sa-east-1": "ami-08dc4b989f93eafb9",
|
|
87
|
-
"us-east-1": "ami-097d5b19d4f1a7d1b",
|
|
88
|
-
"us-east-2": "ami-0071e4b30f26879e2",
|
|
89
|
-
/* "us-gov-east-1",
|
|
90
|
-
"us-gov-west-1", */
|
|
91
|
-
"us-west-1": "ami-0dca369228f3b2ce7",
|
|
92
|
-
"us-west-2": "ami-0c79a55dda52434da",
|
|
93
|
-
};
|
|
94
|
-
export const launchNodes = async (properties) => {
|
|
95
|
-
if (properties.count && properties.count > 10) {
|
|
96
|
-
throw new Error("Unexpected node launch count: " +
|
|
97
|
-
properties.count +
|
|
98
|
-
". To prevent unwanted behaviour you can also launch 10 nodes at once");
|
|
99
|
-
}
|
|
100
|
-
const count = properties.count || 1;
|
|
101
|
-
const { EC2Client, CreateTagsCommand, RunInstancesCommand, DescribeSecurityGroupsCommand, CreateSecurityGroupCommand, AuthorizeSecurityGroupIngressCommand, DescribeInstancesCommand, } = await import("@aws-sdk/client-ec2");
|
|
102
|
-
const client = new EC2Client({ region: properties.region });
|
|
103
|
-
const regionString = await client.config.region();
|
|
104
|
-
let securityGroupOut = (await client.send(new DescribeSecurityGroupsCommand({
|
|
105
|
-
Filters: [
|
|
106
|
-
{ Name: "tag:" + PURPOSE_TAG_NAME, Values: [PURPOSE_TAG_VALUE] },
|
|
107
|
-
],
|
|
108
|
-
})))?.SecurityGroups?.[0];
|
|
109
|
-
if (!securityGroupOut) {
|
|
110
|
-
securityGroupOut = await client.send(new CreateSecurityGroupCommand({
|
|
111
|
-
GroupName: "peerbit-node",
|
|
112
|
-
Description: "Security group for running Peerbit nodes",
|
|
113
|
-
}));
|
|
114
|
-
await client.send(new CreateTagsCommand({
|
|
115
|
-
Resources: [securityGroupOut.GroupId],
|
|
116
|
-
Tags: [{ Key: PURPOSE_TAG_NAME, Value: PURPOSE_TAG_VALUE }],
|
|
117
|
-
}));
|
|
118
|
-
await client.send(new AuthorizeSecurityGroupIngressCommand({
|
|
119
|
-
GroupId: securityGroupOut.GroupId,
|
|
120
|
-
IpPermissions: [
|
|
121
|
-
{
|
|
122
|
-
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
123
|
-
IpProtocol: "tcp",
|
|
124
|
-
FromPort: 80,
|
|
125
|
-
ToPort: 80,
|
|
126
|
-
}, // Frontend
|
|
127
|
-
{
|
|
128
|
-
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
129
|
-
IpProtocol: "tcp",
|
|
130
|
-
FromPort: 443,
|
|
131
|
-
ToPort: 443,
|
|
132
|
-
}, // Frontend SSL
|
|
133
|
-
{
|
|
134
|
-
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
135
|
-
IpProtocol: "tcp",
|
|
136
|
-
FromPort: 9002,
|
|
137
|
-
ToPort: 9002,
|
|
138
|
-
}, // HTTPS api
|
|
139
|
-
{
|
|
140
|
-
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
141
|
-
IpProtocol: "tcp",
|
|
142
|
-
FromPort: 8082,
|
|
143
|
-
ToPort: 8082,
|
|
144
|
-
}, // HTTP api
|
|
145
|
-
{
|
|
146
|
-
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
147
|
-
IpProtocol: "tcp",
|
|
148
|
-
FromPort: 4002,
|
|
149
|
-
ToPort: 4005,
|
|
150
|
-
}, // libp2p
|
|
151
|
-
{
|
|
152
|
-
IpRanges: [{ CidrIp: "0.0.0.0/0" }],
|
|
153
|
-
IpProtocol: "tcp",
|
|
154
|
-
FromPort: 22,
|
|
155
|
-
ToPort: 22,
|
|
156
|
-
}, // SSH
|
|
157
|
-
],
|
|
158
|
-
}));
|
|
159
|
-
}
|
|
160
|
-
const instanceTag = "Peerbit" + (properties.namePrefix ? "-" + properties.namePrefix : "");
|
|
161
|
-
let existingCounter = (await client.send(new DescribeInstancesCommand({
|
|
162
|
-
Filters: [{ Name: "tag:Purpose", Values: [instanceTag] }],
|
|
163
|
-
}))).Reservations?.length || 0;
|
|
164
|
-
console.log("Region: " + regionString);
|
|
165
|
-
const instanceOut = await client.send(new RunInstancesCommand({
|
|
166
|
-
ImageId: AWS_LINUX_ARM_AMIs[regionString],
|
|
167
|
-
SecurityGroupIds: [securityGroupOut.GroupId],
|
|
168
|
-
InstanceType: ("t4g." + (properties.size || "micro")), // TODO types
|
|
169
|
-
UserData: Buffer.from(setupUserData(properties.email, properties.grantAccess, properties.serverVersion)).toString("base64"),
|
|
170
|
-
MinCount: count,
|
|
171
|
-
MaxCount: count,
|
|
172
|
-
// InstanceInitiatedShutdownBehavior: 'terminate' // to enable termination when node shutting itself down
|
|
173
|
-
}));
|
|
174
|
-
if (!instanceOut.Instances || instanceOut.Instances.length === 0) {
|
|
175
|
-
throw new Error("Failed to create instance");
|
|
176
|
-
}
|
|
177
|
-
const names = [];
|
|
178
|
-
for (const instance of instanceOut.Instances) {
|
|
179
|
-
existingCounter++;
|
|
180
|
-
const name = (properties.namePrefix ? properties.namePrefix : "peerbit-node") +
|
|
181
|
-
"-" +
|
|
182
|
-
existingCounter;
|
|
183
|
-
names.push(name);
|
|
184
|
-
await client.send(new CreateTagsCommand({
|
|
185
|
-
Resources: [instance.InstanceId],
|
|
186
|
-
Tags: [
|
|
187
|
-
{ Key: "Name", Value: name },
|
|
188
|
-
{ Key: "Purpose", Value: instanceTag },
|
|
189
|
-
],
|
|
190
|
-
}));
|
|
191
|
-
}
|
|
192
|
-
// wait for AWS to recognize the new instance IDs and for public IPs to be assigned
|
|
193
|
-
const instanceIds = instanceOut.Instances.map((x) => x.InstanceId);
|
|
194
|
-
const timeoutMs = 3 * 60 * 1000; // 3 minutes
|
|
195
|
-
const pollIntervalMs = 5000;
|
|
196
|
-
const start = Date.now();
|
|
197
|
-
let foundInstances = [];
|
|
198
|
-
while (Date.now() - start < timeoutMs) {
|
|
199
|
-
try {
|
|
200
|
-
const info = await client.send(new DescribeInstancesCommand({ InstanceIds: instanceIds }));
|
|
201
|
-
foundInstances =
|
|
202
|
-
info.Reservations?.flatMap((r) => r.Instances || []) || [];
|
|
203
|
-
const allPresent = foundInstances.length >= instanceIds.length;
|
|
204
|
-
const ips = new Map(foundInstances
|
|
205
|
-
.filter((i) => i.InstanceId && i.PublicIpAddress)
|
|
206
|
-
.map((i) => [i.InstanceId, i.PublicIpAddress]));
|
|
207
|
-
const allHaveIp = instanceIds.every((id) => ips.has(id));
|
|
208
|
-
if (allPresent && allHaveIp) {
|
|
209
|
-
// reorder to original order
|
|
210
|
-
let publicIps = instanceIds.map((id) => ips.get(id));
|
|
211
|
-
if (publicIps.length > 0) {
|
|
212
|
-
// success
|
|
213
|
-
return publicIps.map((v, ix) => {
|
|
214
|
-
return {
|
|
215
|
-
instanceId: instanceOut.Instances[ix].InstanceId,
|
|
216
|
-
publicIp: v,
|
|
217
|
-
name: names[ix],
|
|
218
|
-
region: regionString,
|
|
219
|
-
};
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
catch (e) {
|
|
225
|
-
// AWS eventual consistency: sometimes returns InvalidInstanceID.NotFound immediately after RunInstances
|
|
226
|
-
const code = e?.Code || e?.name || e?.code;
|
|
227
|
-
if (code !== "InvalidInstanceID.NotFound") {
|
|
228
|
-
throw e;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
await delay(pollIntervalMs);
|
|
232
|
-
}
|
|
233
|
-
throw new Error("Timed out waiting for instances to be describe-able with public IPs");
|
|
234
|
-
};
|
|
235
|
-
export const terminateNode = async (properties) => {
|
|
236
|
-
const { EC2Client, TerminateInstancesCommand } = await import("@aws-sdk/client-ec2");
|
|
237
|
-
const client = new EC2Client({ region: properties.region });
|
|
238
|
-
await client.send(new TerminateInstancesCommand({ InstanceIds: [properties.instanceId] }));
|
|
239
|
-
};
|
|
240
|
-
//# sourceMappingURL=aws.js.map
|
package/dist/src/aws.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aws.js","sourceRoot":"","sources":["../../src/aws.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launch.spec.d.ts","sourceRoot":"","sources":["../../test/launch.spec.ts"],"names":[],"mappings":""}
|
package/dist/test/launch.spec.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
describe("spawn", () => {
|
|
2
|
-
it("no-test", () => { });
|
|
3
|
-
/* it("launch and stop", async () => {
|
|
4
|
-
const results = await launchNodes({
|
|
5
|
-
email: "marcus@dao.xyz",
|
|
6
|
-
count: 1,
|
|
7
|
-
namePrefix: "test-counter",
|
|
8
|
-
grantAccess: [await (await Ed25519Keypair.create()).publicKey.toPeerId()]
|
|
9
|
-
});
|
|
10
|
-
const domain = await waitForDomain(results[0].publicIp);
|
|
11
|
-
const client = await createClient(await Ed25519Keypair.create(), {
|
|
12
|
-
address: domain,
|
|
13
|
-
origin: {
|
|
14
|
-
type: "aws",
|
|
15
|
-
instanceId: results[0].instanceId,
|
|
16
|
-
region: "us-east-1",
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
await client.terminate();
|
|
20
|
-
}); */
|
|
21
|
-
});
|
|
22
|
-
export {};
|
|
23
|
-
//# sourceMappingURL=launch.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launch.spec.js","sourceRoot":"","sources":["../../test/launch.spec.ts"],"names":[],"mappings":"AAAA,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxB;;;;;;;;;;;;;;;;;UAiBM;AACP,CAAC,CAAC,CAAC"}
|