@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.
@@ -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.54","@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
+ 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
 
@@ -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 });
@@ -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,
@@ -114,7 +114,14 @@ class Router {
114
114
  async updateRoutingTable() {
115
115
  logger.info('update routing table');
116
116
 
117
- const { sites, certificates, headers = {}, services = [], nodeInfo = {} } = (await this.getRoutingParams()) || {};
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
 
@@ -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
 
@@ -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;
@@ -309,7 +309,8 @@ class NodeState extends BaseState {
309
309
  }
310
310
 
311
311
  async updateGateway(updates) {
312
- const { routing } = await this.read();
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: parseInt(Date.now() / 1000 + OAUTH_CLIENT_SECRET_TTL, 10),
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;
@@ -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, nodeInfo);
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
- // 10 分钟清理一次没用到的子网
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 (!nodeInfo.isDockerInstalled) {
51
- if (!(await checkDockerInstalled())) {
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, nodeInfo) {
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, nodeInfo);
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
- module.exports = createDockerNetwork;
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-20250528-003415-7a5e5d90",
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-20250528-003415-7a5e5d90",
23
- "@abtnode/auth": "1.16.44-beta-20250528-003415-7a5e5d90",
24
- "@abtnode/certificate-manager": "1.16.44-beta-20250528-003415-7a5e5d90",
25
- "@abtnode/client": "1.16.44-beta-20250528-003415-7a5e5d90",
26
- "@abtnode/constant": "1.16.44-beta-20250528-003415-7a5e5d90",
27
- "@abtnode/cron": "1.16.44-beta-20250528-003415-7a5e5d90",
28
- "@abtnode/docker-utils": "1.16.44-beta-20250528-003415-7a5e5d90",
29
- "@abtnode/logger": "1.16.44-beta-20250528-003415-7a5e5d90",
30
- "@abtnode/models": "1.16.44-beta-20250528-003415-7a5e5d90",
31
- "@abtnode/queue": "1.16.44-beta-20250528-003415-7a5e5d90",
32
- "@abtnode/rbac": "1.16.44-beta-20250528-003415-7a5e5d90",
33
- "@abtnode/router-provider": "1.16.44-beta-20250528-003415-7a5e5d90",
34
- "@abtnode/static-server": "1.16.44-beta-20250528-003415-7a5e5d90",
35
- "@abtnode/timemachine": "1.16.44-beta-20250528-003415-7a5e5d90",
36
- "@abtnode/util": "1.16.44-beta-20250528-003415-7a5e5d90",
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-20250528-003415-7a5e5d90",
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-20250528-003415-7a5e5d90",
49
+ "@blocklet/env": "1.16.44-beta-20250529-223630-10e16ac8",
50
50
  "@blocklet/error": "^0.2.4",
51
- "@blocklet/meta": "1.16.44-beta-20250528-003415-7a5e5d90",
52
- "@blocklet/resolver": "1.16.44-beta-20250528-003415-7a5e5d90",
53
- "@blocklet/sdk": "1.16.44-beta-20250528-003415-7a5e5d90",
54
- "@blocklet/store": "1.16.44-beta-20250528-003415-7a5e5d90",
55
- "@blocklet/theme": "^2.13.54",
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": "095d89d3b8e40dc1d956203cac94a45a4a843024"
119
+ "gitHead": "381ba5459e32dd7bc94f7ea62df65b72644d6d16"
120
120
  }