@calltelemetry/cli 0.7.4 → 0.7.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.
Files changed (132) hide show
  1. package/README.md +104 -2
  2. package/dist/commands/appliance.d.ts.map +1 -1
  3. package/dist/commands/appliance.js +48 -0
  4. package/dist/commands/appliance.js.map +1 -1
  5. package/dist/commands/config.d.ts.map +1 -1
  6. package/dist/commands/config.js +15 -2
  7. package/dist/commands/config.js.map +1 -1
  8. package/dist/commands/db.d.ts.map +1 -1
  9. package/dist/commands/db.js +33 -0
  10. package/dist/commands/db.js.map +1 -1
  11. package/dist/commands/diag.d.ts.map +1 -1
  12. package/dist/commands/diag.js +3 -0
  13. package/dist/commands/diag.js.map +1 -1
  14. package/dist/commands/health.d.ts +3 -0
  15. package/dist/commands/health.d.ts.map +1 -0
  16. package/dist/commands/health.js +34 -0
  17. package/dist/commands/health.js.map +1 -0
  18. package/dist/index.js +2 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/bundle.d.ts +1 -0
  21. package/dist/lib/bundle.d.ts.map +1 -1
  22. package/dist/lib/bundle.js +49 -3
  23. package/dist/lib/bundle.js.map +1 -1
  24. package/dist/lib/compose.d.ts.map +1 -1
  25. package/dist/lib/compose.js +126 -13
  26. package/dist/lib/compose.js.map +1 -1
  27. package/dist/lib/hardware.d.ts +46 -0
  28. package/dist/lib/hardware.d.ts.map +1 -0
  29. package/dist/lib/hardware.js +180 -0
  30. package/dist/lib/hardware.js.map +1 -0
  31. package/dist/lib/health-report.d.ts +93 -0
  32. package/dist/lib/health-report.d.ts.map +1 -0
  33. package/dist/lib/health-report.js +391 -0
  34. package/dist/lib/health-report.js.map +1 -0
  35. package/dist/lib/migration-003-nm-heal.js +5 -5
  36. package/dist/lib/migration-003-nm-heal.js.map +1 -1
  37. package/dist/lib/migration-009-bind-mount-files.js +2 -2
  38. package/dist/lib/migration-009-bind-mount-files.js.map +1 -1
  39. package/dist/lib/migration-010-jtapi-state.js +2 -2
  40. package/dist/lib/migration-010-jtapi-state.js.map +1 -1
  41. package/dist/lib/migration-011-docker-memory-limit.js +2 -2
  42. package/dist/lib/migration-011-docker-memory-limit.js.map +1 -1
  43. package/dist/lib/migration-012-db-pool-sizes.d.ts +6 -6
  44. package/dist/lib/migration-012-db-pool-sizes.d.ts.map +1 -1
  45. package/dist/lib/migration-012-db-pool-sizes.js +27 -36
  46. package/dist/lib/migration-012-db-pool-sizes.js.map +1 -1
  47. package/dist/lib/migration-013-grafana-password.d.ts.map +1 -1
  48. package/dist/lib/migration-013-grafana-password.js +5 -13
  49. package/dist/lib/migration-013-grafana-password.js.map +1 -1
  50. package/dist/lib/postgres-performance.d.ts +51 -0
  51. package/dist/lib/postgres-performance.d.ts.map +1 -0
  52. package/dist/lib/postgres-performance.js +279 -0
  53. package/dist/lib/postgres-performance.js.map +1 -0
  54. package/dist/lib/postgres.d.ts +1 -1
  55. package/dist/lib/postgres.d.ts.map +1 -1
  56. package/dist/lib/postgres.js +17 -53
  57. package/dist/lib/postgres.js.map +1 -1
  58. package/dist/lib/prompts.d.ts +2 -1
  59. package/dist/lib/prompts.d.ts.map +1 -1
  60. package/dist/lib/prompts.js +30 -1
  61. package/dist/lib/prompts.js.map +1 -1
  62. package/dist/lib/services.d.ts.map +1 -1
  63. package/dist/lib/services.js +70 -1
  64. package/dist/lib/services.js.map +1 -1
  65. package/dist/lib/showtech-steps.d.ts +5 -1
  66. package/dist/lib/showtech-steps.d.ts.map +1 -1
  67. package/dist/lib/showtech-steps.js +44 -13
  68. package/dist/lib/showtech-steps.js.map +1 -1
  69. package/dist/lib/update-steps.d.ts.map +1 -1
  70. package/dist/lib/update-steps.js +8 -1
  71. package/dist/lib/update-steps.js.map +1 -1
  72. package/dist/lib/update.d.ts +8 -0
  73. package/dist/lib/update.d.ts.map +1 -1
  74. package/dist/lib/update.js +36 -4
  75. package/dist/lib/update.js.map +1 -1
  76. package/dist/lib/version.d.ts +1 -1
  77. package/dist/lib/version.js +1 -1
  78. package/dist/shell/commands/appliance-hardware.d.ts +5 -0
  79. package/dist/shell/commands/appliance-hardware.d.ts.map +1 -0
  80. package/dist/shell/commands/appliance-hardware.js +47 -0
  81. package/dist/shell/commands/appliance-hardware.js.map +1 -0
  82. package/dist/shell/commands/appliance-performance.d.ts.map +1 -1
  83. package/dist/shell/commands/appliance-performance.js +37 -50
  84. package/dist/shell/commands/appliance-performance.js.map +1 -1
  85. package/dist/shell/commands/db.d.ts +1 -0
  86. package/dist/shell/commands/db.d.ts.map +1 -1
  87. package/dist/shell/commands/db.js +18 -0
  88. package/dist/shell/commands/db.js.map +1 -1
  89. package/dist/shell/commands/registry.d.ts.map +1 -1
  90. package/dist/shell/commands/registry.js +12 -1
  91. package/dist/shell/commands/registry.js.map +1 -1
  92. package/dist/shell/commands/show.d.ts +1 -0
  93. package/dist/shell/commands/show.d.ts.map +1 -1
  94. package/dist/shell/commands/show.js +37 -1
  95. package/dist/shell/commands/show.js.map +1 -1
  96. package/dist/shell/network-onboarding.d.ts +1 -0
  97. package/dist/shell/network-onboarding.d.ts.map +1 -1
  98. package/dist/shell/network-onboarding.js +13 -10
  99. package/dist/shell/network-onboarding.js.map +1 -1
  100. package/dist/ui/components/PostgresPerformanceLines.d.ts +7 -0
  101. package/dist/ui/components/PostgresPerformanceLines.d.ts.map +1 -0
  102. package/dist/ui/components/PostgresPerformanceLines.js +7 -0
  103. package/dist/ui/components/PostgresPerformanceLines.js.map +1 -0
  104. package/dist/ui/components/index.d.ts +1 -0
  105. package/dist/ui/components/index.d.ts.map +1 -1
  106. package/dist/ui/components/index.js +1 -0
  107. package/dist/ui/components/index.js.map +1 -1
  108. package/dist/ui/views/DbHealthView.d.ts.map +1 -1
  109. package/dist/ui/views/DbHealthView.js +26 -27
  110. package/dist/ui/views/DbHealthView.js.map +1 -1
  111. package/dist/ui/views/DbStatusView.d.ts.map +1 -1
  112. package/dist/ui/views/DbStatusView.js +5 -3
  113. package/dist/ui/views/DbStatusView.js.map +1 -1
  114. package/dist/ui/views/DiagDatabaseView.d.ts.map +1 -1
  115. package/dist/ui/views/DiagDatabaseView.js +3 -1
  116. package/dist/ui/views/DiagDatabaseView.js.map +1 -1
  117. package/dist/ui/views/DiagShowTechView.d.ts +3 -1
  118. package/dist/ui/views/DiagShowTechView.d.ts.map +1 -1
  119. package/dist/ui/views/DiagShowTechView.js +3 -3
  120. package/dist/ui/views/DiagShowTechView.js.map +1 -1
  121. package/dist/ui/views/DiskHardwareCheckView.d.ts +6 -0
  122. package/dist/ui/views/DiskHardwareCheckView.d.ts.map +1 -0
  123. package/dist/ui/views/DiskHardwareCheckView.js +108 -0
  124. package/dist/ui/views/DiskHardwareCheckView.js.map +1 -0
  125. package/dist/ui/views/HealthReportView.d.ts +6 -0
  126. package/dist/ui/views/HealthReportView.d.ts.map +1 -0
  127. package/dist/ui/views/HealthReportView.js +82 -0
  128. package/dist/ui/views/HealthReportView.js.map +1 -0
  129. package/dist/ui/views/MainMenu.d.ts.map +1 -1
  130. package/dist/ui/views/MainMenu.js +7 -1
  131. package/dist/ui/views/MainMenu.js.map +1 -1
  132. package/package.json +1 -1
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * Also updates existing 80% limit to 90% (previous default was too conservative).
11
11
  */
12
- import { existsSync, writeFileSync, readFileSync } from 'node:fs';
12
+ import { existsSync, writeFileSync, readFileSync, unlinkSync } from 'node:fs';
13
13
  import { spawnSync } from 'node:child_process';
14
14
  const DROPIN_DIR = '/etc/systemd/system/docker.service.d';
15
15
  const DROPIN_FILE = `${DROPIN_DIR}/memory-limit.conf`;
@@ -28,7 +28,7 @@ export async function migrateDockerMemoryLimit() {
28
28
  spawnSync('sudo', ['mkdir', '-p', DROPIN_DIR], { stdio: 'pipe' });
29
29
  spawnSync('sudo', ['cp', tmp, DROPIN_FILE], { stdio: 'pipe' });
30
30
  try {
31
- require('node:fs').unlinkSync(tmp);
31
+ unlinkSync(tmp);
32
32
  }
33
33
  catch { /* ignore */ }
34
34
  const reload = spawnSync('sudo', ['systemctl', 'daemon-reload'], { stdio: 'pipe' });
@@ -1 +1 @@
1
- {"version":3,"file":"migration-011-docker-memory-limit.js","sourceRoot":"","sources":["../../src/lib/migration-011-docker-memory-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAa,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,GAAG,sCAAsC,CAAC;AAC1D,MAAM,WAAW,GAAG,GAAG,UAAU,oBAAoB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,yBAAyB;IACzB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,+CAA+C;IACjD,CAAC;IAED,MAAM,OAAO,GAAG,4BAA4B,CAAC;IAC7C,MAAM,GAAG,GAAG,yBAAyB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAClD,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE5B,SAAS,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC;QAAC,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACpF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,2CAA2C;IAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACzF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"migration-011-docker-memory-limit.js","sourceRoot":"","sources":["../../src/lib/migration-011-docker-memory-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,MAAM,UAAU,GAAG,sCAAsC,CAAC;AAC1D,MAAM,WAAW,GAAG,GAAG,UAAU,oBAAoB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,yBAAyB;IACzB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,+CAA+C;IACjD,CAAC;IAED,MAAM,OAAO,GAAG,4BAA4B,CAAC;IAC7C,MAAM,GAAG,GAAG,yBAAyB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAClD,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAE5B,SAAS,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC;QAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACpF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,2CAA2C;IAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACzF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,12 +1,12 @@
1
1
  /**
2
- * Migration 012: Set default DB pool sizes if no profile is configured.
2
+ * Migration 012: Set default DB connection sizing if no profile is configured.
3
3
  *
4
- * Existing appliances run with 95 total DB connections (45+18+18+14)
5
- * which is excessive for 8GB appliances and wastes memory. If no
6
- * PG_PROFILE is set in .env, apply the 'small' profile defaults:
7
- * 44 total connections (20+8+8+8).
4
+ * Existing appliances run with large DB pool counts by default, which is
5
+ * excessive for 8GB appliances and wastes memory. If no connection sizing is set
6
+ * in .env, apply the conservative 'small' defaults:
7
+ * PG max_connections 100 with 75 total app-side pooled connections (15x5).
8
8
  *
9
- * Does NOT override if a profile is already set — respects user choice.
9
+ * Does NOT override if connection sizing is already set — respects user choice.
10
10
  */
11
11
  export declare function migrateDbPoolSizes(): Promise<boolean>;
12
12
  //# sourceMappingURL=migration-012-db-pool-sizes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"migration-012-db-pool-sizes.d.ts","sourceRoot":"","sources":["../../src/lib/migration-012-db-pool-sizes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgBH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CA2C3D"}
1
+ {"version":3,"file":"migration-012-db-pool-sizes.d.ts","sourceRoot":"","sources":["../../src/lib/migration-012-db-pool-sizes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CA6C3D"}
@@ -1,63 +1,54 @@
1
1
  /**
2
- * Migration 012: Set default DB pool sizes if no profile is configured.
2
+ * Migration 012: Set default DB connection sizing if no profile is configured.
3
3
  *
4
- * Existing appliances run with 95 total DB connections (45+18+18+14)
5
- * which is excessive for 8GB appliances and wastes memory. If no
6
- * PG_PROFILE is set in .env, apply the 'small' profile defaults:
7
- * 44 total connections (20+8+8+8).
4
+ * Existing appliances run with large DB pool counts by default, which is
5
+ * excessive for 8GB appliances and wastes memory. If no connection sizing is set
6
+ * in .env, apply the conservative 'small' defaults:
7
+ * PG max_connections 100 with 75 total app-side pooled connections (15x5).
8
8
  *
9
- * Does NOT override if a profile is already set — respects user choice.
9
+ * Does NOT override if connection sizing is already set — respects user choice.
10
10
  */
11
- import { existsSync, readFileSync } from 'node:fs';
11
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
12
12
  import { spawnSync } from 'node:child_process';
13
- import { homedir } from 'node:os';
14
13
  import { join } from 'node:path';
15
- // Detect install dir (same logic as ct-cli paths.ts)
16
- function getInstallDir() {
17
- const known = ['/home/calltelemetry', '/opt/calltelemetry'];
18
- for (const p of known) {
19
- if (existsSync(join(p, 'docker-compose.yml')))
20
- return p;
21
- }
22
- return homedir();
23
- }
14
+ import { getPaths } from './paths.js';
24
15
  export async function migrateDbPoolSizes() {
25
- const installDir = getInstallDir();
16
+ const { installDir } = getPaths();
26
17
  const envFile = join(installDir, '.env');
27
- // If PG_PROFILE is already set, user has chosen a profile — don't override
18
+ // If any connection sizing is already set, user has chosen values — don't override
28
19
  if (existsSync(envFile)) {
29
20
  const content = readFileSync(envFile, 'utf-8');
30
- if (content.includes('PG_PROFILE=')) {
21
+ if (content.includes('PG_MAX_CONNECTIONS=') ||
22
+ content.includes('DB_POOL_SIZE=') ||
23
+ content.includes('DB_CALL_CONTROL_POOL_SIZE=') ||
24
+ content.includes('DB_BACKGROUND_POOL_SIZE=') ||
25
+ content.includes('DB_DISCOVERY_POOL_SIZE=') ||
26
+ content.includes('DB_OBAN_POOL_SIZE=')) {
31
27
  return false; // Already configured
32
28
  }
33
29
  }
34
- // No profile set — apply small defaults
30
+ // No connection sizing set — apply small defaults
35
31
  const settings = [
36
- 'PG_PROFILE=small',
37
- 'PG_SHM_SIZE=1gb',
38
- 'PG_SHARED_BUFFERS=512MB',
39
- 'PG_EFFECTIVE_CACHE_SIZE=1536MB',
40
- 'PG_WORK_MEM=8MB',
41
- 'PG_MAINTENANCE_WORK_MEM=128MB',
42
- 'PG_MAX_CONNECTIONS=60',
43
- 'DB_POOL_SIZE=20',
44
- 'DB_BACKGROUND_POOL_SIZE=8',
45
- 'DB_DISCOVERY_POOL_SIZE=8',
46
- 'DB_OBAN_POOL_SIZE=8',
32
+ 'PG_MAX_CONNECTIONS=100',
33
+ 'DB_POOL_SIZE=15',
34
+ 'DB_CALL_CONTROL_POOL_SIZE=15',
35
+ 'DB_BACKGROUND_POOL_SIZE=15',
36
+ 'DB_DISCOVERY_POOL_SIZE=15',
37
+ 'DB_OBAN_POOL_SIZE=15',
47
38
  ];
48
39
  // Append to .env (or create it)
49
- const block = '\n# PostgreSQL profile: small (auto-applied by migration 012)\n' +
40
+ const block = '\n# DB connection sizing: small (auto-applied by migration 012)\n' +
50
41
  settings.join('\n') + '\n';
51
42
  const tmp = `/tmp/ct-env-append-${Date.now()}`;
52
- require('node:fs').writeFileSync(tmp, block);
43
+ writeFileSync(tmp, block);
53
44
  // Append via sudo
54
45
  const result = spawnSync('sudo', ['bash', '-c', `cat ${tmp} >> ${envFile}`], { stdio: 'pipe' });
55
46
  try {
56
- require('node:fs').unlinkSync(tmp);
47
+ unlinkSync(tmp);
57
48
  }
58
49
  catch { /* ignore */ }
59
50
  if (result.status !== 0) {
60
- throw new Error(`Failed to write pool sizes to ${envFile}`);
51
+ throw new Error(`Failed to write connection sizing to ${envFile}`);
61
52
  }
62
53
  return true;
63
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"migration-012-db-pool-sizes.js","sourceRoot":"","sources":["../../src/lib/migration-012-db-pool-sizes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,SAAS,EAAY,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,qDAAqD;AACrD,SAAS,aAAa;IACpB,MAAM,KAAK,GAAG,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEzC,2EAA2E;IAC3E,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC,CAAC,qBAAqB;QACrC,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,MAAM,QAAQ,GAAG;QACf,kBAAkB;QAClB,iBAAiB;QACjB,yBAAyB;QACzB,gCAAgC;QAChC,iBAAiB;QACjB,+BAA+B;QAC/B,uBAAuB;QACvB,iBAAiB;QACjB,2BAA2B;QAC3B,0BAA0B;QAC1B,qBAAqB;KACtB,CAAC;IAEF,gCAAgC;IAChC,MAAM,KAAK,GAAG,iEAAiE;QAC7E,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAE7B,MAAM,GAAG,GAAG,sBAAsB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC/C,OAAO,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE7C,kBAAkB;IAClB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,OAAO,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAChG,IAAI,CAAC;QAAC,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAElE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"migration-012-db-pool-sizes.js","sourceRoot":"","sources":["../../src/lib/migration-012-db-pool-sizes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEzC,mFAAmF;IACnF,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,IACE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;YACjC,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YAC9C,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YAC5C,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAC3C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EACtC,CAAC;YACD,OAAO,KAAK,CAAC,CAAC,qBAAqB;QACrC,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,MAAM,QAAQ,GAAG;QACf,wBAAwB;QACxB,iBAAiB;QACjB,8BAA8B;QAC9B,4BAA4B;QAC5B,2BAA2B;QAC3B,sBAAsB;KACvB,CAAC;IAEF,gCAAgC;IAChC,MAAM,KAAK,GAAG,mEAAmE;QAC/E,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAE7B,MAAM,GAAG,GAAG,sBAAsB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC/C,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE1B,kBAAkB;IAClB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,OAAO,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAChG,IAAI,CAAC;QAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAE/C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,wCAAwC,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"migration-013-grafana-password.d.ts","sourceRoot":"","sources":["../../src/lib/migration-013-grafana-password.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAgBH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAoE/D"}
1
+ {"version":3,"file":"migration-013-grafana-password.d.ts","sourceRoot":"","sources":["../../src/lib/migration-013-grafana-password.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAoE/D"}
@@ -11,21 +11,13 @@
11
11
  * 3. Removes stale GRAFANA_TOKEN if present
12
12
  * 4. Resets Grafana admin password via grafana-cli (for existing volumes)
13
13
  */
14
- import { existsSync, readFileSync } from 'node:fs';
14
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
15
15
  import { randomBytes } from 'node:crypto';
16
16
  import { spawnSync } from 'node:child_process';
17
- import { homedir } from 'node:os';
18
17
  import { join } from 'node:path';
19
- function getInstallDir() {
20
- const known = ['/home/calltelemetry', '/opt/calltelemetry'];
21
- for (const p of known) {
22
- if (existsSync(join(p, 'docker-compose.yml')))
23
- return p;
24
- }
25
- return homedir();
26
- }
18
+ import { getPaths } from './paths.js';
27
19
  export async function migrateGrafanaPassword() {
28
- const installDir = getInstallDir();
20
+ const { installDir } = getPaths();
29
21
  const envFile = join(installDir, '.env');
30
22
  // If GRAFANA_PASSWORD is already set, nothing to do
31
23
  if (existsSync(envFile)) {
@@ -40,13 +32,13 @@ export async function migrateGrafanaPassword() {
40
32
  const block = '\n# Grafana auth password (auto-generated by migration 013)\n' +
41
33
  `GRAFANA_PASSWORD=${password}\n`;
42
34
  const tmp = `/tmp/ct-grafana-pw-${Date.now()}`;
43
- require('node:fs').writeFileSync(tmp, block);
35
+ writeFileSync(tmp, block);
44
36
  // Append to .env
45
37
  const appendResult = spawnSync('sudo', ['bash', '-c', `cat ${tmp} >> ${envFile}`], {
46
38
  stdio: 'pipe',
47
39
  });
48
40
  try {
49
- require('node:fs').unlinkSync(tmp);
41
+ unlinkSync(tmp);
50
42
  }
51
43
  catch {
52
44
  /* ignore */
@@ -1 +1 @@
1
- {"version":3,"file":"migration-013-grafana-password.js","sourceRoot":"","sources":["../../src/lib/migration-013-grafana-password.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,SAAS,aAAa;IACpB,MAAM,KAAK,GAAG,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEzC,oDAAoD;IACpD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC,CAAC,qBAAqB;QACrC,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEjD,mBAAmB;IACnB,MAAM,KAAK,GACT,+DAA+D;QAC/D,oBAAoB,QAAQ,IAAI,CAAC;IAEnC,MAAM,GAAG,GAAG,sBAAsB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC/C,OAAO,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE7C,iBAAiB;IACjB,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,OAAO,EAAE,CAAC,EAAE;QACjF,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;IACH,IAAI,CAAC;QACH,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,4EAA4E;IAC5E,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvC,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACnF,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,4EAA4E;IAC5E,mDAAmD;IACnD,MAAM,WAAW,GAAG,SAAS,CAC3B,QAAQ,EACR,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,CAAC,EAC9F,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CACpD,CAAC;IAEF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,sDAAsD;QACtD,mEAAmE;QACnE,iFAAiF;QACjF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7E,OAAO,CAAC,IAAI,CACV,yDAAyD,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"migration-013-grafana-password.js","sourceRoot":"","sources":["../../src/lib/migration-013-grafana-password.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export type PerformanceStatus = 'ok' | 'warn' | 'fail' | 'info';
2
+ export interface PostgresSetting {
3
+ setting: string | null;
4
+ source: string | null;
5
+ }
6
+ export interface PostgresWalStats {
7
+ walRecords: number | null;
8
+ walFpi: number | null;
9
+ walBytes: number | null;
10
+ walWrites: number | null;
11
+ walSyncs: number | null;
12
+ walWriteTimeMs: number | null;
13
+ walSyncTimeMs: number | null;
14
+ avgWalWriteMs: number | null;
15
+ avgWalSyncMs: number | null;
16
+ statsReset: string | null;
17
+ }
18
+ export interface PostgresDatabaseIoStats {
19
+ blocksRead: number | null;
20
+ blocksHit: number | null;
21
+ cacheHitPct: number | null;
22
+ blockReadTimeMs: number | null;
23
+ blockWriteTimeMs: number | null;
24
+ tempBytes: number | null;
25
+ }
26
+ export interface PgmetricsSnapshot {
27
+ available: boolean;
28
+ reason?: string;
29
+ collectedAt?: string;
30
+ walRateBytesSec: number | null;
31
+ walSyncLatencyMs5m: number | null;
32
+ }
33
+ export interface PostgresPerformance {
34
+ trackIoTiming: PostgresSetting;
35
+ trackWalIoTiming: PostgresSetting;
36
+ wal: PostgresWalStats | null;
37
+ databaseIo: PostgresDatabaseIoStats | null;
38
+ snapshot: PgmetricsSnapshot;
39
+ }
40
+ export interface PostgresPerformanceLine {
41
+ label: string;
42
+ value: string;
43
+ status: PerformanceStatus;
44
+ }
45
+ export declare function fetchPostgresPerformance(): Promise<PostgresPerformance>;
46
+ export declare function formatBytes(bytes: number | null): string;
47
+ export declare function formatRate(bytesPerSecond: number | null): string;
48
+ export declare function formatMs(ms: number | null): string;
49
+ export declare function walLatencyStatus(ms: number | null): PerformanceStatus;
50
+ export declare function postgresPerformanceLines(perf: PostgresPerformance): PostgresPerformanceLine[];
51
+ //# sourceMappingURL=postgres-performance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-performance.d.ts","sourceRoot":"","sources":["../../src/lib/postgres-performance.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,eAAe,CAAC;IAC/B,gBAAgB,EAAE,eAAe,CAAC;IAClC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC3C,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAuLD,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAc7E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAOxD;AAED,wBAAgB,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGhE;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAKlD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,CAKrE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,mBAAmB,GAAG,uBAAuB,EAAE,CAmE7F"}
@@ -0,0 +1,279 @@
1
+ import { composeExec } from './compose.js';
2
+ import { DB_NAME, DB_USER, PG_ENV } from './db.js';
3
+ function parseNumber(value) {
4
+ if (value === undefined || value.trim() === '')
5
+ return null;
6
+ const parsed = Number(value);
7
+ return Number.isFinite(parsed) ? parsed : null;
8
+ }
9
+ function isOn(setting) {
10
+ return setting.setting === 'on';
11
+ }
12
+ function sourceSuffix(setting) {
13
+ return setting.source ? ` (${setting.source})` : '';
14
+ }
15
+ async function psqlRows(sql) {
16
+ const result = await composeExec('db', ['psql', '-U', DB_USER, '-d', DB_NAME, '-t', '-A', '-F', '|', '-c', sql], { env: PG_ENV, pipe: true });
17
+ return (result.stdout ?? '')
18
+ .trim()
19
+ .split('\n')
20
+ .map((line) => line.trim())
21
+ .filter(Boolean)
22
+ .map((line) => line.split('|').map((part) => part.trim()));
23
+ }
24
+ async function fetchTimingSettings() {
25
+ const rows = await psqlRows(`
26
+ SELECT name, setting, source
27
+ FROM pg_settings
28
+ WHERE name IN ('track_io_timing', 'track_wal_io_timing')
29
+ ORDER BY name;
30
+ `);
31
+ const settings = new Map(rows.map((row) => [row[0], { setting: row[1] ?? null, source: row[2] ?? null }]));
32
+ return {
33
+ trackIoTiming: settings.get('track_io_timing') ?? { setting: null, source: null },
34
+ trackWalIoTiming: settings.get('track_wal_io_timing') ?? { setting: null, source: null },
35
+ };
36
+ }
37
+ async function fetchWalStats(trackWalIoTiming) {
38
+ try {
39
+ const rows = await psqlRows(`
40
+ SELECT
41
+ wal_records,
42
+ wal_fpi,
43
+ wal_bytes,
44
+ wal_write,
45
+ wal_sync,
46
+ wal_write_time,
47
+ wal_sync_time,
48
+ COALESCE(to_char(stats_reset, 'YYYY-MM-DD HH24:MI:SS TZ'), '')
49
+ FROM pg_stat_wal;
50
+ `);
51
+ const row = rows[0];
52
+ if (!row)
53
+ return null;
54
+ const walWrites = parseNumber(row[3]);
55
+ const walSyncs = parseNumber(row[4]);
56
+ const walWriteTimeMs = parseNumber(row[5]);
57
+ const walSyncTimeMs = parseNumber(row[6]);
58
+ const timingEnabled = isOn(trackWalIoTiming);
59
+ return {
60
+ walRecords: parseNumber(row[0]),
61
+ walFpi: parseNumber(row[1]),
62
+ walBytes: parseNumber(row[2]),
63
+ walWrites,
64
+ walSyncs,
65
+ walWriteTimeMs,
66
+ walSyncTimeMs,
67
+ avgWalWriteMs: timingEnabled && walWrites && walWrites > 0 && walWriteTimeMs !== null
68
+ ? walWriteTimeMs / walWrites
69
+ : null,
70
+ avgWalSyncMs: timingEnabled && walSyncs && walSyncs > 0 && walSyncTimeMs !== null
71
+ ? walSyncTimeMs / walSyncs
72
+ : null,
73
+ statsReset: row[7] || null,
74
+ };
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ async function fetchDatabaseIoStats() {
81
+ try {
82
+ const rows = await psqlRows(`
83
+ SELECT
84
+ blks_read,
85
+ blks_hit,
86
+ CASE
87
+ WHEN (blks_hit + blks_read) = 0 THEN NULL
88
+ ELSE round((blks_hit::numeric * 100.0) / (blks_hit + blks_read), 2)
89
+ END,
90
+ blk_read_time,
91
+ blk_write_time,
92
+ temp_bytes
93
+ FROM pg_stat_database
94
+ WHERE datname = current_database();
95
+ `);
96
+ const row = rows[0];
97
+ if (!row)
98
+ return null;
99
+ return {
100
+ blocksRead: parseNumber(row[0]),
101
+ blocksHit: parseNumber(row[1]),
102
+ cacheHitPct: parseNumber(row[2]),
103
+ blockReadTimeMs: parseNumber(row[3]),
104
+ blockWriteTimeMs: parseNumber(row[4]),
105
+ tempBytes: parseNumber(row[5]),
106
+ };
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ async function fetchPgmetricsSnapshot() {
113
+ try {
114
+ const availability = await psqlRows(`
115
+ SELECT EXISTS (
116
+ SELECT 1
117
+ FROM information_schema.columns
118
+ WHERE table_schema = 'public'
119
+ AND table_name = 'pgmetrics_snapshots'
120
+ AND column_name = 'wal_sync_latency_ms_5m'
121
+ );
122
+ `);
123
+ if (availability[0]?.[0] !== 't') {
124
+ return {
125
+ available: false,
126
+ reason: 'pgmetrics WAL latency column unavailable',
127
+ walRateBytesSec: null,
128
+ walSyncLatencyMs5m: null,
129
+ };
130
+ }
131
+ const rows = await psqlRows(`
132
+ SELECT
133
+ COALESCE(to_char(collected_at, 'YYYY-MM-DD HH24:MI:SS TZ'), ''),
134
+ COALESCE(wal_rate_bytes_sec::text, ''),
135
+ COALESCE(wal_sync_latency_ms_5m::text, '')
136
+ FROM pgmetrics_snapshots
137
+ ORDER BY collected_at DESC
138
+ LIMIT 1;
139
+ `);
140
+ const row = rows[0];
141
+ if (!row) {
142
+ return {
143
+ available: false,
144
+ reason: 'no pgmetrics snapshot yet',
145
+ walRateBytesSec: null,
146
+ walSyncLatencyMs5m: null,
147
+ };
148
+ }
149
+ return {
150
+ available: true,
151
+ collectedAt: row[0] || undefined,
152
+ walRateBytesSec: parseNumber(row[1]),
153
+ walSyncLatencyMs5m: parseNumber(row[2]),
154
+ };
155
+ }
156
+ catch {
157
+ return {
158
+ available: false,
159
+ reason: 'pgmetrics snapshot query failed',
160
+ walRateBytesSec: null,
161
+ walSyncLatencyMs5m: null,
162
+ };
163
+ }
164
+ }
165
+ export async function fetchPostgresPerformance() {
166
+ const settings = await fetchTimingSettings();
167
+ const [wal, databaseIo, snapshot] = await Promise.all([
168
+ fetchWalStats(settings.trackWalIoTiming),
169
+ fetchDatabaseIoStats(),
170
+ fetchPgmetricsSnapshot(),
171
+ ]);
172
+ return {
173
+ ...settings,
174
+ wal,
175
+ databaseIo,
176
+ snapshot,
177
+ };
178
+ }
179
+ export function formatBytes(bytes) {
180
+ if (bytes === null)
181
+ return 'unavailable';
182
+ if (bytes >= 1024 ** 4)
183
+ return `${(bytes / 1024 ** 4).toFixed(1)} TB`;
184
+ if (bytes >= 1024 ** 3)
185
+ return `${(bytes / 1024 ** 3).toFixed(1)} GB`;
186
+ if (bytes >= 1024 ** 2)
187
+ return `${(bytes / 1024 ** 2).toFixed(1)} MB`;
188
+ if (bytes >= 1024)
189
+ return `${(bytes / 1024).toFixed(1)} kB`;
190
+ return `${bytes.toFixed(0)} B`;
191
+ }
192
+ export function formatRate(bytesPerSecond) {
193
+ if (bytesPerSecond === null)
194
+ return 'unavailable';
195
+ return `${formatBytes(bytesPerSecond)}/s`;
196
+ }
197
+ export function formatMs(ms) {
198
+ if (ms === null)
199
+ return 'unavailable';
200
+ if (ms >= 100)
201
+ return `${ms.toFixed(0)} ms`;
202
+ if (ms >= 10)
203
+ return `${ms.toFixed(1)} ms`;
204
+ return `${ms.toFixed(2)} ms`;
205
+ }
206
+ export function walLatencyStatus(ms) {
207
+ if (ms === null)
208
+ return 'info';
209
+ if (ms >= 200)
210
+ return 'fail';
211
+ if (ms >= 50)
212
+ return 'warn';
213
+ return 'ok';
214
+ }
215
+ export function postgresPerformanceLines(perf) {
216
+ const lines = [
217
+ {
218
+ label: 'track_io_timing',
219
+ value: `${perf.trackIoTiming.setting ?? 'unavailable'}${sourceSuffix(perf.trackIoTiming)}`,
220
+ status: isOn(perf.trackIoTiming) ? 'ok' : 'warn',
221
+ },
222
+ {
223
+ label: 'track_wal_io_timing',
224
+ value: `${perf.trackWalIoTiming.setting ?? 'unavailable'}${sourceSuffix(perf.trackWalIoTiming)}`,
225
+ status: isOn(perf.trackWalIoTiming) ? 'ok' : 'fail',
226
+ },
227
+ ];
228
+ if (perf.snapshot.available) {
229
+ const latency = perf.snapshot.walSyncLatencyMs5m;
230
+ lines.push({
231
+ label: 'WAL sync latency 5m',
232
+ value: latency === null
233
+ ? 'unavailable'
234
+ : `${formatMs(latency)}${perf.snapshot.collectedAt ? ` at ${perf.snapshot.collectedAt}` : ''}`,
235
+ status: walLatencyStatus(latency),
236
+ });
237
+ lines.push({
238
+ label: 'WAL throughput 5m',
239
+ value: formatRate(perf.snapshot.walRateBytesSec),
240
+ status: 'info',
241
+ });
242
+ }
243
+ else {
244
+ lines.push({
245
+ label: 'WAL sync latency 5m',
246
+ value: perf.snapshot.reason ?? 'unavailable',
247
+ status: isOn(perf.trackWalIoTiming) ? 'info' : 'fail',
248
+ });
249
+ }
250
+ if (perf.wal) {
251
+ lines.push({
252
+ label: 'WAL sync average',
253
+ value: `${formatMs(perf.wal.avgWalSyncMs)} since stats reset`,
254
+ status: isOn(perf.trackWalIoTiming) ? walLatencyStatus(perf.wal.avgWalSyncMs) : 'fail',
255
+ });
256
+ lines.push({
257
+ label: 'WAL generated',
258
+ value: formatBytes(perf.wal.walBytes),
259
+ status: 'info',
260
+ });
261
+ }
262
+ if (perf.databaseIo?.cacheHitPct !== null && perf.databaseIo?.cacheHitPct !== undefined) {
263
+ const cacheHitPct = perf.databaseIo.cacheHitPct;
264
+ lines.push({
265
+ label: 'DB cache hit rate',
266
+ value: `${cacheHitPct.toFixed(2)}%`,
267
+ status: cacheHitPct >= 99 ? 'ok' : cacheHitPct >= 95 ? 'warn' : 'fail',
268
+ });
269
+ }
270
+ if (perf.databaseIo) {
271
+ lines.push({
272
+ label: 'DB read/write timing',
273
+ value: `read ${formatMs(perf.databaseIo.blockReadTimeMs)}, write ${formatMs(perf.databaseIo.blockWriteTimeMs)}`,
274
+ status: isOn(perf.trackIoTiming) ? 'info' : 'warn',
275
+ });
276
+ }
277
+ return lines;
278
+ }
279
+ //# sourceMappingURL=postgres-performance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-performance.js","sourceRoot":"","sources":["../../src/lib/postgres-performance.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ export declare function getCurrentPostgresImage(): string;
3
3
  export type PgProfile = 'small' | 'medium' | 'large';
4
4
  export declare const VALID_PROFILES: PgProfile[];
5
5
  /**
6
- * Apply a PG sizing profile — overwrites all profile keys in .env.
6
+ * Apply a PG connection profile — overwrites all profile keys in .env.
7
7
  */
8
8
  export declare function applyPgProfile(profile: PgProfile): Promise<void>;
9
9
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/lib/postgres.ts"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,IAAI,MAAM,CAQ3C;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAmBhD;AAGD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAoErD,eAAO,MAAM,cAAc,EAA+B,SAAS,EAAE,CAAC;AAEtE;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAQ1F;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAYtD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvE"}
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/lib/postgres.ts"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,IAAI,MAAM,CAQ3C;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAmBhD;AAGD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAgCrD,eAAO,MAAM,cAAc,EAA+B,SAAS,EAAE,CAAC;AAEtE;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAQ1F;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAYtD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvE"}