openship 0.6.5 → 0.6.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 (54) hide show
  1. package/dist/{bare-XQIPDO4R.js → bare-OXJVW3AK.js} +11 -10
  2. package/dist/{chunk-WE7BXW6L.js → chunk-2YM3NI2E.js} +2 -2
  3. package/dist/{chunk-RFWJE7ZN.js → chunk-4I2BM2DT.js} +3 -3
  4. package/dist/{chunk-QLX7NBEA.js → chunk-5DMWSTOM.js} +78 -1836
  5. package/dist/{chunk-VDESJSG6.js → chunk-77QDF6UD.js} +135 -21
  6. package/dist/{chunk-7334NSJL.js → chunk-A4GXYE4L.js} +67 -31
  7. package/dist/{chunk-HPXP6LXZ.js → chunk-CBLD2HS5.js} +3 -3
  8. package/dist/{chunk-6JELW75A.js → chunk-FE7ZZQSE.js} +3 -3
  9. package/dist/{chunk-XVOBL7BC.js → chunk-HKRQXPTI.js} +1 -1
  10. package/dist/{chunk-GRTXMUHA.js → chunk-LFE5KQ7Y.js} +11 -11
  11. package/dist/{chunk-TM2IQPYU.js → chunk-LH2PLRQO.js} +2 -2
  12. package/dist/{chunk-LFCSC4IU.js → chunk-LUKYPVJ4.js} +3 -3
  13. package/dist/{chunk-VHMOQL5Y.js → chunk-MLYSEZQB.js} +115 -19
  14. package/dist/{chunk-7S4USQYF.js → chunk-NK5N5LXN.js} +50 -122
  15. package/dist/{chunk-3ZAGC5NT.js → chunk-OBPKYXQL.js} +17 -6
  16. package/dist/{chunk-5OUWIPOB.js → chunk-PCPVTH6M.js} +12 -84
  17. package/dist/chunk-Q7WGTQQ5.js +88 -0
  18. package/dist/{chunk-VLQ3UIVO.js → chunk-QVW76WDL.js} +52 -26
  19. package/dist/{chunk-PZRRL5PC.js → chunk-RSR7PFIQ.js} +14 -3
  20. package/dist/{chunk-A7EWM2KA.js → chunk-SM26HDS2.js} +1 -1
  21. package/dist/{chunk-LEYSL46B.js → chunk-UJ6JZM65.js} +3426 -632
  22. package/dist/{chunk-WFRXYWK2.js → chunk-UVNMQM7W.js} +1 -1
  23. package/dist/chunk-VTGPEC6B.js +308 -0
  24. package/dist/chunk-WVAML4H6.js +2145 -0
  25. package/dist/{chunk-MSZUCNPV.js → chunk-YIMOCZBZ.js} +1 -1
  26. package/dist/{chunk-EZPPTWJQ.js → chunk-YMMQRE5J.js} +1 -1
  27. package/dist/{cloud-3DODOWTR.js → cloud-75VIT4KV.js} +16 -15
  28. package/dist/{detect-P4CIQBRH.js → detect-OIE5V3VZ.js} +3 -3
  29. package/dist/{docker-3K2NEBD6.js → docker-VTR2GK5Y.js} +7 -6
  30. package/dist/{docker-edge-executor-YZZ6P7IC.js → docker-edge-executor-22IBXNYJ.js} +4 -4
  31. package/dist/{edge-import-MCJNVTZ2.js → edge-import-WJUB4M7F.js} +23 -22
  32. package/dist/{edge-preflight-ES6FH4JK.js → edge-preflight-GBNCPNVU.js} +10 -10
  33. package/dist/{ensure-container-edge-YPITNH45.js → ensure-container-edge-KPI2CVXJ.js} +9 -9
  34. package/dist/{executor-DZGX55K2.js → executor-7LXXZPBR.js} +6 -3
  35. package/dist/{host-channel-preflight-MUXE3KZU.js → host-channel-preflight-KE6OONYK.js} +23 -22
  36. package/dist/index.js +95 -84
  37. package/dist/{nginx-NSAHWGJV.js → nginx-KUFMLMAC.js} +9 -7
  38. package/dist/{openresty-lua-DR4D3EZ6.js → openresty-lua-ATTH35BE.js} +6 -4
  39. package/dist/{privilege-YTVI4SKF.js → privilege-I4W3ZNZK.js} +4 -4
  40. package/dist/server/engine/samples/amavisd/amavisd.conf +25 -0
  41. package/dist/server/engine/samples/postfix/master.cf +14 -0
  42. package/dist/server/index.js +35002 -27533
  43. package/dist/server/migrations/0105_mail_inbound_rules.sql +80 -0
  44. package/dist/server/migrations/0106_mcp_call_tracking.sql +23 -0
  45. package/dist/server/migrations/0107_build_minute_metering_indexes.sql +20 -0
  46. package/dist/server/migrations/0108_credential.sql +68 -0
  47. package/dist/server/migrations/meta/_journal.json +28 -0
  48. package/dist/{setup-WUUZURHS.js → setup-XGLGUUFW.js} +10 -10
  49. package/dist/ssh-client-JBMA7SN4.js +28 -0
  50. package/dist/{up-XEO3SR6Z.js → up-K4BV7466.js} +26 -27
  51. package/package.json +1 -1
  52. package/dist/chunk-6HOA5JT7.js +0 -124
  53. package/dist/chunk-XRNRT37W.js +0 -316
  54. /package/dist/{dist-es-ZP5QDSJ3.js → dist-es-AXFRS7PS.js} +0 -0
package/dist/index.js CHANGED
@@ -7,18 +7,13 @@ import {
7
7
  RELEASES,
8
8
  RELEASES_DIR,
9
9
  assetUrl,
10
- bootstrapAdmin,
11
- detectPublicIp,
12
10
  downloadToFile,
13
11
  ensureDashboard,
14
- ensureInternalToken,
15
12
  expectedSha256,
16
13
  fetchSidecar,
17
14
  formatBytes,
18
15
  hashFile,
19
16
  headlessProvision,
20
- internalGet,
21
- internalPost,
22
17
  normalizeUrl,
23
18
  parseSha256,
24
19
  readCliInstall,
@@ -30,24 +25,8 @@ import {
30
25
  startService,
31
26
  stop,
32
27
  upCommand,
33
- waitDashboard,
34
- waitHealthy,
35
28
  writeCliInstall
36
- } from "./chunk-7S4USQYF.js";
37
- import {
38
- importMigratedSites
39
- } from "./chunk-6HOA5JT7.js";
40
- import {
41
- completeHostEdge,
42
- confirmEdgeAction,
43
- diagnoseEdge,
44
- planAndApplyHostEdge,
45
- remediateUnreachableStaticRoots,
46
- renderEdgeConflict,
47
- repairEdgeConflict,
48
- rollbackHostEdge
49
- } from "./chunk-HPXP6LXZ.js";
50
- import "./chunk-XRNRT37W.js";
29
+ } from "./chunk-NK5N5LXN.js";
51
30
  import {
52
31
  composeDown,
53
32
  composeInternalToken,
@@ -79,16 +58,40 @@ import {
79
58
  saveInstanceUrl,
80
59
  shortSha,
81
60
  sourceBuildDir,
82
- startUnitHint,
83
61
  storedApiPort,
84
62
  storedDashboardPort
85
- } from "./chunk-QLX7NBEA.js";
63
+ } from "./chunk-WVAML4H6.js";
64
+ import {
65
+ bootstrapAdmin,
66
+ detectPublicIp,
67
+ importMigratedSites,
68
+ internalFetch,
69
+ internalGet,
70
+ internalPost,
71
+ internalTokenRejectedProblem,
72
+ waitDashboard,
73
+ waitHealthy
74
+ } from "./chunk-VTGPEC6B.js";
75
+ import {
76
+ startUnitHint
77
+ } from "./chunk-5DMWSTOM.js";
86
78
  import "./chunk-QWHBRY2K.js";
79
+ import {
80
+ completeHostEdge,
81
+ confirmEdgeAction,
82
+ diagnoseEdge,
83
+ planAndApplyHostEdge,
84
+ remediateUnreachableStaticRoots,
85
+ renderEdgeConflict,
86
+ repairEdgeConflict,
87
+ rollbackHostEdge
88
+ } from "./chunk-CBLD2HS5.js";
87
89
  import {
88
90
  DATA_DIR,
89
91
  LOG_DIR,
90
92
  OS_DIR
91
93
  } from "./chunk-ELGRMZOW.js";
94
+ import "./chunk-HKRQXPTI.js";
92
95
  import "./chunk-ONKEYSMY.js";
93
96
  import "./chunk-XZYFZ6A5.js";
94
97
  import "./chunk-PDW4L3NV.js";
@@ -97,37 +100,38 @@ import "./chunk-42WQABXM.js";
97
100
  import "./chunk-DRK3MEDS.js";
98
101
  import "./chunk-3NQQXMDR.js";
99
102
  import "./chunk-ZWLDLTJP.js";
100
- import "./chunk-6JELW75A.js";
101
- import "./chunk-3ZAGC5NT.js";
102
- import "./chunk-WNWQBB7F.js";
103
- import "./chunk-2GWYYHOR.js";
104
- import "./chunk-RXQBD4ZY.js";
105
- import "./chunk-XVOBL7BC.js";
103
+ import "./chunk-FE7ZZQSE.js";
104
+ import "./chunk-OBPKYXQL.js";
106
105
  import {
107
106
  detectInstalledProxy,
108
107
  scanImportableSites
109
- } from "./chunk-7334NSJL.js";
110
- import "./chunk-VLQ3UIVO.js";
108
+ } from "./chunk-A4GXYE4L.js";
109
+ import "./chunk-QVW76WDL.js";
110
+ import "./chunk-RSR7PFIQ.js";
111
111
  import "./chunk-I3DPMTSF.js";
112
- import "./chunk-VDESJSG6.js";
113
- import "./chunk-LFCSC4IU.js";
114
- import "./chunk-GRTXMUHA.js";
115
- import "./chunk-MSZUCNPV.js";
116
- import "./chunk-TM2IQPYU.js";
117
- import "./chunk-VHMOQL5Y.js";
118
- import "./chunk-5OUWIPOB.js";
112
+ import "./chunk-WNWQBB7F.js";
113
+ import "./chunk-2GWYYHOR.js";
114
+ import "./chunk-RXQBD4ZY.js";
115
+ import "./chunk-77QDF6UD.js";
116
+ import "./chunk-LUKYPVJ4.js";
117
+ import "./chunk-LFE5KQ7Y.js";
118
+ import "./chunk-YIMOCZBZ.js";
119
+ import "./chunk-LH2PLRQO.js";
120
+ import "./chunk-MLYSEZQB.js";
121
+ import "./chunk-Q7WGTQQ5.js";
122
+ import "./chunk-PCPVTH6M.js";
119
123
  import {
120
124
  LocalExecutor
121
125
  } from "./chunk-6FH4AXVY.js";
122
- import "./chunk-RFWJE7ZN.js";
123
- import "./chunk-WE7BXW6L.js";
124
- import "./chunk-A7EWM2KA.js";
125
- import "./chunk-PZRRL5PC.js";
126
- import "./chunk-EZPPTWJQ.js";
127
- import "./chunk-WFRXYWK2.js";
126
+ import "./chunk-4I2BM2DT.js";
127
+ import "./chunk-YMMQRE5J.js";
128
+ import "./chunk-UVNMQM7W.js";
128
129
  import "./chunk-ZFJXPCQP.js";
130
+ import "./chunk-2YM3NI2E.js";
131
+ import "./chunk-SM26HDS2.js";
129
132
  import {
130
133
  CLOUD_DASHBOARD_URL,
134
+ HOST_CHANNEL_AUTH_REJECTED_SHORT,
131
135
  HOST_CHANNEL_PROVISION_COMMAND,
132
136
  LOCAL_API_URL,
133
137
  LOCAL_DASHBOARD_URL,
@@ -142,7 +146,7 @@ import {
142
146
  parseOpenshipConfigJson,
143
147
  resolveCliUpdatePlan,
144
148
  summarizeHostChannelCause
145
- } from "./chunk-LEYSL46B.js";
149
+ } from "./chunk-UJ6JZM65.js";
146
150
  import "./chunk-PXKCZB2I.js";
147
151
 
148
152
  // src/index.ts
@@ -301,7 +305,7 @@ function getDashboardUrl(name) {
301
305
  }
302
306
 
303
307
  // src/lib/api-client.ts
304
- var USER_AGENT = `openship-cli/${true ? "0.6.5" : "dev"}`;
308
+ var USER_AGENT = `openship-cli/${true ? "0.6.6" : "dev"}`;
305
309
  function getApiUrl2() {
306
310
  return `${getApiUrl()}/api`;
307
311
  }
@@ -1008,16 +1012,11 @@ function ensure(value) {
1008
1012
  return value;
1009
1013
  }
1010
1014
  async function internalGet2(path2, timeoutMs = 8e3) {
1011
- try {
1012
- const res = await fetch(`http://127.0.0.1:${storedApiPort()}${path2}`, {
1013
- headers: { "X-Internal-Token": ensureInternalToken() },
1014
- signal: AbortSignal.timeout(timeoutMs)
1015
- });
1016
- if (!res.ok) return null;
1017
- return await res.json();
1018
- } catch {
1019
- return null;
1020
- }
1015
+ const call = await internalFetch(String(storedApiPort()), path2, {
1016
+ signal: AbortSignal.timeout(timeoutMs)
1017
+ });
1018
+ if (call.kind !== "response" || !call.res.ok) return null;
1019
+ return await call.res.json().catch(() => null);
1021
1020
  }
1022
1021
  async function apiReachable() {
1023
1022
  try {
@@ -1102,7 +1101,7 @@ function dockerNameRunning(nameFilter) {
1102
1101
  return r.stdout.trim().length > 0;
1103
1102
  }
1104
1103
  async function hostControlCheck(api) {
1105
- const { checkHostChannel } = await import("./host-channel-preflight-MUXE3KZU.js");
1104
+ const { checkHostChannel } = await import("./host-channel-preflight-KE6OONYK.js");
1106
1105
  return hostControlRow(await checkHostChannel().catch(() => null), api);
1107
1106
  }
1108
1107
  var NEVER_PROVISIONED_DETAIL = `never provisioned \u2014 run \`${HOST_CHANNEL_PROVISION_COMMAND}\``;
@@ -1127,6 +1126,11 @@ function hostControlRow(res, api) {
1127
1126
  case "key_unreadable":
1128
1127
  case "unreachable":
1129
1128
  return row2("fail", `${api.state.replace(/_/g, " ")} \u2014 see the api container's boot log`);
1129
+ // Its own case, NOT grouped above: this is the one fault here an operator can act
1130
+ // on without the withheld address, and #527 is what happens when the only thing
1131
+ // we tell them is to go read a log.
1132
+ case "auth_rejected":
1133
+ return row2("fail", HOST_CHANNEL_AUTH_REJECTED_SHORT);
1130
1134
  // `disabled` (a hardening choice) and `not_applicable` (a bare install) are the
1131
1135
  // same non-event the local path returns null for. Whitelisted rather than derived
1132
1136
  // from `ok === false`, which `disabled` also is.
@@ -1502,7 +1506,7 @@ async function interactiveDoctor() {
1502
1506
  continue;
1503
1507
  }
1504
1508
  if (action2 === "host-control") {
1505
- const { verifyHostChannel } = await import("./host-channel-preflight-MUXE3KZU.js");
1509
+ const { verifyHostChannel } = await import("./host-channel-preflight-KE6OONYK.js");
1506
1510
  const report3 = await verifyHostChannel().catch(() => null);
1507
1511
  if (report3?.status === "fixed") log2.success("Host control is reachable now.");
1508
1512
  else if (report3?.status === "ok") log2.success("Host control was already reachable.");
@@ -3459,7 +3463,7 @@ async function runRepair2(mode) {
3459
3463
  requireLinux();
3460
3464
  const sp = spin2(mode === "migrate" ? "Migrating the existing proxy's sites into the edge\u2026" : "Taking over :80/:443\u2026");
3461
3465
  try {
3462
- const { repairEdgeConflict: repairEdgeConflict2 } = await import("./edge-preflight-ES6FH4JK.js");
3466
+ const { repairEdgeConflict: repairEdgeConflict2 } = await import("./edge-preflight-GBNCPNVU.js");
3463
3467
  sp?.stop();
3464
3468
  const res = await repairEdgeConflict2(mode, apiPort(), onLog);
3465
3469
  reportRepair(res);
@@ -3608,7 +3612,7 @@ async function panelStatus() {
3608
3612
  async function panelRepair(mode) {
3609
3613
  const sp = spin2(mode === "migrate" ? "Migrating the existing proxy's sites\u2026" : "Taking over :80/:443\u2026");
3610
3614
  try {
3611
- const { repairEdgeConflict: repairEdgeConflict2 } = await import("./edge-preflight-ES6FH4JK.js");
3615
+ const { repairEdgeConflict: repairEdgeConflict2 } = await import("./edge-preflight-GBNCPNVU.js");
3612
3616
  sp?.stop();
3613
3617
  const res = await repairEdgeConflict2(mode, apiPort(), onLog);
3614
3618
  renderRepair(res);
@@ -4450,7 +4454,7 @@ function printMonitoringNextSteps() {
4450
4454
  info(" openship edge analytics -p <project> per-domain analytics");
4451
4455
  }
4452
4456
  async function runMonitoringInstall(opts) {
4453
- const up = await import("./up-XEO3SR6Z.js");
4457
+ const up = await import("./up-K4BV7466.js");
4454
4458
  let adminName = opts.adminName;
4455
4459
  let adminEmail = opts.adminEmail;
4456
4460
  let adminPassword = opts.adminPassword;
@@ -6152,21 +6156,26 @@ var resetAdminCommand = new Command24("reset-admin-password").description("Reset
6152
6156
  pw = entered;
6153
6157
  }
6154
6158
  const port = String(opts.port || storedApiPort());
6155
- let res;
6156
- try {
6157
- res = await fetch(`http://127.0.0.1:${port}/api/system/reset-admin-password`, {
6158
- method: "POST",
6159
- headers: { "Content-Type": "application/json", "X-Internal-Token": ensureInternalToken() },
6160
- body: JSON.stringify({ password: pw, email: opts.email, name: opts.name })
6161
- });
6162
- } catch {
6159
+ const call = await internalFetch(port, "/api/system/reset-admin-password", {
6160
+ method: "POST",
6161
+ headers: { "Content-Type": "application/json" },
6162
+ body: JSON.stringify({ password: pw, email: opts.email, name: opts.name })
6163
+ });
6164
+ if (call.kind === "unreachable") {
6163
6165
  log4.error(`Couldn't reach the Openship API on port ${port}. Is it running? (openship status)`);
6164
6166
  log4.info("If it's listening on another port, pass --port <n>.");
6165
6167
  process.exit(1);
6166
6168
  }
6169
+ if (call.kind === "no-token") {
6170
+ log4.error(`Reset failed \u2014 ${call.detail}`);
6171
+ process.exit(1);
6172
+ }
6173
+ const res = call.res;
6167
6174
  const data = await res.json().catch(() => ({}));
6168
6175
  if (!res.ok || !data.ok) {
6169
- log4.error(`Reset failed: ${data.error || res.statusText}`);
6176
+ log4.error(
6177
+ `Reset failed: ${call.tokenRejected ? internalTokenRejectedProblem() : data.error || res.statusText}`
6178
+ );
6170
6179
  process.exit(1);
6171
6180
  }
6172
6181
  outro3(chalk18.green(`Password reset. Log in as ${data.email} with your new password.`));
@@ -6602,7 +6611,7 @@ function applyOnlyArgv(selfArgs, json) {
6602
6611
  // src/commands/update.ts
6603
6612
  async function verifyHostChannelAfterUpdate() {
6604
6613
  if (isJsonMode()) return;
6605
- const { verifyHostChannel } = await import("./host-channel-preflight-MUXE3KZU.js");
6614
+ const { verifyHostChannel } = await import("./host-channel-preflight-KE6OONYK.js");
6606
6615
  await verifyHostChannel().catch(() => {
6607
6616
  });
6608
6617
  }
@@ -6679,7 +6688,7 @@ async function runSourceUpdate(source, opts) {
6679
6688
  }
6680
6689
  var REINSTALL_HINT = "curl -fsSL https://get.openship.io | sh";
6681
6690
  async function runTarballUpdate(install, opts) {
6682
- const current = "0.6.5";
6691
+ const current = "0.6.6";
6683
6692
  let latest;
6684
6693
  try {
6685
6694
  latest = (await resolveLatestTag()).replace(/^v/, "");
@@ -6763,7 +6772,7 @@ var updateCommand = new Command26("update").description("Update the Openship CLI
6763
6772
  if (source) return runSourceUpdate(source, opts);
6764
6773
  const cliInstall = readCliInstall();
6765
6774
  if (cliInstall?.method === "tarball") return runTarballUpdate(cliInstall, opts);
6766
- const current = "0.6.5";
6775
+ const current = "0.6.6";
6767
6776
  let latest;
6768
6777
  try {
6769
6778
  latest = (await resolveLatestTag()).replace(/^v/, "");
@@ -7023,10 +7032,11 @@ async function streamProvision(port, sessionId, s) {
7023
7032
  let ok3 = false;
7024
7033
  let detail;
7025
7034
  try {
7026
- const res = await fetch(`http://127.0.0.1:${port}/api/system/self-register/stream?id=${sessionId}`, {
7027
- headers: { "X-Internal-Token": ensureInternalToken() },
7035
+ const call = await internalFetch(port, `/api/system/self-register/stream?id=${sessionId}`, {
7028
7036
  signal: AbortSignal.timeout(3e5)
7029
7037
  });
7038
+ if (call.kind !== "response") return { ok: false, detail: call.detail };
7039
+ const res = call.res;
7030
7040
  if (!res.ok || !res.body) return { ok: false };
7031
7041
  const reader = res.body.getReader();
7032
7042
  const decoder = new TextDecoder();
@@ -7370,7 +7380,7 @@ async function runWizard() {
7370
7380
  }
7371
7381
  }
7372
7382
  }
7373
- const uiTag = `v${"0.6.5"}`;
7383
+ const uiTag = `v${"0.6.6"}`;
7374
7384
  if (method === "bare") {
7375
7385
  const dl = spinner4();
7376
7386
  dl.start("Pulling the Openship dist from GitHub");
@@ -7430,7 +7440,7 @@ async function runWizard() {
7430
7440
  const dashboardPort = String(ports.dashboard);
7431
7441
  const moved = portMoveNotice(ports, composeTrustedOriginUrls());
7432
7442
  if (moved.length) log5.info(moved.join("\n"));
7433
- if (!pinnedImagesReady({ version: "0.6.5" })) {
7443
+ if (!pinnedImagesReady({ version: "0.6.6" })) {
7434
7444
  cancel4("The pinned Openship image tag isn't in the registry yet \u2014 nothing on this box was changed.");
7435
7445
  process.exit(1);
7436
7446
  }
@@ -7454,7 +7464,7 @@ async function runWizard() {
7454
7464
  dashboardPort,
7455
7465
  publicUrl,
7456
7466
  trustProxy: behindProxy,
7457
- version: "0.6.5",
7467
+ version: "0.6.6",
7458
7468
  noHostControl: !allowHostControl
7459
7469
  });
7460
7470
  if (!fetched.ok) {
@@ -7483,7 +7493,7 @@ async function runWizard() {
7483
7493
  dashboardPort,
7484
7494
  publicUrl,
7485
7495
  trustProxy: behindProxy,
7486
- version: "0.6.5",
7496
+ version: "0.6.6",
7487
7497
  noHostControl: !allowHostControl
7488
7498
  });
7489
7499
  if (!up.ok) {
@@ -7538,9 +7548,10 @@ async function runWizard() {
7538
7548
  migratedCertPems,
7539
7549
  migratedStaticRootOverrides
7540
7550
  );
7541
- if (!imported.ok) {
7551
+ const missed = migratedSites.length - imported.registered.length;
7552
+ if (missed > 0) {
7542
7553
  log5.warn(
7543
- `Your ${migratedSites.length} existing site${migratedSites.length === 1 ? "" : "s"} aren't served yet \u2014 re-run \`openship up\` to retry the import.`
7554
+ `${missed} of your ${migratedSites.length} existing site${migratedSites.length === 1 ? "" : "s"} ${missed === 1 ? "isn't" : "aren't"} served yet \u2014 see the import output above.`
7544
7555
  );
7545
7556
  }
7546
7557
  }
@@ -7583,7 +7594,7 @@ async function runWizard() {
7583
7594
  if (result.liveUrl) liveUrl2 = result.liveUrl;
7584
7595
  else if (!result.domainRegistered) liveUrl2 = `http://localhost:${started.dashPort}`;
7585
7596
  for (const w of result.warnings) log5.warn(w);
7586
- const { verifyHostChannel } = await import("./host-channel-preflight-MUXE3KZU.js");
7597
+ const { verifyHostChannel } = await import("./host-channel-preflight-KE6OONYK.js");
7587
7598
  await verifyHostChannel().catch(() => {
7588
7599
  });
7589
7600
  finishSetup({
@@ -7862,7 +7873,7 @@ function attachCompletion(program2) {
7862
7873
 
7863
7874
  // src/index.ts
7864
7875
  var program = new Command28();
7865
- program.name("openship").description("Openship CLI \u2014 install, run, and manage Openship from your terminal").version("0.6.5").option("--json", "Machine-readable JSON output (stdout data only)").hook("preAction", (thisCommand) => {
7876
+ program.name("openship").description("Openship CLI \u2014 install, run, and manage Openship from your terminal").version("0.6.6").option("--json", "Machine-readable JSON output (stdout data only)").hook("preAction", (thisCommand) => {
7866
7877
  if (thisCommand.opts().json) setJsonMode(true);
7867
7878
  }).action(async () => {
7868
7879
  const installed = serviceStatus().installed || readInstallMethod() === "compose";
@@ -8,20 +8,21 @@ import {
8
8
  VHOST_GENERATION,
9
9
  acmeKeyArgs,
10
10
  assertValidChallengeToken,
11
+ isAcmePortBindFailure,
11
12
  readVhostGeneration,
12
13
  renderGeoEntries,
13
14
  renderProxyOptions,
14
15
  renderProxyTlsOptions,
15
16
  summarizeCertbotFailure
16
- } from "./chunk-VLQ3UIVO.js";
17
+ } from "./chunk-QVW76WDL.js";
18
+ import "./chunk-RSR7PFIQ.js";
17
19
  import "./chunk-I3DPMTSF.js";
18
- import "./chunk-WE7BXW6L.js";
19
- import "./chunk-A7EWM2KA.js";
20
- import "./chunk-PZRRL5PC.js";
21
- import "./chunk-EZPPTWJQ.js";
22
- import "./chunk-WFRXYWK2.js";
20
+ import "./chunk-YMMQRE5J.js";
21
+ import "./chunk-UVNMQM7W.js";
23
22
  import "./chunk-ZFJXPCQP.js";
24
- import "./chunk-LEYSL46B.js";
23
+ import "./chunk-2YM3NI2E.js";
24
+ import "./chunk-SM26HDS2.js";
25
+ import "./chunk-UJ6JZM65.js";
25
26
  import "./chunk-PXKCZB2I.js";
26
27
  export {
27
28
  MANAGED_STATIC_BASE,
@@ -29,6 +30,7 @@ export {
29
30
  VHOST_GENERATION,
30
31
  acmeKeyArgs,
31
32
  assertValidChallengeToken,
33
+ isAcmePortBindFailure,
32
34
  readVhostGeneration,
33
35
  renderGeoEntries,
34
36
  renderProxyOptions,
@@ -10,6 +10,7 @@ import {
10
10
  EDGE_CHALLENGE_LOCATION,
11
11
  EDGE_CHALLENGE_ROOT,
12
12
  EDGE_CHALLENGE_URL_PREFIX,
13
+ EDGE_CLIENT_MAX_BODY_SIZE,
13
14
  EDGE_CONTAINER_MOUNTS,
14
15
  EDGE_DEFAULT_CERT_CN,
15
16
  EDGE_DEFAULT_CERT_DIRNAME,
@@ -39,11 +40,11 @@ import {
39
40
  ensureOpenRestyConfig,
40
41
  luaSourceAvailable,
41
42
  parseNginxVersion
42
- } from "./chunk-PZRRL5PC.js";
43
- import "./chunk-EZPPTWJQ.js";
44
- import "./chunk-WFRXYWK2.js";
43
+ } from "./chunk-RSR7PFIQ.js";
44
+ import "./chunk-YMMQRE5J.js";
45
+ import "./chunk-UVNMQM7W.js";
45
46
  import "./chunk-ZFJXPCQP.js";
46
- import "./chunk-LEYSL46B.js";
47
+ import "./chunk-UJ6JZM65.js";
47
48
  import "./chunk-PXKCZB2I.js";
48
49
  export {
49
50
  ACME_CHALLENGE_LOCATION,
@@ -53,6 +54,7 @@ export {
53
54
  EDGE_CHALLENGE_LOCATION,
54
55
  EDGE_CHALLENGE_ROOT,
55
56
  EDGE_CHALLENGE_URL_PREFIX,
57
+ EDGE_CLIENT_MAX_BODY_SIZE,
56
58
  EDGE_CONTAINER_MOUNTS,
57
59
  EDGE_DEFAULT_CERT_CN,
58
60
  EDGE_DEFAULT_CERT_DIRNAME,
@@ -6,11 +6,11 @@ import {
6
6
  privilegedExecutor,
7
7
  rootChecked,
8
8
  rootOrDegrade
9
- } from "./chunk-RFWJE7ZN.js";
10
- import "./chunk-EZPPTWJQ.js";
11
- import "./chunk-WFRXYWK2.js";
9
+ } from "./chunk-4I2BM2DT.js";
10
+ import "./chunk-YMMQRE5J.js";
11
+ import "./chunk-UVNMQM7W.js";
12
12
  import "./chunk-ZFJXPCQP.js";
13
- import "./chunk-LEYSL46B.js";
13
+ import "./chunk-UJ6JZM65.js";
14
14
  import "./chunk-PXKCZB2I.js";
15
15
  export {
16
16
  privilegedExecutor,
@@ -477,6 +477,31 @@ $bad_header_quarantine_to = 'bad-header-quarantine';
477
477
  #$undecipherable_subject_tag = '***UNCHECKED*** '; # undef disables it
478
478
  $undecipherable_subject_tag = undef;
479
479
 
480
+ # ─── What happens when NO virus scanner can be reached (GH-565) ──────────────
481
+ #
482
+ # With the settings above and @av_scanners_backup = () earlier in this file, a
483
+ # message that no scanner could examine is DELIVERED, with no subject tag and no
484
+ # admin notification. That is amavis' default and it is a deliberate choice here:
485
+ # clamd's signature load is memory-hungry and its socket is the most fragile part
486
+ # of the stack, so failing OPEN keeps mail flowing on small VPSes.
487
+ #
488
+ # It is a real trade-off, so know which side you are on. Note that amavis still
489
+ # adds its `X-Virus-Scanned` header on this path — the header records that amavis
490
+ # processed the message, NOT that a scanner passed it, and it must not be read as
491
+ # proof of a clean scan. The Emails → Health tab is the honest signal: it reports
492
+ # ClamAV as Crashed/Failed and says mail is being delivered without scanning.
493
+ #
494
+ # To fail CLOSED instead — mail queues (4xx tempfail) until a scanner is back,
495
+ # rather than arriving unscanned — uncomment ONE of these:
496
+ #
497
+ # $virus_scanners_failure_is_fatal = 1; # scanner failure => tempfail
498
+ # $final_unchecked_destiny = D_TEMPFAIL; # same, via the destiny table
499
+ #
500
+ # Before you do: while clamd is down this defers EVERY inbound message, and a
501
+ # queue that outlives the sender's retry window loses mail. Pair it with the
502
+ # subject tag above if you would rather label than defer.
503
+ # ─────────────────────────────────────────────────────────────────────────────
504
+
480
505
  # Hope to fix 'nested MAIL command' issue on high load server.
481
506
  $smtp_connection_cache_enable = 0;
482
507
 
@@ -24,12 +24,26 @@ mlmmj unix - n n - - pipe
24
24
  flags=ORhu user=PH_SYS_USER_MLMMJ:PH_SYS_GROUP_MLMMJ argv=PH_CMD_MLMMJ_AMIME_RECEIVE -L PH_MLMMJ_SPOOL_DIR/${nexthop}
25
25
 
26
26
  # Amavisd integration.
27
+ #
28
+ # smtp_tls_security_level=none is REQUIRED, not an optimisation (GH-392). This
29
+ # is an smtp CLIENT service, so it inherits the global smtp_tls_security_level
30
+ # — and amavisd's :10024 listener does not offer STARTTLS. With the global set
31
+ # to `encrypt` every inbound message defers with "TLS is required, but was not
32
+ # offered": a complete INBOUND outage, from a setting that only looks like it
33
+ # concerns outbound delivery. Saving an outbound relay with scope "all" sets
34
+ # exactly that (apps/api/src/modules/mail/admin/outbound-relay.service.ts), and
35
+ # so does an operator hardening TLS by hand.
36
+ #
37
+ # TLS here would be meaningless anyway: the hop is loopback to a content filter
38
+ # on the same host. Pinning it at the transport keeps the guarantee local to the
39
+ # thing that needs it, instead of depending on every writer of the global.
27
40
  smtp-amavis unix - - n - PH_AMAVISD_MAX_SERVERS smtp
28
41
  -o syslog_name=postfix/amavis
29
42
  -o local_header_rewrite_clients=
30
43
  -o smtp_data_done_timeout=1200
31
44
  -o smtp_send_xforward_command=yes
32
45
  -o smtp_dns_support_level=disabled
46
+ -o smtp_tls_security_level=none
33
47
  -o max_use=20
34
48
 
35
49
  # smtp port used by Amavisd to re-inject scanned email back to Postfix