@abtnode/core 1.16.44-beta-20250528-003415-7a5e5d90 → 1.16.44-beta-20250529-223630-10e16ac8
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/lib/blocklet/manager/disk.js +5 -0
- package/lib/blocklet/migration-dist/migration.cjs +2 -1
- package/lib/event/index.js +18 -0
- package/lib/index.js +5 -0
- package/lib/router/helper.js +37 -0
- package/lib/router/index.js +9 -1
- package/lib/router/manager.js +3 -0
- package/lib/states/audit-log.js +4 -0
- package/lib/states/blocklet-extras.js +4 -0
- package/lib/states/node.js +3 -1
- package/lib/states/oauth-client.js +4 -2
- package/lib/util/blocklet.js +9 -2
- package/lib/util/docker/docker-container-prune.js +0 -22
- package/lib/util/docker/docker-network.js +27 -29
- package/lib/util/docker/parse-docker-options-from-pm2.js +3 -0
- package/package.json +24 -24
|
@@ -238,6 +238,8 @@ const { transformNotification } = require('../../util/notification');
|
|
|
238
238
|
const { generateUserUpdateData } = require('../../util/user');
|
|
239
239
|
const { blockletThemeSchema } = require('../../validators/theme');
|
|
240
240
|
const checkDNS = require('../../util/check-dns.js');
|
|
241
|
+
const { removeDockerNetwork } = require('../../util/docker/docker-network.js');
|
|
242
|
+
const parseDockerName = require('../../util/docker/parse-docker-name.js');
|
|
241
243
|
|
|
242
244
|
const { formatEnvironments, getBlockletMeta, validateOwner, isCLI } = util;
|
|
243
245
|
|
|
@@ -1275,11 +1277,13 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1275
1277
|
entityId: doc.meta.did,
|
|
1276
1278
|
severity: 'success',
|
|
1277
1279
|
});
|
|
1280
|
+
await removeDockerNetwork(parseDockerName(did, 'docker-network'));
|
|
1278
1281
|
return doc;
|
|
1279
1282
|
} catch (error) {
|
|
1280
1283
|
// If we installed a corrupted blocklet accidentally, just cleanup the disk and state db
|
|
1281
1284
|
logger.error('blocklet delete failed, will delete again', { did, error });
|
|
1282
1285
|
const doc = await this._deleteBlocklet({ did, keepData, keepLogsDir, keepConfigs }, context);
|
|
1286
|
+
await removeDockerNetwork(parseDockerName(did, 'docker-network'));
|
|
1283
1287
|
|
|
1284
1288
|
this._createNotification(doc.meta.did, {
|
|
1285
1289
|
title: 'Blocklet Deleted',
|
|
@@ -1466,6 +1470,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
1466
1470
|
// support edge case
|
|
1467
1471
|
if (newBlocklet.children.length === 0) {
|
|
1468
1472
|
await states.blocklet.setBlockletStatus(newBlocklet.meta.did, BlockletStatus.stopped);
|
|
1473
|
+
await removeDockerNetwork(parseDockerName(app.meta.did, 'docker-network'));
|
|
1469
1474
|
}
|
|
1470
1475
|
|
|
1471
1476
|
this.emit(BlockletEvents.upgraded, { blocklet: newBlocklet, context: { ...context, createAuditLog: false } }); // trigger router refresh
|
|
@@ -286,6 +286,7 @@ const EVENTS = {
|
|
|
286
286
|
CERT_ERROR: 'cert.error',
|
|
287
287
|
RELOAD_GATEWAY: 'gateway.reload',
|
|
288
288
|
NOTIFICATION_CREATE_QUEUED: 'notification.create.queued',
|
|
289
|
+
UPDATE_DOMAIN_ALIAS: 'router.domain.alias.updated',
|
|
289
290
|
};
|
|
290
291
|
|
|
291
292
|
const WHO_CAN_ACCESS = Object.freeze({
|
|
@@ -38884,7 +38885,7 @@ module.exports = require("zlib");
|
|
|
38884
38885
|
/***/ ((module) => {
|
|
38885
38886
|
|
|
38886
38887
|
"use strict";
|
|
38887
|
-
module.exports = /*#__PURE__*/JSON.parse('{"name":"@abtnode/core","publishConfig":{"access":"public"},"version":"1.16.43","description":"","main":"lib/index.js","files":["lib"],"scripts":{"lint":"eslint tests lib --ignore-pattern \'tests/assets/*\'","lint:fix":"eslint --fix tests lib","test":"node tools/jest.js","coverage":"npm run test -- --coverage"},"keywords":[],"author":"wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)","license":"Apache-2.0","dependencies":{"@abtnode/analytics":"1.16.43","@abtnode/auth":"1.16.43","@abtnode/certificate-manager":"1.16.43","@abtnode/client":"1.16.43","@abtnode/constant":"1.16.43","@abtnode/cron":"1.16.43","@abtnode/docker-utils":"1.16.43","@abtnode/logger":"1.16.43","@abtnode/models":"1.16.43","@abtnode/queue":"1.16.43","@abtnode/rbac":"1.16.43","@abtnode/router-provider":"1.16.43","@abtnode/static-server":"1.16.43","@abtnode/timemachine":"1.16.43","@abtnode/util":"1.16.43","@arcblock/did":"1.20.11","@arcblock/did-auth":"1.20.11","@arcblock/did-ext":"1.20.11","@arcblock/did-motif":"^1.1.13","@arcblock/did-util":"1.20.11","@arcblock/event-hub":"1.20.11","@arcblock/jwt":"1.20.11","@arcblock/pm2-events":"^0.0.5","@arcblock/validator":"1.20.11","@arcblock/vc":"1.20.11","@blocklet/constant":"1.16.43","@blocklet/did-space-js":"^1.0.56","@blocklet/env":"1.16.43","@blocklet/error":"^0.2.4","@blocklet/meta":"1.16.43","@blocklet/resolver":"1.16.43","@blocklet/sdk":"1.16.43","@blocklet/store":"1.16.43","@blocklet/theme":"^2.13.
|
|
38888
|
+
module.exports = /*#__PURE__*/JSON.parse('{"name":"@abtnode/core","publishConfig":{"access":"public"},"version":"1.16.43","description":"","main":"lib/index.js","files":["lib"],"scripts":{"lint":"eslint tests lib --ignore-pattern \'tests/assets/*\'","lint:fix":"eslint --fix tests lib","test":"node tools/jest.js","coverage":"npm run test -- --coverage"},"keywords":[],"author":"wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)","license":"Apache-2.0","dependencies":{"@abtnode/analytics":"1.16.43","@abtnode/auth":"1.16.43","@abtnode/certificate-manager":"1.16.43","@abtnode/client":"1.16.43","@abtnode/constant":"1.16.43","@abtnode/cron":"1.16.43","@abtnode/docker-utils":"1.16.43","@abtnode/logger":"1.16.43","@abtnode/models":"1.16.43","@abtnode/queue":"1.16.43","@abtnode/rbac":"1.16.43","@abtnode/router-provider":"1.16.43","@abtnode/static-server":"1.16.43","@abtnode/timemachine":"1.16.43","@abtnode/util":"1.16.43","@arcblock/did":"1.20.11","@arcblock/did-auth":"1.20.11","@arcblock/did-ext":"1.20.11","@arcblock/did-motif":"^1.1.13","@arcblock/did-util":"1.20.11","@arcblock/event-hub":"1.20.11","@arcblock/jwt":"1.20.11","@arcblock/pm2-events":"^0.0.5","@arcblock/validator":"1.20.11","@arcblock/vc":"1.20.11","@blocklet/constant":"1.16.43","@blocklet/did-space-js":"^1.0.56","@blocklet/env":"1.16.43","@blocklet/error":"^0.2.4","@blocklet/meta":"1.16.43","@blocklet/resolver":"1.16.43","@blocklet/sdk":"1.16.43","@blocklet/store":"1.16.43","@blocklet/theme":"^2.13.55","@fidm/x509":"^1.2.1","@ocap/mcrypto":"1.20.11","@ocap/util":"1.20.11","@ocap/wallet":"1.20.11","@slack/webhook":"^5.0.4","archiver":"^7.0.1","axios":"^1.7.9","axon":"^2.0.3","chalk":"^4.1.2","cross-spawn":"^7.0.3","dayjs":"^1.11.13","deep-diff":"^1.0.2","detect-port":"^1.5.1","envfile":"^7.1.0","escape-string-regexp":"^4.0.0","fast-glob":"^3.3.2","filesize":"^10.1.1","flat":"^5.0.2","fs-extra":"^11.2.0","get-port":"^5.1.1","hasha":"^5.2.2","is-base64":"^1.1.0","is-cidr":"4","is-ip":"3","is-url":"^1.2.4","joi":"17.12.2","joi-extension-semver":"^5.0.0","js-yaml":"^4.1.0","kill-port":"^2.0.1","lodash":"^4.17.21","lru-cache":"^11.0.2","node-stream-zip":"^1.15.0","p-all":"^3.0.0","p-limit":"^3.1.0","p-map":"^4.0.0","p-retry":"^4.6.2","p-wait-for":"^3.2.0","rate-limiter-flexible":"^5.0.5","read-last-lines":"^1.8.0","semver":"^7.6.3","sequelize":"^6.35.0","shelljs":"^0.8.5","slugify":"^1.6.6","ssri":"^8.0.1","stream-throttle":"^0.1.3","stream-to-promise":"^3.0.0","systeminformation":"^5.23.3","tail":"^2.2.4","tar":"^6.1.11","transliteration":"^2.3.5","ua-parser-js":"^1.0.2","ufo":"^1.5.3","uuid":"^9.0.1","valid-url":"^1.0.9","which":"^2.0.2","xbytes":"^1.8.0"},"devDependencies":{"expand-tilde":"^2.0.2","express":"^4.18.2","jest":"^29.7.0","unzipper":"^0.10.11"},"gitHead":"e5764f753181ed6a7c615cd4fc6682aacf0cb7cd"}');
|
|
38888
38889
|
|
|
38889
38890
|
/***/ }),
|
|
38890
38891
|
|
package/lib/event/index.js
CHANGED
|
@@ -54,6 +54,7 @@ module.exports = ({
|
|
|
54
54
|
removeBlockletRouting,
|
|
55
55
|
takeRoutingSnapshot,
|
|
56
56
|
handleRouting,
|
|
57
|
+
handleBlockletWafChange,
|
|
57
58
|
domainStatus,
|
|
58
59
|
teamAPI,
|
|
59
60
|
securityAPI,
|
|
@@ -583,6 +584,23 @@ module.exports = ({
|
|
|
583
584
|
});
|
|
584
585
|
});
|
|
585
586
|
|
|
587
|
+
routerManager.on(EVENTS.UPDATE_DOMAIN_ALIAS, (did) => {
|
|
588
|
+
if (did) {
|
|
589
|
+
blockletManager
|
|
590
|
+
.detail({ did })
|
|
591
|
+
.then((blocklet) => {
|
|
592
|
+
if (blocklet?.settings?.gateway?.wafPolicy?.enabled === false) {
|
|
593
|
+
handleBlockletWafChange({ teamDid: did, wafPolicy: blocklet?.settings?.gateway?.wafPolicy }).catch(
|
|
594
|
+
(err) => {
|
|
595
|
+
logger.error('Update blocklet wafPolicy failed on add domain alias', { error: err });
|
|
596
|
+
}
|
|
597
|
+
);
|
|
598
|
+
}
|
|
599
|
+
})
|
|
600
|
+
.catch((err) => logger.error('Update blocklet wafPolicy failed on update domain alias', { error: err }));
|
|
601
|
+
}
|
|
602
|
+
});
|
|
603
|
+
|
|
586
604
|
[EVENTS.DOMAIN_STATUS, BlockletEvents.domainStatus].forEach((eventName) => {
|
|
587
605
|
domainStatus.on(eventName, (data) => {
|
|
588
606
|
if (data) {
|
package/lib/index.js
CHANGED
|
@@ -286,6 +286,8 @@ function ABTNode(options) {
|
|
|
286
286
|
const webhookAPI = new WebhookAPI({ states, teamManager });
|
|
287
287
|
|
|
288
288
|
const {
|
|
289
|
+
updateBlockletWafSettings,
|
|
290
|
+
handleBlockletWafChange,
|
|
289
291
|
handleRouting,
|
|
290
292
|
resetSiteByDid,
|
|
291
293
|
updateNodeRouting,
|
|
@@ -772,6 +774,8 @@ function ABTNode(options) {
|
|
|
772
774
|
deleteOAuthClient: teamAPI.deleteOAuthClient.bind(teamAPI),
|
|
773
775
|
createOAuthClient: teamAPI.createOAuthClient.bind(teamAPI),
|
|
774
776
|
updateOAuthClient: teamAPI.updateOAuthClient.bind(teamAPI),
|
|
777
|
+
|
|
778
|
+
updateBlockletGateway: ({ teamDid, wafPolicy }) => updateBlockletWafSettings({ teamDid, wafPolicy }),
|
|
775
779
|
};
|
|
776
780
|
|
|
777
781
|
blockletManager.createAuditLog = (params) => states.auditLog.create(params, instance);
|
|
@@ -793,6 +797,7 @@ function ABTNode(options) {
|
|
|
793
797
|
node: instance,
|
|
794
798
|
nodeRuntimeMonitor: nodeAPI.runtimeMonitor,
|
|
795
799
|
daemon: options.daemon,
|
|
800
|
+
handleBlockletWafChange,
|
|
796
801
|
});
|
|
797
802
|
|
|
798
803
|
const webhook = WebHook({ events, dataDirs, instance, teamManager });
|
package/lib/router/helper.js
CHANGED
|
@@ -1539,6 +1539,11 @@ module.exports = function getRouterHelpers({
|
|
|
1539
1539
|
headers: get(nodeInfo, 'routing.headers', {}),
|
|
1540
1540
|
services: await blockletState.getServices(),
|
|
1541
1541
|
nodeInfo: info,
|
|
1542
|
+
wafDisabledBlocklets: await Promise.all(
|
|
1543
|
+
(await states.blockletExtras.getWafDisabledBlocklets()).map((x) =>
|
|
1544
|
+
states.site.findOneByBlocklet(x.did).then((result) => ({ did: x.did, site: result }))
|
|
1545
|
+
)
|
|
1546
|
+
),
|
|
1542
1547
|
};
|
|
1543
1548
|
} catch (err) {
|
|
1544
1549
|
logger.error('Read routing rules failed', { error: err });
|
|
@@ -1889,7 +1894,39 @@ module.exports = function getRouterHelpers({
|
|
|
1889
1894
|
return uniq([...blacklist]);
|
|
1890
1895
|
};
|
|
1891
1896
|
|
|
1897
|
+
const updateBlockletWafSettings = async ({ teamDid, wafPolicy }) => {
|
|
1898
|
+
await states.blockletExtras.setSettings(teamDid, { gateway: { wafPolicy } });
|
|
1899
|
+
|
|
1900
|
+
const doc = await nodeState.read();
|
|
1901
|
+
nodeState.emit(EVENTS.RELOAD_GATEWAY, doc);
|
|
1902
|
+
};
|
|
1903
|
+
|
|
1904
|
+
const handleBlockletWafChange = async ({ teamDid, wafPolicy }) => {
|
|
1905
|
+
const blocklet = await blockletManager.detail({ did: teamDid });
|
|
1906
|
+
if (!blocklet) {
|
|
1907
|
+
return;
|
|
1908
|
+
}
|
|
1909
|
+
|
|
1910
|
+
const domainAliases = blocklet?.site?.domainAliases || [];
|
|
1911
|
+
if (!domainAliases.length) {
|
|
1912
|
+
return;
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1915
|
+
const doc = await nodeState.read();
|
|
1916
|
+
const providerName = get(doc, 'routing.provider', null);
|
|
1917
|
+
const defaultWAF = doc.routing.wafPolicy?.mode;
|
|
1918
|
+
|
|
1919
|
+
// update nginx waf
|
|
1920
|
+
const provider = providerName && providers[providerName] && providers[providerName].provider;
|
|
1921
|
+
if (provider && typeof provider.addCustomWAFConf === 'function') {
|
|
1922
|
+
await provider.addCustomWAFConf({ did: teamDid, domainAliases, wafPolicy, defaultWAF });
|
|
1923
|
+
nodeState.emit(EVENTS.RELOAD_GATEWAY, doc);
|
|
1924
|
+
}
|
|
1925
|
+
};
|
|
1926
|
+
|
|
1892
1927
|
return {
|
|
1928
|
+
updateBlockletWafSettings,
|
|
1929
|
+
handleBlockletWafChange,
|
|
1893
1930
|
ensureDashboardRouting,
|
|
1894
1931
|
ensureBlockletRouting,
|
|
1895
1932
|
ensureBlockletRoutingForUpgrade,
|
package/lib/router/index.js
CHANGED
|
@@ -114,7 +114,14 @@ class Router {
|
|
|
114
114
|
async updateRoutingTable() {
|
|
115
115
|
logger.info('update routing table');
|
|
116
116
|
|
|
117
|
-
const {
|
|
117
|
+
const {
|
|
118
|
+
sites,
|
|
119
|
+
certificates,
|
|
120
|
+
headers = {},
|
|
121
|
+
services = [],
|
|
122
|
+
nodeInfo = {},
|
|
123
|
+
wafDisabledBlocklets = [],
|
|
124
|
+
} = (await this.getRoutingParams()) || {};
|
|
118
125
|
if (!Array.isArray(sites)) {
|
|
119
126
|
logger.error('sites is not an array', { sites });
|
|
120
127
|
return;
|
|
@@ -186,6 +193,7 @@ class Router {
|
|
|
186
193
|
proxyPolicy,
|
|
187
194
|
wafPolicy,
|
|
188
195
|
cacheEnabled: isGatewayCacheEnabled(nodeInfo),
|
|
196
|
+
wafDisabledBlocklets,
|
|
189
197
|
});
|
|
190
198
|
}
|
|
191
199
|
|
package/lib/router/manager.js
CHANGED
|
@@ -22,6 +22,7 @@ const { getProvider } = require('@abtnode/router-provider');
|
|
|
22
22
|
const checkDomainMatch = require('@abtnode/util/lib/check-domain-match');
|
|
23
23
|
const { isDidDomain, isCustomDomain } = require('@abtnode/util/lib/url-evaluation');
|
|
24
24
|
const { isTopLevelDomain } = require('@abtnode/util/lib/domain');
|
|
25
|
+
const { EVENTS } = require('@abtnode/constant');
|
|
25
26
|
const {
|
|
26
27
|
DOMAIN_FOR_IP_SITE,
|
|
27
28
|
DOMAIN_FOR_DEFAULT_SITE,
|
|
@@ -359,6 +360,7 @@ class RouterManager extends EventEmitter {
|
|
|
359
360
|
const newSite = await states.site.findOne({ id });
|
|
360
361
|
await attachRuntimeDomainAliases({ sites: newSite, context, node: states.node });
|
|
361
362
|
|
|
363
|
+
this.emit(EVENTS.UPDATE_DOMAIN_ALIAS, did);
|
|
362
364
|
return newSite;
|
|
363
365
|
}
|
|
364
366
|
|
|
@@ -413,6 +415,7 @@ class RouterManager extends EventEmitter {
|
|
|
413
415
|
);
|
|
414
416
|
}
|
|
415
417
|
|
|
418
|
+
this.emit(EVENTS.UPDATE_DOMAIN_ALIAS, getDidFromDomainGroupName(dbSite.domain));
|
|
416
419
|
return dbSite;
|
|
417
420
|
}
|
|
418
421
|
|
package/lib/states/audit-log.js
CHANGED
|
@@ -534,6 +534,9 @@ const getLogContent = async (action, args, context, result, info, node) => {
|
|
|
534
534
|
case 'deleteOAuthClient':
|
|
535
535
|
return `Delete ${args.teamDid} OAuth Client:(${args.clientId})`;
|
|
536
536
|
|
|
537
|
+
case 'updateBlockletGateway':
|
|
538
|
+
return `Update Blocklet WAF:(${args.teamDid} to ${args.wafPolicy?.enabled})`;
|
|
539
|
+
|
|
537
540
|
default:
|
|
538
541
|
return action;
|
|
539
542
|
}
|
|
@@ -581,6 +584,7 @@ const getLogCategory = (action) => {
|
|
|
581
584
|
case 'deleteOAuthClient':
|
|
582
585
|
case 'createOAuthClient':
|
|
583
586
|
case 'updateOAuthClient':
|
|
587
|
+
case 'updateBlockletGateway':
|
|
584
588
|
return 'blocklet';
|
|
585
589
|
|
|
586
590
|
case 'addUploadEndpoint':
|
|
@@ -253,6 +253,10 @@ class BlockletExtrasState extends BaseState {
|
|
|
253
253
|
updateByDid(did, updates) {
|
|
254
254
|
return super.update({ did }, { $set: updates });
|
|
255
255
|
}
|
|
256
|
+
|
|
257
|
+
getWafDisabledBlocklets() {
|
|
258
|
+
return super.find({ where: { 'settings.gateway.wafPolicy.enabled': false } });
|
|
259
|
+
}
|
|
256
260
|
}
|
|
257
261
|
|
|
258
262
|
module.exports = BlockletExtrasState;
|
package/lib/states/node.js
CHANGED
|
@@ -309,7 +309,8 @@ class NodeState extends BaseState {
|
|
|
309
309
|
}
|
|
310
310
|
|
|
311
311
|
async updateGateway(updates) {
|
|
312
|
-
const
|
|
312
|
+
const old = await this.read();
|
|
313
|
+
const { routing } = old;
|
|
313
314
|
['requestLimit', 'cacheEnabled', 'blockPolicy', 'proxyPolicy', 'wafPolicy', 'blacklistHash'].forEach((key) => {
|
|
314
315
|
if (key in updates) {
|
|
315
316
|
routing[key] = updates[key];
|
|
@@ -318,6 +319,7 @@ class NodeState extends BaseState {
|
|
|
318
319
|
|
|
319
320
|
const doc = await this.update({ $set: { routing } });
|
|
320
321
|
this.emit(EVENTS.RELOAD_GATEWAY, doc);
|
|
322
|
+
this.emit(EVENTS.NODE_UPDATED, doc, old);
|
|
321
323
|
return doc.routing;
|
|
322
324
|
}
|
|
323
325
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
const crypto = require('crypto');
|
|
2
2
|
const uuid = require('uuid');
|
|
3
|
-
const { OAUTH_CLIENT_SECRET_TTL } = require('@abtnode/constant');
|
|
4
3
|
const { CustomError } = require('@blocklet/error');
|
|
5
4
|
const BaseState = require('./base');
|
|
6
5
|
const { oauthClientSchema } = require('../validators/oauth');
|
|
@@ -34,6 +33,7 @@ class OauthClient extends BaseState {
|
|
|
34
33
|
jwks,
|
|
35
34
|
softwareId,
|
|
36
35
|
softwareVersion,
|
|
36
|
+
clientSecretExpiresAt = null,
|
|
37
37
|
} = input || {};
|
|
38
38
|
|
|
39
39
|
const data = {
|
|
@@ -55,7 +55,7 @@ class OauthClient extends BaseState {
|
|
|
55
55
|
clientId: uuid.v4(),
|
|
56
56
|
clientSecret: generateCode(32),
|
|
57
57
|
clientIdIssuedAt: parseInt(Date.now() / 1000, 10),
|
|
58
|
-
clientSecretExpiresAt
|
|
58
|
+
clientSecretExpiresAt,
|
|
59
59
|
createdBy: context.user.did,
|
|
60
60
|
};
|
|
61
61
|
|
|
@@ -76,6 +76,7 @@ class OauthClient extends BaseState {
|
|
|
76
76
|
policyUri,
|
|
77
77
|
logoUri,
|
|
78
78
|
clientId,
|
|
79
|
+
clientSecretExpiresAt,
|
|
79
80
|
} = input || {};
|
|
80
81
|
|
|
81
82
|
const doc = await this.findOne({ clientId });
|
|
@@ -91,6 +92,7 @@ class OauthClient extends BaseState {
|
|
|
91
92
|
doc.tosUri = tosUri;
|
|
92
93
|
doc.policyUri = policyUri;
|
|
93
94
|
doc.logoUri = logoUri;
|
|
95
|
+
doc.clientSecretExpiresAt = clientSecretExpiresAt;
|
|
94
96
|
|
|
95
97
|
await super.update({ clientId }, { $set: doc });
|
|
96
98
|
return doc;
|
package/lib/util/blocklet.js
CHANGED
|
@@ -124,7 +124,7 @@ const dockerRemoveByName = require('./docker/docker-remove-by-name');
|
|
|
124
124
|
const checkNeedRunDocker = require('./docker/check-need-run-docker');
|
|
125
125
|
const getDockerRuntimeInfo = require('./docker/get-docker-runtime-info');
|
|
126
126
|
const parseDockerName = require('./docker/parse-docker-name');
|
|
127
|
-
const createDockerNetwork = require('./docker/docker-network');
|
|
127
|
+
const { createDockerNetwork } = require('./docker/docker-network');
|
|
128
128
|
|
|
129
129
|
/**
|
|
130
130
|
* get blocklet engine info, default is node
|
|
@@ -611,7 +611,7 @@ const startBlockletProcess = async (
|
|
|
611
611
|
}
|
|
612
612
|
|
|
613
613
|
const dockerNetworkName = parseDockerName(blocklet?.meta?.did, 'docker-network');
|
|
614
|
-
await createDockerNetwork(dockerNetworkName
|
|
614
|
+
await createDockerNetwork(dockerNetworkName);
|
|
615
615
|
|
|
616
616
|
const startBlockletTask = async (b, { ancestors }) => {
|
|
617
617
|
// 需要在在这里传入字符串类型,否则进程中如法转化成 Date 对象
|
|
@@ -1590,6 +1590,13 @@ const _getBlocklet = async ({
|
|
|
1590
1590
|
|
|
1591
1591
|
blocklet.settings.languages = blocklet.settings.languages || [];
|
|
1592
1592
|
|
|
1593
|
+
// 移除第一个版本中 from 为 tmpl 的导航
|
|
1594
|
+
if (blocklet?.settings?.navigations && Array.isArray(blocklet.settings.navigations)) {
|
|
1595
|
+
blocklet.settings.navigations = (blocklet.settings.navigations || []).filter(
|
|
1596
|
+
(item) => !(item?.parent === '/team' && ['tmpl'].includes(item.from))
|
|
1597
|
+
);
|
|
1598
|
+
}
|
|
1599
|
+
|
|
1593
1600
|
const nodeInfo = await states.node.read();
|
|
1594
1601
|
|
|
1595
1602
|
(nodeInfo?.blockletRegistryList || []).forEach((store) => {
|
|
@@ -6,28 +6,6 @@ const { checkDockerInstalled } = require('./check-docker-installed');
|
|
|
6
6
|
const parseDockerName = require('./parse-docker-name');
|
|
7
7
|
const promiseDebounce = require('../promise-debounce');
|
|
8
8
|
|
|
9
|
-
let pruneLock = false;
|
|
10
|
-
|
|
11
|
-
async function pruneDockerNetwork() {
|
|
12
|
-
if (pruneLock) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
pruneLock = true;
|
|
16
|
-
try {
|
|
17
|
-
const isDockerInstalled = await checkDockerInstalled();
|
|
18
|
-
if (isDockerInstalled) {
|
|
19
|
-
await promiseSpawn('docker network prune -f');
|
|
20
|
-
}
|
|
21
|
-
} catch (e) {
|
|
22
|
-
logger.error(e);
|
|
23
|
-
} finally {
|
|
24
|
-
pruneLock = false;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// 每小时清理一次没用到的 network, 因为 network 占用很低,并且每个应用只有 2 个, 所以不需要频繁清理
|
|
29
|
-
setInterval(pruneDockerNetwork, 1000 * 60 * 60);
|
|
30
|
-
|
|
31
9
|
async function cleanPm2NotHasContainer() {
|
|
32
10
|
const isDockerInstalled = await checkDockerInstalled();
|
|
33
11
|
if (!isDockerInstalled) {
|
|
@@ -22,35 +22,12 @@ async function getDockerNetworks() {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
setInterval(
|
|
27
|
-
async () => {
|
|
28
|
-
try {
|
|
29
|
-
if (!lockFile.tryLock(networkPruneLockName)) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const isDockerInstalled = await checkDockerInstalled();
|
|
33
|
-
if (isDockerInstalled) {
|
|
34
|
-
await promiseSpawn('docker network prune -f');
|
|
35
|
-
}
|
|
36
|
-
logger.info('docker prune network done');
|
|
37
|
-
} catch (error) {
|
|
38
|
-
logger.error('Error pruning network:', error);
|
|
39
|
-
} finally {
|
|
40
|
-
lockFile.releaseLock(networkPruneLockName);
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
1000 * 60 * 10
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
async function _createDockerNetwork(dockerNetworkName, nodeInfo) {
|
|
25
|
+
async function _createDockerNetwork(dockerNetworkName) {
|
|
47
26
|
if (!process.env.ABT_NODE_DATA_DIR) {
|
|
48
27
|
return;
|
|
49
28
|
}
|
|
50
|
-
if (!
|
|
51
|
-
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
29
|
+
if (!(await checkDockerInstalled())) {
|
|
30
|
+
return;
|
|
54
31
|
}
|
|
55
32
|
const networks = await getDockerNetworks();
|
|
56
33
|
if (!networks.includes(`${dockerNetworkName}-internal`)) {
|
|
@@ -66,7 +43,7 @@ async function _createDockerNetwork(dockerNetworkName, nodeInfo) {
|
|
|
66
43
|
}
|
|
67
44
|
}
|
|
68
45
|
|
|
69
|
-
async function createDockerNetwork(dockerNetworkName
|
|
46
|
+
async function createDockerNetwork(dockerNetworkName) {
|
|
70
47
|
// 创建网络添加锁,防止并发创建相同子网
|
|
71
48
|
if (!lockFile.tryLock(dockerNetworkName)) {
|
|
72
49
|
// 等待锁释放
|
|
@@ -76,7 +53,7 @@ async function createDockerNetwork(dockerNetworkName, nodeInfo) {
|
|
|
76
53
|
// 创建网络的过程不允许清理网络
|
|
77
54
|
lockFile.tryLock(networkPruneLockName);
|
|
78
55
|
try {
|
|
79
|
-
await _createDockerNetwork(dockerNetworkName
|
|
56
|
+
await _createDockerNetwork(dockerNetworkName);
|
|
80
57
|
} catch (error) {
|
|
81
58
|
if (/already exists in network/i.test(error?.message || '')) {
|
|
82
59
|
logger.error('Error docker network already exists, but it can be ignored', error);
|
|
@@ -89,4 +66,25 @@ async function createDockerNetwork(dockerNetworkName, nodeInfo) {
|
|
|
89
66
|
}
|
|
90
67
|
}
|
|
91
68
|
|
|
92
|
-
|
|
69
|
+
async function removeDockerNetwork(dockerNetworkName) {
|
|
70
|
+
try {
|
|
71
|
+
if (!lockFile.tryLock(networkPruneLockName)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const isDockerInstalled = await checkDockerInstalled();
|
|
75
|
+
if (isDockerInstalled) {
|
|
76
|
+
await promiseSpawn(`docker network rm ${dockerNetworkName}`);
|
|
77
|
+
await promiseSpawn(`docker network rm ${dockerNetworkName}-internal`);
|
|
78
|
+
}
|
|
79
|
+
logger.info(`docker remove network ${dockerNetworkName} done`);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
logger.error(`Error remove network ${dockerNetworkName}:`, error);
|
|
82
|
+
} finally {
|
|
83
|
+
lockFile.releaseLock(networkPruneLockName);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
module.exports = {
|
|
88
|
+
createDockerNetwork,
|
|
89
|
+
removeDockerNetwork,
|
|
90
|
+
};
|
|
@@ -374,6 +374,9 @@ async function parseDockerOptionsFromPm2({
|
|
|
374
374
|
${diskSizeOption} \
|
|
375
375
|
--cpus="${dockerEnv.BLOCKLET_DOCKER_CPUS}" \
|
|
376
376
|
--memory="${dockerEnv.BLOCKLET_DOCKER_MEMORY}" \
|
|
377
|
+
--memory-swap="${dockerEnv.BLOCKLET_DOCKER_MEMORY}" \
|
|
378
|
+
--memory-swappiness=0 \
|
|
379
|
+
--oom-kill-disable=false \
|
|
377
380
|
--env-file ${dockerEnvFile} \
|
|
378
381
|
${dockerInfo.network} \
|
|
379
382
|
${dockerInfo.runParamString || ''} \
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.16.44-beta-
|
|
6
|
+
"version": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
7
7
|
"description": "",
|
|
8
8
|
"main": "lib/index.js",
|
|
9
9
|
"files": [
|
|
@@ -19,21 +19,21 @@
|
|
|
19
19
|
"author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
|
|
20
20
|
"license": "Apache-2.0",
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@abtnode/analytics": "1.16.44-beta-
|
|
23
|
-
"@abtnode/auth": "1.16.44-beta-
|
|
24
|
-
"@abtnode/certificate-manager": "1.16.44-beta-
|
|
25
|
-
"@abtnode/client": "1.16.44-beta-
|
|
26
|
-
"@abtnode/constant": "1.16.44-beta-
|
|
27
|
-
"@abtnode/cron": "1.16.44-beta-
|
|
28
|
-
"@abtnode/docker-utils": "1.16.44-beta-
|
|
29
|
-
"@abtnode/logger": "1.16.44-beta-
|
|
30
|
-
"@abtnode/models": "1.16.44-beta-
|
|
31
|
-
"@abtnode/queue": "1.16.44-beta-
|
|
32
|
-
"@abtnode/rbac": "1.16.44-beta-
|
|
33
|
-
"@abtnode/router-provider": "1.16.44-beta-
|
|
34
|
-
"@abtnode/static-server": "1.16.44-beta-
|
|
35
|
-
"@abtnode/timemachine": "1.16.44-beta-
|
|
36
|
-
"@abtnode/util": "1.16.44-beta-
|
|
22
|
+
"@abtnode/analytics": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
23
|
+
"@abtnode/auth": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
24
|
+
"@abtnode/certificate-manager": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
25
|
+
"@abtnode/client": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
26
|
+
"@abtnode/constant": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
27
|
+
"@abtnode/cron": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
28
|
+
"@abtnode/docker-utils": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
29
|
+
"@abtnode/logger": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
30
|
+
"@abtnode/models": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
31
|
+
"@abtnode/queue": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
32
|
+
"@abtnode/rbac": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
33
|
+
"@abtnode/router-provider": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
34
|
+
"@abtnode/static-server": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
35
|
+
"@abtnode/timemachine": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
36
|
+
"@abtnode/util": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
37
37
|
"@arcblock/did": "1.20.11",
|
|
38
38
|
"@arcblock/did-auth": "1.20.11",
|
|
39
39
|
"@arcblock/did-ext": "1.20.11",
|
|
@@ -44,15 +44,15 @@
|
|
|
44
44
|
"@arcblock/pm2-events": "^0.0.5",
|
|
45
45
|
"@arcblock/validator": "1.20.11",
|
|
46
46
|
"@arcblock/vc": "1.20.11",
|
|
47
|
-
"@blocklet/constant": "1.16.44-beta-
|
|
47
|
+
"@blocklet/constant": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
48
48
|
"@blocklet/did-space-js": "^1.0.56",
|
|
49
|
-
"@blocklet/env": "1.16.44-beta-
|
|
49
|
+
"@blocklet/env": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
50
50
|
"@blocklet/error": "^0.2.4",
|
|
51
|
-
"@blocklet/meta": "1.16.44-beta-
|
|
52
|
-
"@blocklet/resolver": "1.16.44-beta-
|
|
53
|
-
"@blocklet/sdk": "1.16.44-beta-
|
|
54
|
-
"@blocklet/store": "1.16.44-beta-
|
|
55
|
-
"@blocklet/theme": "^2.13.
|
|
51
|
+
"@blocklet/meta": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
52
|
+
"@blocklet/resolver": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
53
|
+
"@blocklet/sdk": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
54
|
+
"@blocklet/store": "1.16.44-beta-20250529-223630-10e16ac8",
|
|
55
|
+
"@blocklet/theme": "^2.13.55",
|
|
56
56
|
"@fidm/x509": "^1.2.1",
|
|
57
57
|
"@ocap/mcrypto": "1.20.11",
|
|
58
58
|
"@ocap/util": "1.20.11",
|
|
@@ -116,5 +116,5 @@
|
|
|
116
116
|
"jest": "^29.7.0",
|
|
117
117
|
"unzipper": "^0.10.11"
|
|
118
118
|
},
|
|
119
|
-
"gitHead": "
|
|
119
|
+
"gitHead": "381ba5459e32dd7bc94f7ea62df65b72644d6d16"
|
|
120
120
|
}
|