openship 0.6.6 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bare-7QD623QV.js +29 -0
- package/dist/{chunk-Q7WGTQQ5.js → chunk-2ANV5ZQ5.js} +1 -1
- package/dist/{chunk-UJ6JZM65.js → chunk-2VSW6Q6C.js} +601 -382
- package/dist/{chunk-PCPVTH6M.js → chunk-5T4UVOM3.js} +6 -4
- package/dist/{chunk-YMMQRE5J.js → chunk-BLEXTYRK.js} +1 -1
- package/dist/{chunk-OBPKYXQL.js → chunk-CIJV43LH.js} +71 -32
- package/dist/{chunk-NK5N5LXN.js → chunk-DDFUESPJ.js} +24 -9
- package/dist/{chunk-6FH4AXVY.js → chunk-E2X26PXR.js} +1 -1
- package/dist/{chunk-HKRQXPTI.js → chunk-FYPFEDPZ.js} +1 -1
- package/dist/{chunk-UVNMQM7W.js → chunk-FZ6QCF6B.js} +8 -6
- package/dist/{chunk-MLYSEZQB.js → chunk-GGIAIGUL.js} +15 -66
- package/dist/{chunk-2YM3NI2E.js → chunk-GIPJNNI5.js} +38 -44
- package/dist/{chunk-ZFJXPCQP.js → chunk-H3WT3A6R.js} +4 -3
- package/dist/chunk-H4FS5BED.js +936 -0
- package/dist/{chunk-CBLD2HS5.js → chunk-J2XM3QSP.js} +8 -5
- package/dist/{chunk-FE7ZZQSE.js → chunk-J3K6XABC.js} +3 -3
- package/dist/{chunk-77QDF6UD.js → chunk-LHFXSC36.js} +428 -93
- package/dist/{chunk-YIMOCZBZ.js → chunk-MEE6OZFP.js} +3 -3
- package/dist/chunk-N5YZMO33.js +111 -0
- package/dist/{chunk-QVW76WDL.js → chunk-NRTJRNAE.js} +58 -16
- package/dist/{chunk-WVAML4H6.js → chunk-PPEBIY5F.js} +247 -61
- package/dist/{chunk-4I2BM2DT.js → chunk-PVP4RGWT.js} +3 -3
- package/dist/{chunk-RSR7PFIQ.js → chunk-QHMDCYZ3.js} +4 -4
- package/dist/chunk-R4VDPFLS.js +106 -0
- package/dist/{chunk-VTGPEC6B.js → chunk-RDXT4BQB.js} +6 -4
- package/dist/{chunk-LFE5KQ7Y.js → chunk-S6B2Z3OO.js} +142 -57
- package/dist/chunk-UWEV6XTS.js +249 -0
- package/dist/{chunk-5DMWSTOM.js → chunk-VQM6JHJB.js} +940 -224
- package/dist/{chunk-SM26HDS2.js → chunk-VSTFHUCV.js} +44 -50
- package/dist/chunk-WU54BXFE.js +70 -0
- package/dist/{chunk-LUKYPVJ4.js → chunk-XWHWTHEL.js} +313 -469
- package/dist/{chunk-A4GXYE4L.js → chunk-ZPJ74LXE.js} +22 -20
- package/dist/cloud-KNNABE3O.js +40 -0
- package/dist/{detect-OIE5V3VZ.js → detect-G4DR3U2N.js} +9 -6
- package/dist/{docker-VTR2GK5Y.js → docker-YOVPCIB4.js} +11 -8
- package/dist/{docker-edge-executor-22IBXNYJ.js → docker-edge-executor-QFXD3337.js} +8 -6
- package/dist/edge-import-CRFVSR6P.js +56 -0
- package/dist/{edge-preflight-GBNCPNVU.js → edge-preflight-MXERVAMG.js} +15 -12
- package/dist/{ensure-container-edge-KPI2CVXJ.js → ensure-container-edge-F4JUNQIK.js} +13 -10
- package/dist/{executor-7LXXZPBR.js → executor-CVPAYYHR.js} +8 -6
- package/dist/host-channel-preflight-QTDNGLCK.js +54 -0
- package/dist/index.js +84 -48
- package/dist/{local-executor-WOFZD72X.js → local-executor-ODC6RANU.js} +3 -2
- package/dist/{nginx-KUFMLMAC.js → nginx-KLFF43TC.js} +11 -8
- package/dist/{openresty-lua-ATTH35BE.js → openresty-lua-VKWUV4GB.js} +6 -5
- package/dist/{privilege-I4W3ZNZK.js → privilege-7D3SSOL3.js} +6 -5
- package/dist/server/index.js +8813 -5232
- package/dist/setup-I5AJC6NJ.js +25 -0
- package/dist/{ssh-client-JBMA7SN4.js → ssh-client-625VWGKP.js} +3 -2
- package/dist/up-QXTOOVXC.js +61 -0
- package/package.json +1 -1
- package/dist/bare-OXJVW3AK.js +0 -25
- package/dist/chunk-LH2PLRQO.js +0 -434
- package/dist/cloud-75VIT4KV.js +0 -37
- package/dist/edge-import-WJUB4M7F.js +0 -52
- package/dist/host-channel-preflight-KE6OONYK.js +0 -50
- package/dist/setup-XGLGUUFW.js +0 -22
- package/dist/up-K4BV7466.js +0 -57
|
@@ -6,6 +6,57 @@ import {
|
|
|
6
6
|
__export
|
|
7
7
|
} from "./chunk-PXKCZB2I.js";
|
|
8
8
|
|
|
9
|
+
// ../../packages/core/src/shell-split.ts
|
|
10
|
+
function shellQuote(value) {
|
|
11
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
12
|
+
}
|
|
13
|
+
function shellSplitWords(value) {
|
|
14
|
+
const words = [];
|
|
15
|
+
let current = "";
|
|
16
|
+
let quoted = false;
|
|
17
|
+
let inSingle = false;
|
|
18
|
+
let inDouble = false;
|
|
19
|
+
let escaped = false;
|
|
20
|
+
for (const char of value.trim()) {
|
|
21
|
+
if (escaped) {
|
|
22
|
+
current += char;
|
|
23
|
+
escaped = false;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (char === "\\" && !inSingle) {
|
|
27
|
+
escaped = true;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (char === "'" && !inDouble) {
|
|
31
|
+
inSingle = !inSingle;
|
|
32
|
+
quoted = true;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (char === '"' && !inSingle) {
|
|
36
|
+
inDouble = !inDouble;
|
|
37
|
+
quoted = true;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (/\s/.test(char) && !inSingle && !inDouble) {
|
|
41
|
+
if (current || quoted) {
|
|
42
|
+
words.push(current);
|
|
43
|
+
current = "";
|
|
44
|
+
quoted = false;
|
|
45
|
+
}
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
current += char;
|
|
49
|
+
}
|
|
50
|
+
if (escaped) current += "\\";
|
|
51
|
+
if (current || quoted) words.push(current);
|
|
52
|
+
return words;
|
|
53
|
+
}
|
|
54
|
+
function commandToArgv(command) {
|
|
55
|
+
if (command == null) return null;
|
|
56
|
+
if (Array.isArray(command)) return command.map((part) => String(part));
|
|
57
|
+
return shellSplitWords(command);
|
|
58
|
+
}
|
|
59
|
+
|
|
9
60
|
// ../../packages/core/src/stacks.ts
|
|
10
61
|
var LANGUAGES = {
|
|
11
62
|
javascript: {
|
|
@@ -831,6 +882,21 @@ function packageManagerEnsureCommand(packageManager) {
|
|
|
831
882
|
if (packageManager !== "pnpm" && packageManager !== "yarn") return "";
|
|
832
883
|
return `(corepack enable ${packageManager} || corepack enable || npm i -g ${packageManager}) >/dev/null 2>&1 || true`;
|
|
833
884
|
}
|
|
885
|
+
var NODE_BIN_PACKAGE_MANAGERS = /* @__PURE__ */ new Set(["npm", "yarn", "pnpm", "bun"]);
|
|
886
|
+
function nodeBinDirs(packageManager, roots) {
|
|
887
|
+
if (!packageManager || !NODE_BIN_PACKAGE_MANAGERS.has(packageManager)) return [];
|
|
888
|
+
const dirs = [];
|
|
889
|
+
for (const root of roots) {
|
|
890
|
+
const dir = `${root.replace(/\/+$/, "")}/node_modules/.bin`;
|
|
891
|
+
if (!dirs.includes(dir)) dirs.push(dir);
|
|
892
|
+
}
|
|
893
|
+
return dirs;
|
|
894
|
+
}
|
|
895
|
+
function nodeBinPathExport(packageManager, roots) {
|
|
896
|
+
const dirs = nodeBinDirs(packageManager, roots);
|
|
897
|
+
if (dirs.length === 0) return "";
|
|
898
|
+
return `export PATH=${dirs.map(shellQuote).join(":")}:"$PATH"`;
|
|
899
|
+
}
|
|
834
900
|
var DI = "https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons";
|
|
835
901
|
var STACK_ICONS = {
|
|
836
902
|
// JS/TS - Frontend & Fullstack
|
|
@@ -2561,57 +2627,6 @@ function isAwsS3Endpoint(endpoint2) {
|
|
|
2561
2627
|
return !endpoint2 || endpoint2.includes(".amazonaws.com");
|
|
2562
2628
|
}
|
|
2563
2629
|
|
|
2564
|
-
// ../../packages/core/src/shell-split.ts
|
|
2565
|
-
function shellQuote(value) {
|
|
2566
|
-
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
2567
|
-
}
|
|
2568
|
-
function shellSplitWords(value) {
|
|
2569
|
-
const words = [];
|
|
2570
|
-
let current = "";
|
|
2571
|
-
let quoted = false;
|
|
2572
|
-
let inSingle = false;
|
|
2573
|
-
let inDouble = false;
|
|
2574
|
-
let escaped = false;
|
|
2575
|
-
for (const char of value.trim()) {
|
|
2576
|
-
if (escaped) {
|
|
2577
|
-
current += char;
|
|
2578
|
-
escaped = false;
|
|
2579
|
-
continue;
|
|
2580
|
-
}
|
|
2581
|
-
if (char === "\\" && !inSingle) {
|
|
2582
|
-
escaped = true;
|
|
2583
|
-
continue;
|
|
2584
|
-
}
|
|
2585
|
-
if (char === "'" && !inDouble) {
|
|
2586
|
-
inSingle = !inSingle;
|
|
2587
|
-
quoted = true;
|
|
2588
|
-
continue;
|
|
2589
|
-
}
|
|
2590
|
-
if (char === '"' && !inSingle) {
|
|
2591
|
-
inDouble = !inDouble;
|
|
2592
|
-
quoted = true;
|
|
2593
|
-
continue;
|
|
2594
|
-
}
|
|
2595
|
-
if (/\s/.test(char) && !inSingle && !inDouble) {
|
|
2596
|
-
if (current || quoted) {
|
|
2597
|
-
words.push(current);
|
|
2598
|
-
current = "";
|
|
2599
|
-
quoted = false;
|
|
2600
|
-
}
|
|
2601
|
-
continue;
|
|
2602
|
-
}
|
|
2603
|
-
current += char;
|
|
2604
|
-
}
|
|
2605
|
-
if (escaped) current += "\\";
|
|
2606
|
-
if (current || quoted) words.push(current);
|
|
2607
|
-
return words;
|
|
2608
|
-
}
|
|
2609
|
-
function commandToArgv(command) {
|
|
2610
|
-
if (command == null) return null;
|
|
2611
|
-
if (Array.isArray(command)) return command.map((part) => String(part));
|
|
2612
|
-
return shellSplitWords(command);
|
|
2613
|
-
}
|
|
2614
|
-
|
|
2615
2630
|
// ../../packages/core/src/mail-image-ref.ts
|
|
2616
2631
|
function buildMailImageRef(opts) {
|
|
2617
2632
|
return buildImageRef(opts, {
|
|
@@ -2621,6 +2636,284 @@ function buildMailImageRef(opts) {
|
|
|
2621
2636
|
});
|
|
2622
2637
|
}
|
|
2623
2638
|
|
|
2639
|
+
// ../../packages/core/src/backup-catalog.ts
|
|
2640
|
+
var PAYLOAD_KINDS = [
|
|
2641
|
+
"pg_dump",
|
|
2642
|
+
"mysql_dump",
|
|
2643
|
+
"redis_rdb",
|
|
2644
|
+
"mongo_dump",
|
|
2645
|
+
"custom_command",
|
|
2646
|
+
"path",
|
|
2647
|
+
"volume"
|
|
2648
|
+
];
|
|
2649
|
+
var PAYLOAD_CONFIG_KEYS = [
|
|
2650
|
+
"sourceIds",
|
|
2651
|
+
"exclude",
|
|
2652
|
+
"quiesce",
|
|
2653
|
+
"compression",
|
|
2654
|
+
"paths",
|
|
2655
|
+
"clearPath",
|
|
2656
|
+
"produceCommand",
|
|
2657
|
+
"command",
|
|
2658
|
+
"restoreCommand",
|
|
2659
|
+
"artifactName"
|
|
2660
|
+
];
|
|
2661
|
+
var UNIVERSAL_PAYLOAD_CONFIG_KEYS = ["verifyOnPrepare", "mail"];
|
|
2662
|
+
var ALL_PAYLOAD_CONFIG_KEYS = [
|
|
2663
|
+
...PAYLOAD_CONFIG_KEYS,
|
|
2664
|
+
...UNIVERSAL_PAYLOAD_CONFIG_KEYS
|
|
2665
|
+
];
|
|
2666
|
+
var HOUR_MS = 60 * 60 * 1e3;
|
|
2667
|
+
var BACKUP_PAYLOADS = {
|
|
2668
|
+
pg_dump: {
|
|
2669
|
+
kind: "pg_dump",
|
|
2670
|
+
label: "PostgreSQL",
|
|
2671
|
+
method: "pg_dump",
|
|
2672
|
+
shape: "database",
|
|
2673
|
+
images: { names: ["postgres", "postgis/postgis"] },
|
|
2674
|
+
restoreNeedsLiveContainer: true,
|
|
2675
|
+
restoreAppliesAfterBounce: false,
|
|
2676
|
+
restoreTimeoutMs: HOUR_MS,
|
|
2677
|
+
// Inert: `pg_restore --clean --if-exists` owns replacement.
|
|
2678
|
+
restoreClearsTargetByDefault: false,
|
|
2679
|
+
// The only kind that can claim this, and only since `producers/pg-dump.ts` restores
|
|
2680
|
+
// under `--single-transaction`. Before that flag, a DROP blocked by a dependent view
|
|
2681
|
+
// was skipped and the archive's rows were loaded ON TOP of the live ones — one table
|
|
2682
|
+
// holding a merge of two points in time, reported as "errors ignored on restore".
|
|
2683
|
+
restoreFailureLeavesTargetIntact: true,
|
|
2684
|
+
requiresRestoreCommand: false,
|
|
2685
|
+
operatorSelectable: true,
|
|
2686
|
+
configKeys: []
|
|
2687
|
+
},
|
|
2688
|
+
mysql_dump: {
|
|
2689
|
+
kind: "mysql_dump",
|
|
2690
|
+
label: "MySQL/MariaDB",
|
|
2691
|
+
method: "mysqldump",
|
|
2692
|
+
shape: "database",
|
|
2693
|
+
// `percona/percona-server` and `percona/percona-server-mongodb` are kept apart by
|
|
2694
|
+
// the `(:|$)` anchor: what follows `percona-server` in the MongoDB image is `-`,
|
|
2695
|
+
// which is neither a tag separator nor the end of the string.
|
|
2696
|
+
images: { names: ["mysql", "mariadb", "percona/percona-server"] },
|
|
2697
|
+
restoreNeedsLiveContainer: true,
|
|
2698
|
+
restoreAppliesAfterBounce: false,
|
|
2699
|
+
restoreTimeoutMs: HOUR_MS,
|
|
2700
|
+
restoreClearsTargetByDefault: false,
|
|
2701
|
+
// MySQL has no transactional DDL: replaying a dump commits each statement as it
|
|
2702
|
+
// goes, so a failure halfway leaves half the schema and part of the data.
|
|
2703
|
+
restoreFailureLeavesTargetIntact: false,
|
|
2704
|
+
requiresRestoreCommand: false,
|
|
2705
|
+
operatorSelectable: true,
|
|
2706
|
+
configKeys: []
|
|
2707
|
+
},
|
|
2708
|
+
redis_rdb: {
|
|
2709
|
+
kind: "redis_rdb",
|
|
2710
|
+
label: "Redis",
|
|
2711
|
+
method: "RDB snapshot",
|
|
2712
|
+
shape: "database",
|
|
2713
|
+
images: { names: ["redis"], namespaces: ["redis"] },
|
|
2714
|
+
restoreNeedsLiveContainer: true,
|
|
2715
|
+
// The one kind whose write is inert until the service restarts. See the field doc.
|
|
2716
|
+
restoreAppliesAfterBounce: true,
|
|
2717
|
+
restoreTimeoutMs: 30 * 60 * 1e3,
|
|
2718
|
+
restoreClearsTargetByDefault: false,
|
|
2719
|
+
// The write is a stream into `dump.rdb`. A failure halfway leaves a TRUNCATED
|
|
2720
|
+
// snapshot — which the running server has not read (see restoreAppliesAfterBounce)
|
|
2721
|
+
// but the next start will, and refuse.
|
|
2722
|
+
restoreFailureLeavesTargetIntact: false,
|
|
2723
|
+
requiresRestoreCommand: false,
|
|
2724
|
+
operatorSelectable: true,
|
|
2725
|
+
configKeys: []
|
|
2726
|
+
},
|
|
2727
|
+
mongo_dump: {
|
|
2728
|
+
kind: "mongo_dump",
|
|
2729
|
+
label: "MongoDB",
|
|
2730
|
+
method: "mongodump",
|
|
2731
|
+
shape: "database",
|
|
2732
|
+
images: { names: ["mongo", "percona/percona-server-mongodb"] },
|
|
2733
|
+
restoreNeedsLiveContainer: true,
|
|
2734
|
+
restoreAppliesAfterBounce: false,
|
|
2735
|
+
restoreTimeoutMs: HOUR_MS,
|
|
2736
|
+
restoreClearsTargetByDefault: false,
|
|
2737
|
+
// `mongorestore --drop` drops and reloads per collection, so a failure between two
|
|
2738
|
+
// collections leaves one restored and the next dropped.
|
|
2739
|
+
restoreFailureLeavesTargetIntact: false,
|
|
2740
|
+
requiresRestoreCommand: false,
|
|
2741
|
+
operatorSelectable: true,
|
|
2742
|
+
configKeys: []
|
|
2743
|
+
},
|
|
2744
|
+
custom_command: {
|
|
2745
|
+
kind: "custom_command",
|
|
2746
|
+
label: "Custom command",
|
|
2747
|
+
method: "your command",
|
|
2748
|
+
shape: "opaque",
|
|
2749
|
+
restoreNeedsLiveContainer: true,
|
|
2750
|
+
restoreAppliesAfterBounce: false,
|
|
2751
|
+
restoreTimeoutMs: HOUR_MS,
|
|
2752
|
+
// Inert: the operator's own inverse command decides what it replaces.
|
|
2753
|
+
restoreClearsTargetByDefault: false,
|
|
2754
|
+
// We cannot reason about someone else's command. `opaque` in, opaque out.
|
|
2755
|
+
restoreFailureLeavesTargetIntact: false,
|
|
2756
|
+
requiresRestoreCommand: true,
|
|
2757
|
+
operatorSelectable: true,
|
|
2758
|
+
configKeys: ["produceCommand", "command", "restoreCommand", "artifactName"]
|
|
2759
|
+
},
|
|
2760
|
+
path: {
|
|
2761
|
+
kind: "path",
|
|
2762
|
+
label: "Files and folders",
|
|
2763
|
+
method: "tar",
|
|
2764
|
+
shape: "filesystem",
|
|
2765
|
+
// Explicit-only: a path is something the operator names. Nothing about an image
|
|
2766
|
+
// says "back up /var/www", and guessing would either miss the data or archive an
|
|
2767
|
+
// OS.
|
|
2768
|
+
restoreNeedsLiveContainer: true,
|
|
2769
|
+
restoreAppliesAfterBounce: false,
|
|
2770
|
+
// Matches the docker helper's own absolute ceiling for the volume directions, so
|
|
2771
|
+
// one number covers all three: a tree big enough to need hours to capture needs
|
|
2772
|
+
// hours to restore.
|
|
2773
|
+
restoreTimeoutMs: 6 * HOUR_MS,
|
|
2774
|
+
// Merge, unless the policy sets `clearPath`. A folder is not necessarily this
|
|
2775
|
+
// artifact's alone.
|
|
2776
|
+
restoreClearsTargetByDefault: false,
|
|
2777
|
+
// `tar -x` writes file by file: a failure halfway leaves the tree part-updated,
|
|
2778
|
+
// and with `clearPath` set it leaves it part-updated on top of an emptied folder.
|
|
2779
|
+
restoreFailureLeavesTargetIntact: false,
|
|
2780
|
+
requiresRestoreCommand: false,
|
|
2781
|
+
operatorSelectable: true,
|
|
2782
|
+
configKeys: ["paths", "exclude", "compression", "clearPath"]
|
|
2783
|
+
},
|
|
2784
|
+
volume: {
|
|
2785
|
+
kind: "volume",
|
|
2786
|
+
label: "Volume snapshot",
|
|
2787
|
+
method: "tar",
|
|
2788
|
+
shape: "filesystem",
|
|
2789
|
+
// No `images`: this is the fallback the registry uses when nothing else detects,
|
|
2790
|
+
// not a match on anything.
|
|
2791
|
+
//
|
|
2792
|
+
// A volume restore extracts through a SEPARATE helper container mounted on the
|
|
2793
|
+
// volume, so it is the only kind that can restore into a service whose container
|
|
2794
|
+
// is gone — or that never deployed.
|
|
2795
|
+
restoreNeedsLiveContainer: false,
|
|
2796
|
+
restoreAppliesAfterBounce: false,
|
|
2797
|
+
restoreTimeoutMs: 6 * HOUR_MS,
|
|
2798
|
+
// Replace: a volume is a single-purpose store, so a merge would leave files this
|
|
2799
|
+
// artifact never held.
|
|
2800
|
+
restoreClearsTargetByDefault: true,
|
|
2801
|
+
// Clear-then-extract, and the clear happens in the helper's PRELUDE — so by the
|
|
2802
|
+
// time any error escapes, the volume is already empty. This is the case the
|
|
2803
|
+
// orchestrator's old inference was built around, and it is still exactly right.
|
|
2804
|
+
restoreFailureLeavesTargetIntact: false,
|
|
2805
|
+
requiresRestoreCommand: false,
|
|
2806
|
+
operatorSelectable: true,
|
|
2807
|
+
configKeys: ["sourceIds", "exclude", "quiesce", "compression"]
|
|
2808
|
+
}
|
|
2809
|
+
};
|
|
2810
|
+
function payloadSpec(kind) {
|
|
2811
|
+
const spec = BACKUP_PAYLOADS[kind];
|
|
2812
|
+
if (!spec) {
|
|
2813
|
+
throw new Error(
|
|
2814
|
+
`Unknown backup payload kind "${kind}". Known kinds: ${PAYLOAD_KINDS.join(", ")}.`
|
|
2815
|
+
);
|
|
2816
|
+
}
|
|
2817
|
+
return spec;
|
|
2818
|
+
}
|
|
2819
|
+
function payloadSpecs() {
|
|
2820
|
+
return PAYLOAD_KINDS.map((k) => BACKUP_PAYLOADS[k]);
|
|
2821
|
+
}
|
|
2822
|
+
function imageDetectableSpecs() {
|
|
2823
|
+
return payloadSpecs().filter(
|
|
2824
|
+
(s) => !!s.images
|
|
2825
|
+
);
|
|
2826
|
+
}
|
|
2827
|
+
var SYSTEM_ROOTS = [
|
|
2828
|
+
"/bin",
|
|
2829
|
+
"/boot",
|
|
2830
|
+
"/dev",
|
|
2831
|
+
"/etc",
|
|
2832
|
+
"/lib",
|
|
2833
|
+
"/lib32",
|
|
2834
|
+
"/lib64",
|
|
2835
|
+
"/libx32",
|
|
2836
|
+
"/proc",
|
|
2837
|
+
"/root",
|
|
2838
|
+
"/run",
|
|
2839
|
+
"/sbin",
|
|
2840
|
+
"/sys",
|
|
2841
|
+
"/usr",
|
|
2842
|
+
"/var"
|
|
2843
|
+
];
|
|
2844
|
+
function normalizeBackupPath(input) {
|
|
2845
|
+
const collapsed = input.trim().replace(/\/{2,}/g, "/");
|
|
2846
|
+
if (collapsed === "/") return "/";
|
|
2847
|
+
return collapsed.replace(/\/+$/, "");
|
|
2848
|
+
}
|
|
2849
|
+
function validateBackupPath(input) {
|
|
2850
|
+
const path = normalizeBackupPath(input);
|
|
2851
|
+
if (path === "") return "A backup path cannot be empty.";
|
|
2852
|
+
if (!path.startsWith("/")) {
|
|
2853
|
+
return `Backup path "${input}" must be absolute \u2014 it is resolved inside the service, where there is no meaningful working directory.`;
|
|
2854
|
+
}
|
|
2855
|
+
if (path.includes("\0")) return `Backup path "${input}" contains a NUL byte.`;
|
|
2856
|
+
if (path.split("/").includes("..")) {
|
|
2857
|
+
return `Backup path "${input}" contains "..". Name the directory you mean directly; a traversal segment would archive somewhere other than what is shown here.`;
|
|
2858
|
+
}
|
|
2859
|
+
if (path === "/") {
|
|
2860
|
+
return "Refusing to archive `/` \u2014 that is the whole filesystem, including /proc and /sys. Name the data directory instead.";
|
|
2861
|
+
}
|
|
2862
|
+
return null;
|
|
2863
|
+
}
|
|
2864
|
+
function validateClearPath(input) {
|
|
2865
|
+
const path = normalizeBackupPath(input);
|
|
2866
|
+
const invalid = validateBackupPath(path);
|
|
2867
|
+
if (invalid) return invalid;
|
|
2868
|
+
const segments = path.split("/").filter(Boolean);
|
|
2869
|
+
if (segments.length < 2) {
|
|
2870
|
+
return `Refusing to clear "${path}" before restoring: it is a top-level directory. Name a subdirectory, or leave clearing off so the restore extracts over the existing files.`;
|
|
2871
|
+
}
|
|
2872
|
+
const top = `/${segments[0]}`;
|
|
2873
|
+
if (SYSTEM_ROOTS.includes(top)) {
|
|
2874
|
+
return `Refusing to clear "${path}" before restoring: it is inside ${top}, which holds the operating system rather than your data. Leave clearing off, or restore into a path you own.`;
|
|
2875
|
+
}
|
|
2876
|
+
return null;
|
|
2877
|
+
}
|
|
2878
|
+
|
|
2879
|
+
// ../../packages/core/src/backup-image-detect.ts
|
|
2880
|
+
var escapeRe = (n) => n.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
2881
|
+
function matcherFor(names, namespaces = []) {
|
|
2882
|
+
const exact = `^(?:${names.map(escapeRe).join("|")})(?::|$)`;
|
|
2883
|
+
if (namespaces.length === 0) return new RegExp(exact, "i");
|
|
2884
|
+
return new RegExp(`${exact}|^(?:${namespaces.map(escapeRe).join("|")})/`, "i");
|
|
2885
|
+
}
|
|
2886
|
+
var MATCHERS = imageDetectableSpecs().map(
|
|
2887
|
+
(spec) => ({
|
|
2888
|
+
re: matcherFor(spec.images.names, spec.images.namespaces),
|
|
2889
|
+
match: { payloadKind: spec.kind, label: spec.label, method: spec.method }
|
|
2890
|
+
})
|
|
2891
|
+
);
|
|
2892
|
+
function normalizeImageRef(image) {
|
|
2893
|
+
let ref = image.trim();
|
|
2894
|
+
const at = ref.indexOf("@");
|
|
2895
|
+
if (at > 0) ref = ref.slice(0, at);
|
|
2896
|
+
const parts = ref.split("/");
|
|
2897
|
+
const first = parts[0] ?? "";
|
|
2898
|
+
if (parts.length > 1 && (first.includes(".") || first.includes(":") || first === "localhost")) {
|
|
2899
|
+
parts.shift();
|
|
2900
|
+
}
|
|
2901
|
+
const library = parts.lastIndexOf("library");
|
|
2902
|
+
if (library >= 0 && library < parts.length - 1) parts.splice(0, library + 1);
|
|
2903
|
+
return parts.join("/");
|
|
2904
|
+
}
|
|
2905
|
+
function detectDbImage(image) {
|
|
2906
|
+
const img = normalizeImageRef(image ?? "");
|
|
2907
|
+
if (!img) return null;
|
|
2908
|
+
for (const { re, match } of MATCHERS) {
|
|
2909
|
+
if (re.test(img)) return match;
|
|
2910
|
+
}
|
|
2911
|
+
return null;
|
|
2912
|
+
}
|
|
2913
|
+
function isDbImage(image, kind) {
|
|
2914
|
+
return detectDbImage(image)?.payloadKind === kind;
|
|
2915
|
+
}
|
|
2916
|
+
|
|
2624
2917
|
// ../../packages/core/src/runtime-config.ts
|
|
2625
2918
|
var DEFAULT_PORT = {
|
|
2626
2919
|
web: 3e3,
|
|
@@ -22928,6 +23221,25 @@ var planLimitsSchema = external_exports.object({
|
|
|
22928
23221
|
* `null` = uncapped (enterprise).
|
|
22929
23222
|
*/
|
|
22930
23223
|
maxResourceTier: external_exports.enum(RESOURCE_TIER_ORDER).nullable(),
|
|
23224
|
+
/**
|
|
23225
|
+
* App runtime included per month, in COMPUTE MINUTES — one minute of a `low`
|
|
23226
|
+
* machine. Bigger machines burn proportionally more (`computeUnitsPerMinute`:
|
|
23227
|
+
* medium 2×, high 4×, xlarge 8×), so one published number covers every size
|
|
23228
|
+
* without quoting a separate allowance per tier of machine.
|
|
23229
|
+
*
|
|
23230
|
+
* This replaced an authored `credits` blob whose numbers meant nothing: 60,000
|
|
23231
|
+
* credits against a 43,200-minute month, on a tier advertising 50 running
|
|
23232
|
+
* services — i.e. not enough to run ONE app around the clock. The unit now has
|
|
23233
|
+
* a definition, and `planMonthlyCredits()` derives the Oblien grant from it.
|
|
23234
|
+
*
|
|
23235
|
+
* `runningServices` is a CONCURRENCY cap, this is the METER. A tier may allow
|
|
23236
|
+
* more always-on apps than its minutes cover; that is what "up to" means and is
|
|
23237
|
+
* how metered compute works everywhere.
|
|
23238
|
+
*
|
|
23239
|
+
* 0 is meaningful and correct for a static-only tier: the edge serves static
|
|
23240
|
+
* sites, `runningServices` is already 0, so no app compute is consumed.
|
|
23241
|
+
*/
|
|
23242
|
+
computeMinutesPerMonth: limitNumber,
|
|
22931
23243
|
buildMinutesPerMonth: limitNumber,
|
|
22932
23244
|
freeSubdomains: limitNumber,
|
|
22933
23245
|
customDomains: limitNumber,
|
|
@@ -22949,10 +23261,6 @@ var planSchema = external_exports.object({
|
|
|
22949
23261
|
support: external_exports.enum(["community", "email", "priority", "dedicated"]),
|
|
22950
23262
|
/** Tier whose features this one builds on — drives the "Everything in X" line. */
|
|
22951
23263
|
inherits: external_exports.string().min(1).optional(),
|
|
22952
|
-
credits: external_exports.object({
|
|
22953
|
-
/** Milli-credits granted per period; null = granted by hand (enterprise). */
|
|
22954
|
-
monthlyMilli: external_exports.number().int().positive().nullable()
|
|
22955
|
-
}),
|
|
22956
23264
|
limits: planLimitsSchema,
|
|
22957
23265
|
/** Copy keys, in display order. Each must exist in `locales/en.json#features`. */
|
|
22958
23266
|
features: external_exports.array(external_exports.string().min(1)).min(1)
|
|
@@ -23025,6 +23333,20 @@ var pricingCatalogSchema = external_exports.object({
|
|
|
23025
23333
|
campaigns: external_exports.array(campaignSchema),
|
|
23026
23334
|
plans: external_exports.array(planSchema).min(1),
|
|
23027
23335
|
creditPacks: external_exports.array(creditPackSchema),
|
|
23336
|
+
/**
|
|
23337
|
+
* Copy for what EVERY cloud tier includes, stated once instead of repeated
|
|
23338
|
+
* down each column.
|
|
23339
|
+
*
|
|
23340
|
+
* This exists because the per-tier lists had become the differentiator, and
|
|
23341
|
+
* they were differentiating on nothing: the audit log, live logs and metrics
|
|
23342
|
+
* are ungated for everyone, so listing them only under Team implied a paywall
|
|
23343
|
+
* that no code enforces. A tier's bullets are now its NUMBERS; anything true
|
|
23344
|
+
* everywhere belongs here.
|
|
23345
|
+
*
|
|
23346
|
+
* Only put a key here that is actually shipped and reachable on cloud — the
|
|
23347
|
+
* defect this block replaces was advertising capability, not describing it.
|
|
23348
|
+
*/
|
|
23349
|
+
standard: external_exports.object({ features: external_exports.array(external_exports.string().min(1)).min(1) }),
|
|
23028
23350
|
selfHosted: external_exports.object({ features: external_exports.array(external_exports.string().min(1)).min(1) })
|
|
23029
23351
|
}).superRefine((data, ctx) => {
|
|
23030
23352
|
if (data.schemaVersion > MAX_SUPPORTED_PRICING_SCHEMA) {
|
|
@@ -23123,7 +23445,13 @@ var pricingCopySchema = external_exports.object({
|
|
|
23123
23445
|
billedMonthly: external_exports.string(),
|
|
23124
23446
|
campaignBadge: external_exports.string(),
|
|
23125
23447
|
campaignEnds: external_exports.string(),
|
|
23126
|
-
wasPrice: external_exports.string()
|
|
23448
|
+
wasPrice: external_exports.string(),
|
|
23449
|
+
/** Heading over the `standard.features` block. Lives here, not in an app
|
|
23450
|
+
* dictionary, because the marketing site has no i18n framework. */
|
|
23451
|
+
standardTitle: external_exports.string(),
|
|
23452
|
+
/** What a top-up pack buys, in recognisable units. Interpolates
|
|
23453
|
+
* `{appHours}` and `{buildMinutes}`, both derived from the catalog. */
|
|
23454
|
+
creditPackNote: external_exports.string()
|
|
23127
23455
|
}).partial().optional()
|
|
23128
23456
|
});
|
|
23129
23457
|
|
|
@@ -23159,9 +23487,6 @@ var pricing_default = {
|
|
|
23159
23487
|
popular: false,
|
|
23160
23488
|
contactSales: null,
|
|
23161
23489
|
support: "community",
|
|
23162
|
-
credits: {
|
|
23163
|
-
monthlyMilli: 5e5
|
|
23164
|
-
},
|
|
23165
23490
|
limits: {
|
|
23166
23491
|
workloads: [
|
|
23167
23492
|
"static"
|
|
@@ -23170,7 +23495,8 @@ var pricing_default = {
|
|
|
23170
23495
|
runningServices: 0,
|
|
23171
23496
|
maxProjects: 3,
|
|
23172
23497
|
maxResourceTier: "low",
|
|
23173
|
-
|
|
23498
|
+
computeMinutesPerMonth: 0,
|
|
23499
|
+
buildMinutesPerMonth: 500,
|
|
23174
23500
|
freeSubdomains: 10,
|
|
23175
23501
|
customDomains: null,
|
|
23176
23502
|
seats: null
|
|
@@ -23178,10 +23504,8 @@ var pricing_default = {
|
|
|
23178
23504
|
features: [
|
|
23179
23505
|
"staticOnly",
|
|
23180
23506
|
"buildMinutes",
|
|
23181
|
-
"freeSubdomains",
|
|
23182
|
-
"customDomains",
|
|
23183
23507
|
"projects",
|
|
23184
|
-
"
|
|
23508
|
+
"freeSubdomains",
|
|
23185
23509
|
"communitySupport"
|
|
23186
23510
|
]
|
|
23187
23511
|
},
|
|
@@ -23199,9 +23523,6 @@ var pricing_default = {
|
|
|
23199
23523
|
contactSales: null,
|
|
23200
23524
|
support: "email",
|
|
23201
23525
|
inherits: "free",
|
|
23202
|
-
credits: {
|
|
23203
|
-
monthlyMilli: 2e6
|
|
23204
|
-
},
|
|
23205
23526
|
limits: {
|
|
23206
23527
|
workloads: [
|
|
23207
23528
|
"static",
|
|
@@ -23210,9 +23531,10 @@ var pricing_default = {
|
|
|
23210
23531
|
],
|
|
23211
23532
|
services: true,
|
|
23212
23533
|
runningServices: 3,
|
|
23213
|
-
maxProjects:
|
|
23534
|
+
maxProjects: 10,
|
|
23214
23535
|
maxResourceTier: "medium",
|
|
23215
|
-
|
|
23536
|
+
computeMinutesPerMonth: 15e4,
|
|
23537
|
+
buildMinutesPerMonth: 3e3,
|
|
23216
23538
|
freeSubdomains: 25,
|
|
23217
23539
|
customDomains: null,
|
|
23218
23540
|
seats: null
|
|
@@ -23220,15 +23542,11 @@ var pricing_default = {
|
|
|
23220
23542
|
features: [
|
|
23221
23543
|
"everythingIn",
|
|
23222
23544
|
"anyWorkload",
|
|
23223
|
-
"managedServices",
|
|
23224
23545
|
"runningServices",
|
|
23546
|
+
"computeMinutes",
|
|
23547
|
+
"buildMinutes",
|
|
23225
23548
|
"power",
|
|
23226
23549
|
"projects",
|
|
23227
|
-
"buildMinutes",
|
|
23228
|
-
"credits",
|
|
23229
|
-
"meteredCredits",
|
|
23230
|
-
"freeSubdomains",
|
|
23231
|
-
"previewDeploys",
|
|
23232
23550
|
"emailSupport"
|
|
23233
23551
|
]
|
|
23234
23552
|
},
|
|
@@ -23246,9 +23564,6 @@ var pricing_default = {
|
|
|
23246
23564
|
contactSales: null,
|
|
23247
23565
|
support: "priority",
|
|
23248
23566
|
inherits: "starter",
|
|
23249
|
-
credits: {
|
|
23250
|
-
monthlyMilli: 1e7
|
|
23251
|
-
},
|
|
23252
23567
|
limits: {
|
|
23253
23568
|
workloads: [
|
|
23254
23569
|
"static",
|
|
@@ -23257,9 +23572,10 @@ var pricing_default = {
|
|
|
23257
23572
|
],
|
|
23258
23573
|
services: true,
|
|
23259
23574
|
runningServices: 10,
|
|
23260
|
-
maxProjects:
|
|
23575
|
+
maxProjects: 50,
|
|
23261
23576
|
maxResourceTier: "high",
|
|
23262
|
-
|
|
23577
|
+
computeMinutesPerMonth: 6e5,
|
|
23578
|
+
buildMinutesPerMonth: 12e3,
|
|
23263
23579
|
freeSubdomains: 100,
|
|
23264
23580
|
customDomains: null,
|
|
23265
23581
|
seats: null
|
|
@@ -23267,15 +23583,10 @@ var pricing_default = {
|
|
|
23267
23583
|
features: [
|
|
23268
23584
|
"everythingIn",
|
|
23269
23585
|
"runningServices",
|
|
23586
|
+
"computeMinutes",
|
|
23587
|
+
"buildMinutes",
|
|
23270
23588
|
"power",
|
|
23271
23589
|
"projects",
|
|
23272
|
-
"buildMinutes",
|
|
23273
|
-
"credits",
|
|
23274
|
-
"meteredCredits",
|
|
23275
|
-
"freeSubdomains",
|
|
23276
|
-
"backups",
|
|
23277
|
-
"observability",
|
|
23278
|
-
"mailServer",
|
|
23279
23590
|
"prioritySupport"
|
|
23280
23591
|
]
|
|
23281
23592
|
},
|
|
@@ -23293,9 +23604,6 @@ var pricing_default = {
|
|
|
23293
23604
|
contactSales: null,
|
|
23294
23605
|
support: "priority",
|
|
23295
23606
|
inherits: "pro",
|
|
23296
|
-
credits: {
|
|
23297
|
-
monthlyMilli: 6e7
|
|
23298
|
-
},
|
|
23299
23607
|
limits: {
|
|
23300
23608
|
workloads: [
|
|
23301
23609
|
"static",
|
|
@@ -23306,7 +23614,8 @@ var pricing_default = {
|
|
|
23306
23614
|
runningServices: 50,
|
|
23307
23615
|
maxProjects: null,
|
|
23308
23616
|
maxResourceTier: "xlarge",
|
|
23309
|
-
|
|
23617
|
+
computeMinutesPerMonth: 22e5,
|
|
23618
|
+
buildMinutesPerMonth: 36e3,
|
|
23310
23619
|
freeSubdomains: null,
|
|
23311
23620
|
customDomains: null,
|
|
23312
23621
|
seats: null
|
|
@@ -23314,14 +23623,11 @@ var pricing_default = {
|
|
|
23314
23623
|
features: [
|
|
23315
23624
|
"everythingIn",
|
|
23316
23625
|
"runningServices",
|
|
23626
|
+
"computeMinutes",
|
|
23627
|
+
"buildMinutes",
|
|
23317
23628
|
"power",
|
|
23318
23629
|
"projectsUnlimited",
|
|
23319
|
-
"buildMinutes",
|
|
23320
|
-
"credits",
|
|
23321
|
-
"meteredCredits",
|
|
23322
23630
|
"freeSubdomainsUnlimited",
|
|
23323
|
-
"auditLog",
|
|
23324
|
-
"sharedChannel",
|
|
23325
23631
|
"prioritySupport"
|
|
23326
23632
|
]
|
|
23327
23633
|
},
|
|
@@ -23339,9 +23645,6 @@ var pricing_default = {
|
|
|
23339
23645
|
contactSales: "mailto:sales@openship.io",
|
|
23340
23646
|
support: "dedicated",
|
|
23341
23647
|
inherits: "team",
|
|
23342
|
-
credits: {
|
|
23343
|
-
monthlyMilli: null
|
|
23344
|
-
},
|
|
23345
23648
|
limits: {
|
|
23346
23649
|
workloads: [
|
|
23347
23650
|
"static",
|
|
@@ -23352,6 +23655,7 @@ var pricing_default = {
|
|
|
23352
23655
|
runningServices: null,
|
|
23353
23656
|
maxProjects: null,
|
|
23354
23657
|
maxResourceTier: null,
|
|
23658
|
+
computeMinutesPerMonth: null,
|
|
23355
23659
|
buildMinutesPerMonth: null,
|
|
23356
23660
|
freeSubdomains: null,
|
|
23357
23661
|
customDomains: null,
|
|
@@ -23390,6 +23694,15 @@ var pricing_default = {
|
|
|
23390
23694
|
sortOrder: 30
|
|
23391
23695
|
}
|
|
23392
23696
|
],
|
|
23697
|
+
standard: {
|
|
23698
|
+
features: [
|
|
23699
|
+
"gitDeploys",
|
|
23700
|
+
"customDomains",
|
|
23701
|
+
"deployLogs",
|
|
23702
|
+
"auditLog",
|
|
23703
|
+
"unlimitedSeats"
|
|
23704
|
+
]
|
|
23705
|
+
},
|
|
23393
23706
|
selfHosted: {
|
|
23394
23707
|
features: [
|
|
23395
23708
|
"selfHostedOpenSource",
|
|
@@ -23429,20 +23742,20 @@ var en_default2 = {
|
|
|
23429
23742
|
features: {
|
|
23430
23743
|
everythingIn: "Everything in {inherited}, plus:",
|
|
23431
23744
|
staticOnly: "Static sites only \u2014 SSG, SPA, and plain HTML",
|
|
23432
|
-
anyWorkload: "Run anything \u2014 containers, Compose
|
|
23433
|
-
|
|
23745
|
+
anyWorkload: "Run anything \u2014 containers, Compose, workers, Postgres, Redis",
|
|
23746
|
+
runningServices: "{runningServices} running apps, databases or workers",
|
|
23747
|
+
computeMinutes: "{computeMinutes} compute minutes per month",
|
|
23434
23748
|
buildMinutes: "{buildMinutes} build minutes per month",
|
|
23435
|
-
|
|
23749
|
+
power: "Up to {powerCpu} vCPU and {powerRamGb} GB RAM per app",
|
|
23750
|
+
projects: "{maxProjects} projects",
|
|
23751
|
+
projectsUnlimited: "Unlimited projects",
|
|
23436
23752
|
freeSubdomains: "{freeSubdomains} free {freeDomainSuffix} subdomains",
|
|
23437
23753
|
freeSubdomainsUnlimited: "Unlimited free {freeDomainSuffix} subdomains",
|
|
23754
|
+
gitDeploys: "Deploy from GitHub, GitLab, or any Git remote",
|
|
23438
23755
|
customDomains: "Unlimited custom domains, TLS included",
|
|
23756
|
+
deployLogs: "Live build and deploy logs",
|
|
23757
|
+
auditLog: "Audit log of every change",
|
|
23439
23758
|
unlimitedSeats: "Unlimited team members \u2014 never pay per seat",
|
|
23440
|
-
previewDeploys: "Preview deploys on every push",
|
|
23441
|
-
backups: "Daily backups with point-in-time recovery",
|
|
23442
|
-
observability: "Live logs, metrics, and health alerts",
|
|
23443
|
-
mailServer: "Built-in mail server \u2014 SMTP, IMAP, and webmail",
|
|
23444
|
-
auditLog: "Audit log with extended retention",
|
|
23445
|
-
sharedChannel: "Shared Slack or Discord channel",
|
|
23446
23759
|
sso: "SSO and SAML",
|
|
23447
23760
|
customLimits: "Custom limits, negotiated per contract",
|
|
23448
23761
|
dedicatedInfra: "Dedicated infrastructure and regions",
|
|
@@ -23455,12 +23768,7 @@ var en_default2 = {
|
|
|
23455
23768
|
selfHostedUnlimited: "Unlimited deploys, projects, servers, and domains",
|
|
23456
23769
|
selfHostedServices: "Every managed service \u2014 Postgres, Redis, mail",
|
|
23457
23770
|
selfHostedClients: "CLI, web, and desktop \u2014 one backend",
|
|
23458
|
-
selfHostedFreeSubdomains: "{freeSubdomains} free {freeDomainSuffix} subdomains when you connect to Cloud"
|
|
23459
|
-
runningServices: "{runningServices} running services \u2014 apps, databases, workers",
|
|
23460
|
-
power: "Up to {powerCpu} vCPU and {powerRamGb} GB RAM per service",
|
|
23461
|
-
projects: "{maxProjects} projects",
|
|
23462
|
-
projectsUnlimited: "Unlimited projects",
|
|
23463
|
-
meteredCredits: "Compute, bandwidth and storage all draw from your monthly credits"
|
|
23771
|
+
selfHostedFreeSubdomains: "{freeSubdomains} free {freeDomainSuffix} subdomains when you connect to Cloud"
|
|
23464
23772
|
},
|
|
23465
23773
|
selfHosted: {
|
|
23466
23774
|
name: "Self-hosted",
|
|
@@ -23470,9 +23778,9 @@ var en_default2 = {
|
|
|
23470
23778
|
cta: "Start self-hosting"
|
|
23471
23779
|
},
|
|
23472
23780
|
creditPacks: {
|
|
23473
|
-
pack_5k: "{
|
|
23474
|
-
pack_25k: "{
|
|
23475
|
-
pack_100k: "{
|
|
23781
|
+
pack_5k: "{computeMinutes} compute minutes",
|
|
23782
|
+
pack_25k: "{computeMinutes} compute minutes",
|
|
23783
|
+
pack_100k: "{computeMinutes} compute minutes"
|
|
23476
23784
|
},
|
|
23477
23785
|
ui: {
|
|
23478
23786
|
perMonth: "/mo",
|
|
@@ -23488,7 +23796,9 @@ var en_default2 = {
|
|
|
23488
23796
|
billedMonthly: "billed monthly, cancel anytime",
|
|
23489
23797
|
campaignBadge: "{percentOff}% off",
|
|
23490
23798
|
campaignEnds: "Offer ends {date}",
|
|
23491
|
-
wasPrice: "was {price}"
|
|
23799
|
+
wasPrice: "was {price}",
|
|
23800
|
+
standardTitle: "In every plan",
|
|
23801
|
+
creditPackNote: "\u2248 {appHours} hours of a small app, or {buildMinutes} build minutes"
|
|
23492
23802
|
}
|
|
23493
23803
|
};
|
|
23494
23804
|
|
|
@@ -23519,20 +23829,20 @@ var ar_default2 = {
|
|
|
23519
23829
|
features: {
|
|
23520
23830
|
everythingIn: "\u0643\u0644 \u0645\u0627 \u0641\u064A \u062E\u0637\u0629 \xAB{inherited}\xBB\u060C \u0628\u0627\u0644\u0625\u0636\u0627\u0641\u0629 \u0625\u0644\u0649:",
|
|
23521
23831
|
staticOnly: "\u0627\u0644\u0645\u0648\u0627\u0642\u0639 \u0627\u0644\u062B\u0627\u0628\u062A\u0629 \u0641\u0642\u0637 \u2014 SSG \u0648SPA \u0648HTML \u0639\u0627\u062F\u064A",
|
|
23522
|
-
anyWorkload: "\u0634\u063A\u0651\u0644 \u0623\u064A \u0634\u064A\u0621 \u2014 \u062D\u0627\u0648\u064A\u0627\u062A \
|
|
23523
|
-
|
|
23832
|
+
anyWorkload: "\u0634\u063A\u0651\u0644 \u0623\u064A \u0634\u064A\u0621 \u2014 \u062D\u0627\u0648\u064A\u0627\u062A \u0648Compose \u0648\u0639\u0645\u0644\u064A\u0627\u062A \u062E\u0644\u0641\u064A\u0629 \u0648Postgres \u0648Redis",
|
|
23833
|
+
runningServices: "{runningServices} \u062A\u0637\u0628\u064A\u0642 \u0623\u0648 \u0642\u0627\u0639\u062F\u0629 \u0628\u064A\u0627\u0646\u0627\u062A \u0623\u0648 \u0639\u0645\u0644\u064A\u0629 \u062E\u0644\u0641\u064A\u0629 \u0642\u064A\u062F \u0627\u0644\u062A\u0634\u063A\u064A\u0644",
|
|
23834
|
+
computeMinutes: "{computeMinutes} \u062F\u0642\u064A\u0642\u0629 \u062D\u0648\u0633\u0628\u0629 \u0634\u0647\u0631\u064A\u064B\u0627",
|
|
23524
23835
|
buildMinutes: "{buildMinutes} \u062F\u0642\u064A\u0642\u0629 \u0628\u0646\u0627\u0621 \u0634\u0647\u0631\u064A\u064B\u0627",
|
|
23525
|
-
|
|
23836
|
+
power: "\u062D\u062A\u0649 {powerCpu} vCPU \u0648{powerRamGb} GB RAM \u0644\u0643\u0644 \u062A\u0637\u0628\u064A\u0642",
|
|
23837
|
+
projects: "{maxProjects} \u0645\u0634\u0631\u0648\u0639",
|
|
23838
|
+
projectsUnlimited: "\u0645\u0634\u0627\u0631\u064A\u0639 \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u0629",
|
|
23526
23839
|
freeSubdomains: "{freeSubdomains} \u0646\u0637\u0627\u0642 \u0641\u0631\u0639\u064A \u0645\u062C\u0627\u0646\u064A \u0639\u0644\u0649 {freeDomainSuffix}",
|
|
23527
23840
|
freeSubdomainsUnlimited: "\u0646\u0637\u0627\u0642\u0627\u062A \u0641\u0631\u0639\u064A\u0629 \u0645\u062C\u0627\u0646\u064A\u0629 \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u0629 \u0639\u0644\u0649 {freeDomainSuffix}",
|
|
23841
|
+
gitDeploys: "\u0627\u0644\u0646\u0634\u0631 \u0645\u0646 GitHub \u0623\u0648 GitLab \u0623\u0648 \u0623\u064A \u0645\u0633\u062A\u0648\u062F\u0639 Git",
|
|
23528
23842
|
customDomains: "\u0646\u0637\u0627\u0642\u0627\u062A \u0645\u062E\u0635\u0651\u0635\u0629 \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u0629\u060C \u0645\u0639 TLS",
|
|
23843
|
+
deployLogs: "\u0633\u062C\u0644\u0627\u062A \u062D\u064A\u0651\u0629 \u0644\u0644\u0628\u0646\u0627\u0621 \u0648\u0627\u0644\u0646\u0634\u0631",
|
|
23844
|
+
auditLog: "\u0633\u062C\u0644 \u062A\u062F\u0642\u064A\u0642 \u0644\u0643\u0644 \u062A\u063A\u064A\u064A\u0631",
|
|
23529
23845
|
unlimitedSeats: "\u0623\u0639\u0636\u0627\u0621 \u0641\u0631\u064A\u0642 \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u064A\u0646 \u2014 \u0628\u0644\u0627 \u0631\u0633\u0648\u0645 \u0639\u0644\u0649 \u0643\u0644 \u0645\u0633\u062A\u062E\u062F\u0645",
|
|
23530
|
-
previewDeploys: "\u0646\u0634\u0631 \u0645\u0639\u0627\u064A\u0646\u0629 \u0639\u0646\u062F \u0643\u0644 \u062F\u0641\u0639 \u0644\u0644\u0643\u0648\u062F",
|
|
23531
|
-
backups: "\u0646\u0633\u062E \u0627\u062D\u062A\u064A\u0627\u0637\u064A \u064A\u0648\u0645\u064A \u0645\u0639 \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0625\u0644\u0649 \u0644\u062D\u0638\u0629 \u0632\u0645\u0646\u064A\u0629 \u0645\u062D\u062F\u0651\u062F\u0629",
|
|
23532
|
-
observability: "\u0633\u062C\u0644\u0627\u062A \u062D\u064A\u0651\u0629 \u0648\u0645\u0642\u0627\u064A\u064A\u0633 \u0648\u062A\u0646\u0628\u064A\u0647\u0627\u062A \u0644\u0635\u062D\u0629 \u0627\u0644\u062E\u062F\u0645\u0629",
|
|
23533
|
-
mailServer: "\u062E\u0627\u062F\u0645 \u0628\u0631\u064A\u062F \u0645\u062F\u0645\u062C \u2014 SMTP \u0648IMAP \u0648\u0628\u0631\u064A\u062F \u0639\u0644\u0649 \u0627\u0644\u0648\u064A\u0628",
|
|
23534
|
-
auditLog: "\u0633\u062C\u0644 \u062A\u062F\u0642\u064A\u0642 \u0628\u0645\u062F\u0629 \u062D\u0641\u0638 \u0645\u0645\u062A\u062F\u0629",
|
|
23535
|
-
sharedChannel: "\u0642\u0646\u0627\u0629 \u0645\u0634\u062A\u0631\u0643\u0629 \u0639\u0644\u0649 Slack \u0623\u0648 Discord",
|
|
23536
23846
|
sso: "SSO \u0648SAML",
|
|
23537
23847
|
customLimits: "\u062D\u062F\u0648\u062F \u0645\u062E\u0635\u0651\u0635\u0629 \u064A\u064F\u062A\u0641\u0642 \u0639\u0644\u064A\u0647\u0627 \u0641\u064A \u0627\u0644\u0639\u0642\u062F",
|
|
23538
23848
|
dedicatedInfra: "\u0628\u0646\u064A\u0629 \u062A\u062D\u062A\u064A\u0629 \u0648\u0645\u0646\u0627\u0637\u0642 \u0645\u062E\u0635\u0651\u0635\u0629",
|
|
@@ -23545,12 +23855,7 @@ var ar_default2 = {
|
|
|
23545
23855
|
selfHostedUnlimited: "\u0639\u0645\u0644\u064A\u0627\u062A \u0646\u0634\u0631 \u0648\u0645\u0634\u0627\u0631\u064A\u0639 \u0648\u062E\u0648\u0627\u062F\u0645 \u0648\u0646\u0637\u0627\u0642\u0627\u062A \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u0629",
|
|
23546
23856
|
selfHostedServices: "\u0643\u0644 \u0627\u0644\u062E\u062F\u0645\u0627\u062A \u0627\u0644\u0645\u064F\u062F\u0627\u0631\u0629 \u2014 Postgres \u0648Redis \u0648\u0627\u0644\u0628\u0631\u064A\u062F",
|
|
23547
23857
|
selfHostedClients: "CLI \u0648\u0648\u0627\u062C\u0647\u0629 \u0648\u064A\u0628 \u0648\u062A\u0637\u0628\u064A\u0642 \u0633\u0637\u062D \u0645\u0643\u062A\u0628 \u2014 \u062E\u062F\u0645\u0629 \u062E\u0644\u0641\u064A\u0629 \u0648\u0627\u062D\u062F\u0629",
|
|
23548
|
-
selfHostedFreeSubdomains: "{freeSubdomains} \u0646\u0637\u0627\u0642 \u0641\u0631\u0639\u064A \u0645\u062C\u0627\u0646\u064A \u0639\u0644\u0649 {freeDomainSuffix} \u0639\u0646\u062F \u0627\u0644\u0631\u0628\u0637 \u0645\u0639 Openship Cloud"
|
|
23549
|
-
runningServices: "{runningServices} \u062E\u062F\u0645\u0629 \u0642\u064A\u062F \u0627\u0644\u062A\u0634\u063A\u064A\u0644 \u2014 \u062A\u0637\u0628\u064A\u0642\u0627\u062A \u0648\u0642\u0648\u0627\u0639\u062F \u0628\u064A\u0627\u0646\u0627\u062A \u0648\u0639\u0645\u0644\u064A\u0627\u062A \u062E\u0644\u0641\u064A\u0629",
|
|
23550
|
-
power: "\u062D\u062A\u0649 {powerCpu} vCPU \u0648{powerRamGb} GB RAM \u0644\u0643\u0644 \u062E\u062F\u0645\u0629",
|
|
23551
|
-
projects: "{maxProjects} \u0645\u0634\u0631\u0648\u0639",
|
|
23552
|
-
projectsUnlimited: "\u0645\u0634\u0627\u0631\u064A\u0639 \u063A\u064A\u0631 \u0645\u062D\u062F\u0648\u062F\u0629",
|
|
23553
|
-
meteredCredits: "\u0627\u0644\u062D\u0648\u0633\u0628\u0629 \u0648\u0627\u0644\u0646\u0637\u0627\u0642 \u0627\u0644\u062A\u0631\u062F\u062F\u064A \u0648\u0627\u0644\u062A\u062E\u0632\u064A\u0646 \u062A\u064F\u062E\u0635\u0645 \u0643\u0644\u0647\u0627 \u0645\u0646 \u0631\u0635\u064A\u062F\u0643 \u0627\u0644\u0634\u0647\u0631\u064A"
|
|
23858
|
+
selfHostedFreeSubdomains: "{freeSubdomains} \u0646\u0637\u0627\u0642 \u0641\u0631\u0639\u064A \u0645\u062C\u0627\u0646\u064A \u0639\u0644\u0649 {freeDomainSuffix} \u0639\u0646\u062F \u0627\u0644\u0631\u0628\u0637 \u0645\u0639 Openship Cloud"
|
|
23554
23859
|
},
|
|
23555
23860
|
selfHosted: {
|
|
23556
23861
|
name: "\u0627\u0633\u062A\u0636\u0627\u0641\u0629 \u0630\u0627\u062A\u064A\u0629",
|
|
@@ -23560,9 +23865,9 @@ var ar_default2 = {
|
|
|
23560
23865
|
cta: "\u0627\u0628\u062F\u0623 \u0627\u0644\u0627\u0633\u062A\u0636\u0627\u0641\u0629 \u0627\u0644\u0630\u0627\u062A\u064A\u0629"
|
|
23561
23866
|
},
|
|
23562
23867
|
creditPacks: {
|
|
23563
|
-
pack_5k: "{
|
|
23564
|
-
pack_25k: "{
|
|
23565
|
-
pack_100k: "{
|
|
23868
|
+
pack_5k: "{computeMinutes} \u062F\u0642\u064A\u0642\u0629 \u062D\u0648\u0633\u0628\u0629",
|
|
23869
|
+
pack_25k: "{computeMinutes} \u062F\u0642\u064A\u0642\u0629 \u062D\u0648\u0633\u0628\u0629",
|
|
23870
|
+
pack_100k: "{computeMinutes} \u062F\u0642\u064A\u0642\u0629 \u062D\u0648\u0633\u0628\u0629"
|
|
23566
23871
|
},
|
|
23567
23872
|
ui: {
|
|
23568
23873
|
perMonth: "/\u0634\u0647\u0631",
|
|
@@ -23578,7 +23883,9 @@ var ar_default2 = {
|
|
|
23578
23883
|
billedMonthly: "\u0641\u0627\u062A\u0648\u0631\u0629 \u0634\u0647\u0631\u064A\u0629\u060C \u0648\u0627\u0644\u0625\u0644\u063A\u0627\u0621 \u0645\u062A\u0627\u062D \u0641\u064A \u0623\u064A \u0648\u0642\u062A",
|
|
23579
23884
|
campaignBadge: "\u062E\u0635\u0645 {percentOff}%",
|
|
23580
23885
|
campaignEnds: "\u064A\u0646\u062A\u0647\u064A \u0627\u0644\u0639\u0631\u0636 \u0641\u064A {date}",
|
|
23581
|
-
wasPrice: "\u0633\u0627\u0628\u0642\u064B\u0627 {price}"
|
|
23886
|
+
wasPrice: "\u0633\u0627\u0628\u0642\u064B\u0627 {price}",
|
|
23887
|
+
standardTitle: "\u0641\u064A \u0643\u0644 \u0627\u0644\u062E\u0637\u0637",
|
|
23888
|
+
creditPackNote: "\u2248 {appHours} \u0633\u0627\u0639\u0629 \u0644\u062A\u0637\u0628\u064A\u0642 \u0635\u063A\u064A\u0631\u060C \u0623\u0648 {buildMinutes} \u062F\u0642\u064A\u0642\u0629 \u0628\u0646\u0627\u0621"
|
|
23582
23889
|
}
|
|
23583
23890
|
};
|
|
23584
23891
|
|
|
@@ -23609,20 +23916,20 @@ var de_default2 = {
|
|
|
23609
23916
|
features: {
|
|
23610
23917
|
everythingIn: "Alles aus {inherited}, plus:",
|
|
23611
23918
|
staticOnly: "Nur statische Websites \u2013 SSG, SPA und reines HTML",
|
|
23612
|
-
anyWorkload: "Beliebige Workloads \u2013 Container, Compose
|
|
23613
|
-
|
|
23919
|
+
anyWorkload: "Beliebige Workloads \u2013 Container, Compose, Worker, Postgres, Redis",
|
|
23920
|
+
runningServices: "{runningServices} laufende Apps, Datenbanken oder Worker",
|
|
23921
|
+
computeMinutes: "{computeMinutes} Compute-Minuten pro Monat",
|
|
23614
23922
|
buildMinutes: "{buildMinutes} Build-Minuten pro Monat",
|
|
23615
|
-
|
|
23923
|
+
power: "Bis zu {powerCpu} vCPU und {powerRamGb} GB RAM pro App",
|
|
23924
|
+
projects: "{maxProjects} Projekte",
|
|
23925
|
+
projectsUnlimited: "Unbegrenzt viele Projekte",
|
|
23616
23926
|
freeSubdomains: "{freeSubdomains} kostenlose Subdomains unter {freeDomainSuffix}",
|
|
23617
23927
|
freeSubdomainsUnlimited: "Unbegrenzt viele kostenlose Subdomains unter {freeDomainSuffix}",
|
|
23928
|
+
gitDeploys: "Deployen von GitHub, GitLab oder jedem Git-Remote",
|
|
23618
23929
|
customDomains: "Unbegrenzt viele eigene Domains, TLS inklusive",
|
|
23930
|
+
deployLogs: "Live-Logs f\xFCr Build und Deployment",
|
|
23931
|
+
auditLog: "Audit-Log f\xFCr jede \xC4nderung",
|
|
23619
23932
|
unlimitedSeats: "Unbegrenzt viele Teammitglieder \u2013 nie Kosten pro Nutzer",
|
|
23620
|
-
previewDeploys: "Preview-Deploys bei jedem Push",
|
|
23621
|
-
backups: "T\xE4gliche Backups mit Point-in-Time-Recovery",
|
|
23622
|
-
observability: "Live-Logs, Metriken und Health-Alerts",
|
|
23623
|
-
mailServer: "Integrierter Mailserver \u2013 SMTP, IMAP und Webmail",
|
|
23624
|
-
auditLog: "Audit-Log mit verl\xE4ngerter Aufbewahrungsdauer",
|
|
23625
|
-
sharedChannel: "Gemeinsamer Slack- oder Discord-Channel",
|
|
23626
23933
|
sso: "SSO und SAML",
|
|
23627
23934
|
customLimits: "Individuelle Limits, vertraglich vereinbart",
|
|
23628
23935
|
dedicatedInfra: "Dedizierte Infrastruktur und Regionen",
|
|
@@ -23635,12 +23942,7 @@ var de_default2 = {
|
|
|
23635
23942
|
selfHostedUnlimited: "Unbegrenzt viele Deploys, Projekte, Server und Domains",
|
|
23636
23943
|
selfHostedServices: "Alle Managed Services \u2013 Postgres, Redis, Mail",
|
|
23637
23944
|
selfHostedClients: "CLI, Web und Desktop \u2013 ein Backend",
|
|
23638
|
-
selfHostedFreeSubdomains: "{freeSubdomains} kostenlose Subdomains unter {freeDomainSuffix} bei Verbindung mit Openship Cloud"
|
|
23639
|
-
runningServices: "{runningServices} laufende Services \u2013 Apps, Datenbanken, Worker",
|
|
23640
|
-
power: "Bis zu {powerCpu} vCPU und {powerRamGb} GB RAM pro Service",
|
|
23641
|
-
projects: "{maxProjects} Projekte",
|
|
23642
|
-
projectsUnlimited: "Unbegrenzt viele Projekte",
|
|
23643
|
-
meteredCredits: "Compute, Daten\xFCbertragung und Speicher werden alle \xFCber die monatlichen Credits abgerechnet"
|
|
23945
|
+
selfHostedFreeSubdomains: "{freeSubdomains} kostenlose Subdomains unter {freeDomainSuffix} bei Verbindung mit Openship Cloud"
|
|
23644
23946
|
},
|
|
23645
23947
|
selfHosted: {
|
|
23646
23948
|
name: "Selbst gehostet",
|
|
@@ -23650,9 +23952,9 @@ var de_default2 = {
|
|
|
23650
23952
|
cta: "Self-Hosting starten"
|
|
23651
23953
|
},
|
|
23652
23954
|
creditPacks: {
|
|
23653
|
-
pack_5k: "{
|
|
23654
|
-
pack_25k: "{
|
|
23655
|
-
pack_100k: "{
|
|
23955
|
+
pack_5k: "{computeMinutes} Compute-Minuten",
|
|
23956
|
+
pack_25k: "{computeMinutes} Compute-Minuten",
|
|
23957
|
+
pack_100k: "{computeMinutes} Compute-Minuten"
|
|
23656
23958
|
},
|
|
23657
23959
|
ui: {
|
|
23658
23960
|
perMonth: "/Mon.",
|
|
@@ -23668,7 +23970,9 @@ var de_default2 = {
|
|
|
23668
23970
|
billedMonthly: "monatliche Abrechnung, jederzeit k\xFCndbar",
|
|
23669
23971
|
campaignBadge: "{percentOff} % Rabatt",
|
|
23670
23972
|
campaignEnds: "Angebot endet am {date}",
|
|
23671
|
-
wasPrice: "vorher {price}"
|
|
23973
|
+
wasPrice: "vorher {price}",
|
|
23974
|
+
standardTitle: "In jedem Plan enthalten",
|
|
23975
|
+
creditPackNote: "\u2248 {appHours} Stunden einer kleinen App oder {buildMinutes} Build-Minuten"
|
|
23672
23976
|
}
|
|
23673
23977
|
};
|
|
23674
23978
|
|
|
@@ -23699,20 +24003,20 @@ var es_default2 = {
|
|
|
23699
24003
|
features: {
|
|
23700
24004
|
everythingIn: "Todo lo de {inherited}, y adem\xE1s:",
|
|
23701
24005
|
staticOnly: "Solo sitios est\xE1ticos: SSG, SPA y HTML puro",
|
|
23702
|
-
anyWorkload: "Ejecuta lo que sea: contenedores,
|
|
23703
|
-
|
|
24006
|
+
anyWorkload: "Ejecuta lo que sea: contenedores, Compose, workers, Postgres, Redis",
|
|
24007
|
+
runningServices: "{runningServices} apps, bases de datos o workers en ejecuci\xF3n",
|
|
24008
|
+
computeMinutes: "{computeMinutes} minutos de c\xF3mputo al mes",
|
|
23704
24009
|
buildMinutes: "{buildMinutes} minutos de build al mes",
|
|
23705
|
-
|
|
24010
|
+
power: "Hasta {powerCpu} vCPU y {powerRamGb} GB de RAM por app",
|
|
24011
|
+
projects: "{maxProjects} proyectos",
|
|
24012
|
+
projectsUnlimited: "Proyectos ilimitados",
|
|
23706
24013
|
freeSubdomains: "{freeSubdomains} subdominios {freeDomainSuffix} gratis",
|
|
23707
24014
|
freeSubdomainsUnlimited: "Subdominios {freeDomainSuffix} gratis e ilimitados",
|
|
24015
|
+
gitDeploys: "Despliega desde GitHub, GitLab o cualquier remoto Git",
|
|
23708
24016
|
customDomains: "Dominios propios ilimitados, con TLS incluido",
|
|
24017
|
+
deployLogs: "Logs en vivo de build y despliegue",
|
|
24018
|
+
auditLog: "Registro de auditor\xEDa de cada cambio",
|
|
23709
24019
|
unlimitedSeats: "Miembros de equipo ilimitados: nunca pagas por usuario",
|
|
23710
|
-
previewDeploys: "Despliegues de vista previa en cada push",
|
|
23711
|
-
backups: "Copias de seguridad diarias con recuperaci\xF3n a un punto en el tiempo",
|
|
23712
|
-
observability: "Logs en vivo, m\xE9tricas y alertas de estado",
|
|
23713
|
-
mailServer: "Servidor de correo integrado: SMTP, IMAP y webmail",
|
|
23714
|
-
auditLog: "Registro de auditor\xEDa con retenci\xF3n ampliada",
|
|
23715
|
-
sharedChannel: "Canal compartido en Slack o Discord",
|
|
23716
24020
|
sso: "SSO y SAML",
|
|
23717
24021
|
customLimits: "L\xEDmites a medida, negociados por contrato",
|
|
23718
24022
|
dedicatedInfra: "Infraestructura y regiones dedicadas",
|
|
@@ -23725,12 +24029,7 @@ var es_default2 = {
|
|
|
23725
24029
|
selfHostedUnlimited: "Despliegues, proyectos, servidores y dominios ilimitados",
|
|
23726
24030
|
selfHostedServices: "Todos los servicios gestionados: Postgres, Redis, correo",
|
|
23727
24031
|
selfHostedClients: "CLI, web y escritorio: un solo backend",
|
|
23728
|
-
selfHostedFreeSubdomains: "{freeSubdomains} subdominios {freeDomainSuffix} gratis al conectarte a Cloud"
|
|
23729
|
-
runningServices: "{runningServices} servicios en ejecuci\xF3n: apps, bases de datos, workers",
|
|
23730
|
-
power: "Hasta {powerCpu} vCPU y {powerRamGb} GB de RAM por servicio",
|
|
23731
|
-
projects: "{maxProjects} proyectos",
|
|
23732
|
-
projectsUnlimited: "Proyectos ilimitados",
|
|
23733
|
-
meteredCredits: "El c\xF3mputo, el ancho de banda y el almacenamiento se descuentan de tus cr\xE9ditos mensuales"
|
|
24032
|
+
selfHostedFreeSubdomains: "{freeSubdomains} subdominios {freeDomainSuffix} gratis al conectarte a Cloud"
|
|
23734
24033
|
},
|
|
23735
24034
|
selfHosted: {
|
|
23736
24035
|
name: "Autoalojado",
|
|
@@ -23740,9 +24039,9 @@ var es_default2 = {
|
|
|
23740
24039
|
cta: "Empezar a autoalojar"
|
|
23741
24040
|
},
|
|
23742
24041
|
creditPacks: {
|
|
23743
|
-
pack_5k: "{
|
|
23744
|
-
pack_25k: "{
|
|
23745
|
-
pack_100k: "{
|
|
24042
|
+
pack_5k: "{computeMinutes} minutos de c\xF3mputo",
|
|
24043
|
+
pack_25k: "{computeMinutes} minutos de c\xF3mputo",
|
|
24044
|
+
pack_100k: "{computeMinutes} minutos de c\xF3mputo"
|
|
23746
24045
|
},
|
|
23747
24046
|
ui: {
|
|
23748
24047
|
perMonth: "/mes",
|
|
@@ -23758,7 +24057,9 @@ var es_default2 = {
|
|
|
23758
24057
|
billedMonthly: "facturaci\xF3n mensual, cancela cuando quieras",
|
|
23759
24058
|
campaignBadge: "{percentOff}% de descuento",
|
|
23760
24059
|
campaignEnds: "La oferta termina el {date}",
|
|
23761
|
-
wasPrice: "antes {price}"
|
|
24060
|
+
wasPrice: "antes {price}",
|
|
24061
|
+
standardTitle: "En todos los planes",
|
|
24062
|
+
creditPackNote: "\u2248 {appHours} horas de una app peque\xF1a, o {buildMinutes} minutos de build"
|
|
23762
24063
|
}
|
|
23763
24064
|
};
|
|
23764
24065
|
|
|
@@ -23789,20 +24090,20 @@ var fr_default2 = {
|
|
|
23789
24090
|
features: {
|
|
23790
24091
|
everythingIn: "Tout ce que contient {inherited}, plus :",
|
|
23791
24092
|
staticOnly: "Sites statiques uniquement \u2014 SSG, SPA et HTML brut",
|
|
23792
|
-
anyWorkload: "Ex\xE9cutez
|
|
23793
|
-
|
|
24093
|
+
anyWorkload: "Ex\xE9cutez tout \u2014 conteneurs, Compose, workers, Postgres, Redis",
|
|
24094
|
+
runningServices: "{runningServices} applications, bases de donn\xE9es ou workers actifs",
|
|
24095
|
+
computeMinutes: "{computeMinutes} minutes de calcul par mois",
|
|
23794
24096
|
buildMinutes: "{buildMinutes} minutes de build par mois",
|
|
23795
|
-
|
|
24097
|
+
power: "Jusqu'\xE0 {powerCpu} vCPU et {powerRamGb} GB de RAM par application",
|
|
24098
|
+
projects: "{maxProjects} projets",
|
|
24099
|
+
projectsUnlimited: "Projets illimit\xE9s",
|
|
23796
24100
|
freeSubdomains: "{freeSubdomains} sous-domaines {freeDomainSuffix} gratuits",
|
|
23797
24101
|
freeSubdomainsUnlimited: "Sous-domaines {freeDomainSuffix} gratuits en illimit\xE9",
|
|
24102
|
+
gitDeploys: "D\xE9ployez depuis GitHub, GitLab ou n'importe quel d\xE9p\xF4t Git",
|
|
23798
24103
|
customDomains: "Domaines personnalis\xE9s illimit\xE9s, TLS inclus",
|
|
24104
|
+
deployLogs: "Logs de build et de d\xE9ploiement en direct",
|
|
24105
|
+
auditLog: "Journal d'audit de chaque modification",
|
|
23799
24106
|
unlimitedSeats: "Membres d'\xE9quipe illimit\xE9s \u2014 jamais de facturation par utilisateur",
|
|
23800
|
-
previewDeploys: "D\xE9ploiements de pr\xE9visualisation \xE0 chaque push",
|
|
23801
|
-
backups: "Sauvegardes quotidiennes avec restauration \xE0 un instant pr\xE9cis",
|
|
23802
|
-
observability: "Logs en direct, m\xE9triques et alertes de sant\xE9",
|
|
23803
|
-
mailServer: "Serveur mail int\xE9gr\xE9 \u2014 SMTP, IMAP et webmail",
|
|
23804
|
-
auditLog: "Journal d'audit avec r\xE9tention \xE9tendue",
|
|
23805
|
-
sharedChannel: "Canal Slack ou Discord partag\xE9",
|
|
23806
24107
|
sso: "SSO et SAML",
|
|
23807
24108
|
customLimits: "Limites sur mesure, n\xE9goci\xE9es par contrat",
|
|
23808
24109
|
dedicatedInfra: "Infrastructure et r\xE9gions d\xE9di\xE9es",
|
|
@@ -23815,12 +24116,7 @@ var fr_default2 = {
|
|
|
23815
24116
|
selfHostedUnlimited: "D\xE9ploiements, projets, serveurs et domaines illimit\xE9s",
|
|
23816
24117
|
selfHostedServices: "Tous les services manag\xE9s \u2014 Postgres, Redis, mail",
|
|
23817
24118
|
selfHostedClients: "CLI, web et desktop \u2014 un seul backend",
|
|
23818
|
-
selfHostedFreeSubdomains: "{freeSubdomains} sous-domaines {freeDomainSuffix} gratuits en vous connectant au Cloud"
|
|
23819
|
-
runningServices: "{runningServices} services actifs \u2014 applications, bases de donn\xE9es, workers",
|
|
23820
|
-
power: "Jusqu'\xE0 {powerCpu} vCPU et {powerRamGb} GB de RAM par service",
|
|
23821
|
-
projects: "{maxProjects} projets",
|
|
23822
|
-
projectsUnlimited: "Projets illimit\xE9s",
|
|
23823
|
-
meteredCredits: "Le calcul, la bande passante et le stockage sont tous d\xE9duits de vos cr\xE9dits mensuels"
|
|
24119
|
+
selfHostedFreeSubdomains: "{freeSubdomains} sous-domaines {freeDomainSuffix} gratuits en vous connectant au Cloud"
|
|
23824
24120
|
},
|
|
23825
24121
|
selfHosted: {
|
|
23826
24122
|
name: "Auto-h\xE9berg\xE9",
|
|
@@ -23830,9 +24126,9 @@ var fr_default2 = {
|
|
|
23830
24126
|
cta: "Commencer l'auto-h\xE9bergement"
|
|
23831
24127
|
},
|
|
23832
24128
|
creditPacks: {
|
|
23833
|
-
pack_5k: "{
|
|
23834
|
-
pack_25k: "{
|
|
23835
|
-
pack_100k: "{
|
|
24129
|
+
pack_5k: "{computeMinutes} minutes de calcul",
|
|
24130
|
+
pack_25k: "{computeMinutes} minutes de calcul",
|
|
24131
|
+
pack_100k: "{computeMinutes} minutes de calcul"
|
|
23836
24132
|
},
|
|
23837
24133
|
ui: {
|
|
23838
24134
|
perMonth: "/mois",
|
|
@@ -23848,7 +24144,9 @@ var fr_default2 = {
|
|
|
23848
24144
|
billedMonthly: "factur\xE9 mensuellement, r\xE9siliable \xE0 tout moment",
|
|
23849
24145
|
campaignBadge: "{percentOff} % de remise",
|
|
23850
24146
|
campaignEnds: "L'offre se termine le {date}",
|
|
23851
|
-
wasPrice: "avant {price}"
|
|
24147
|
+
wasPrice: "avant {price}",
|
|
24148
|
+
standardTitle: "Dans tous les forfaits",
|
|
24149
|
+
creditPackNote: "\u2248 {appHours} heures d'une petite application, ou {buildMinutes} minutes de build"
|
|
23852
24150
|
}
|
|
23853
24151
|
};
|
|
23854
24152
|
|
|
@@ -23879,20 +24177,20 @@ var ja_default2 = {
|
|
|
23879
24177
|
features: {
|
|
23880
24178
|
everythingIn: "{inherited} \u306E\u5168\u6A5F\u80FD\u306B\u52A0\u3048\u3066:",
|
|
23881
24179
|
staticOnly: "\u9759\u7684\u30B5\u30A4\u30C8\u306E\u307F \u2014 SSG\u3001SPA\u3001\u7D20\u306E HTML",
|
|
23882
|
-
anyWorkload: "\u4F55\u3067\u3082\u52D5\u304B\u305B\u308B \u2014 \u30B3\u30F3\u30C6\u30CA\u3001Compose
|
|
23883
|
-
|
|
24180
|
+
anyWorkload: "\u4F55\u3067\u3082\u52D5\u304B\u305B\u308B \u2014 \u30B3\u30F3\u30C6\u30CA\u3001Compose\u3001\u30EF\u30FC\u30AB\u30FC\u3001Postgres\u3001Redis",
|
|
24181
|
+
runningServices: "\u540C\u6642\u306B\u7A3C\u50CD\u3059\u308B\u30A2\u30D7\u30EA\u30FB\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30FB\u30EF\u30FC\u30AB\u30FC {runningServices} \u500B",
|
|
24182
|
+
computeMinutes: "\u6BCE\u6708 {computeMinutes} \u30B3\u30F3\u30D4\u30E5\u30FC\u30C8\u5206",
|
|
23884
24183
|
buildMinutes: "\u6BCE\u6708 {buildMinutes} \u5206\u306E\u30D3\u30EB\u30C9\u6642\u9593",
|
|
23885
|
-
|
|
24184
|
+
power: "\u30A2\u30D7\u30EA 1 \u3064\u3042\u305F\u308A\u6700\u5927 {powerCpu} vCPU \u3068 {powerRamGb} GB RAM",
|
|
24185
|
+
projects: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8 {maxProjects} \u500B",
|
|
24186
|
+
projectsUnlimited: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306F\u7121\u5236\u9650",
|
|
23886
24187
|
freeSubdomains: "\u7121\u6599\u306E {freeDomainSuffix} \u30B5\u30D6\u30C9\u30E1\u30A4\u30F3 {freeSubdomains} \u500B",
|
|
23887
24188
|
freeSubdomainsUnlimited: "\u7121\u6599\u306E {freeDomainSuffix} \u30B5\u30D6\u30C9\u30E1\u30A4\u30F3\u304C\u7121\u5236\u9650",
|
|
24189
|
+
gitDeploys: "GitHub\u3001GitLab\u3001\u4EFB\u610F\u306E Git \u30EA\u30E2\u30FC\u30C8\u304B\u3089\u30C7\u30D7\u30ED\u30A4",
|
|
23888
24190
|
customDomains: "\u30AB\u30B9\u30BF\u30E0\u30C9\u30E1\u30A4\u30F3\u306F\u7121\u5236\u9650\u3001TLS \u8FBC\u307F",
|
|
24191
|
+
deployLogs: "\u30D3\u30EB\u30C9\u3068\u30C7\u30D7\u30ED\u30A4\u306E\u30E9\u30A4\u30D6\u30ED\u30B0",
|
|
24192
|
+
auditLog: "\u3059\u3079\u3066\u306E\u5909\u66F4\u3092\u8A18\u9332\u3059\u308B\u76E3\u67FB\u30ED\u30B0",
|
|
23889
24193
|
unlimitedSeats: "\u30C1\u30FC\u30E0\u30E1\u30F3\u30D0\u30FC\u306F\u7121\u5236\u9650 \u2014 \u4EBA\u6570\u8AB2\u91D1\u306F\u4E00\u5207\u306A\u3057",
|
|
23890
|
-
previewDeploys: "\u30D7\u30C3\u30B7\u30E5\u3054\u3068\u306B\u30D7\u30EC\u30D3\u30E5\u30FC\u30C7\u30D7\u30ED\u30A4",
|
|
23891
|
-
backups: "\u65E5\u6B21\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u3068\u30DD\u30A4\u30F3\u30C8\u30A4\u30F3\u30BF\u30A4\u30E0\u30EA\u30AB\u30D0\u30EA",
|
|
23892
|
-
observability: "\u30E9\u30A4\u30D6\u30ED\u30B0\u3001\u30E1\u30C8\u30EA\u30AF\u30B9\u3001\u30D8\u30EB\u30B9\u30A2\u30E9\u30FC\u30C8",
|
|
23893
|
-
mailServer: "\u30E1\u30FC\u30EB\u30B5\u30FC\u30D0\u30FC\u5185\u8535 \u2014 SMTP\u3001IMAP\u3001\u30A6\u30A7\u30D6\u30E1\u30FC\u30EB",
|
|
23894
|
-
auditLog: "\u4FDD\u6301\u671F\u9593\u3092\u5EF6\u9577\u3057\u305F\u76E3\u67FB\u30ED\u30B0",
|
|
23895
|
-
sharedChannel: "Slack \u307E\u305F\u306F Discord \u306E\u5171\u6709\u30C1\u30E3\u30F3\u30CD\u30EB",
|
|
23896
24194
|
sso: "SSO \u3068 SAML",
|
|
23897
24195
|
customLimits: "\u5951\u7D04\u3054\u3068\u306B\u8ABF\u6574\u3059\u308B\u30AB\u30B9\u30BF\u30E0\u306E\u4E0A\u9650",
|
|
23898
24196
|
dedicatedInfra: "\u5C02\u7528\u30A4\u30F3\u30D5\u30E9\u3068\u5C02\u7528\u30EA\u30FC\u30B8\u30E7\u30F3",
|
|
@@ -23905,12 +24203,7 @@ var ja_default2 = {
|
|
|
23905
24203
|
selfHostedUnlimited: "\u30C7\u30D7\u30ED\u30A4\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3001\u30B5\u30FC\u30D0\u30FC\u3001\u30C9\u30E1\u30A4\u30F3\u3059\u3079\u3066\u7121\u5236\u9650",
|
|
23906
24204
|
selfHostedServices: "\u30DE\u30CD\u30FC\u30B8\u30C9\u30B5\u30FC\u30D3\u30B9\u306F\u3059\u3079\u3066\u5229\u7528\u53EF\u80FD \u2014 Postgres\u3001Redis\u3001\u30E1\u30FC\u30EB",
|
|
23907
24205
|
selfHostedClients: "CLI\u3001Web\u3001\u30C7\u30B9\u30AF\u30C8\u30C3\u30D7 \u2014 \u30D0\u30C3\u30AF\u30A8\u30F3\u30C9\u306F\u4E00\u3064",
|
|
23908
|
-
selfHostedFreeSubdomains: "Openship Cloud \u306B\u63A5\u7D9A\u3059\u308B\u3068\u3001\u7121\u6599\u306E {freeDomainSuffix} \u30B5\u30D6\u30C9\u30E1\u30A4\u30F3\u304C {freeSubdomains} \u500B"
|
|
23909
|
-
runningServices: "\u540C\u6642\u306B\u7A3C\u50CD\u3059\u308B\u30B5\u30FC\u30D3\u30B9 {runningServices} \u500B \u2014 \u30A2\u30D7\u30EA\u3001\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3001\u30EF\u30FC\u30AB\u30FC",
|
|
23910
|
-
power: "\u30B5\u30FC\u30D3\u30B9 1 \u3064\u3042\u305F\u308A\u6700\u5927 {powerCpu} vCPU \u3068 {powerRamGb} GB RAM",
|
|
23911
|
-
projects: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8 {maxProjects} \u500B",
|
|
23912
|
-
projectsUnlimited: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306F\u7121\u5236\u9650",
|
|
23913
|
-
meteredCredits: "\u30B3\u30F3\u30D4\u30E5\u30FC\u30C8\u3001\u5E2F\u57DF\u5E45\u3001\u30B9\u30C8\u30EC\u30FC\u30B8\u306F\u3059\u3079\u3066\u6BCE\u6708\u306E\u30AF\u30EC\u30B8\u30C3\u30C8\u304B\u3089\u6D88\u8CBB\u3055\u308C\u307E\u3059"
|
|
24206
|
+
selfHostedFreeSubdomains: "Openship Cloud \u306B\u63A5\u7D9A\u3059\u308B\u3068\u3001\u7121\u6599\u306E {freeDomainSuffix} \u30B5\u30D6\u30C9\u30E1\u30A4\u30F3\u304C {freeSubdomains} \u500B"
|
|
23914
24207
|
},
|
|
23915
24208
|
selfHosted: {
|
|
23916
24209
|
name: "\u30BB\u30EB\u30D5\u30DB\u30B9\u30C8",
|
|
@@ -23920,9 +24213,9 @@ var ja_default2 = {
|
|
|
23920
24213
|
cta: "\u30BB\u30EB\u30D5\u30DB\u30B9\u30C8\u3092\u59CB\u3081\u308B"
|
|
23921
24214
|
},
|
|
23922
24215
|
creditPacks: {
|
|
23923
|
-
pack_5k: "{
|
|
23924
|
-
pack_25k: "{
|
|
23925
|
-
pack_100k: "{
|
|
24216
|
+
pack_5k: "{computeMinutes} \u30B3\u30F3\u30D4\u30E5\u30FC\u30C8\u5206",
|
|
24217
|
+
pack_25k: "{computeMinutes} \u30B3\u30F3\u30D4\u30E5\u30FC\u30C8\u5206",
|
|
24218
|
+
pack_100k: "{computeMinutes} \u30B3\u30F3\u30D4\u30E5\u30FC\u30C8\u5206"
|
|
23926
24219
|
},
|
|
23927
24220
|
ui: {
|
|
23928
24221
|
perMonth: "/\u6708",
|
|
@@ -23938,7 +24231,9 @@ var ja_default2 = {
|
|
|
23938
24231
|
billedMonthly: "\u6708\u984D\u8ACB\u6C42\u3001\u3044\u3064\u3067\u3082\u30AD\u30E3\u30F3\u30BB\u30EB\u53EF\u80FD",
|
|
23939
24232
|
campaignBadge: "{percentOff}% \u30AA\u30D5",
|
|
23940
24233
|
campaignEnds: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306F {date} \u307E\u3067",
|
|
23941
|
-
wasPrice: "\u901A\u5E38 {price}"
|
|
24234
|
+
wasPrice: "\u901A\u5E38 {price}",
|
|
24235
|
+
standardTitle: "\u3059\u3079\u3066\u306E\u30D7\u30E9\u30F3\u306B\u542B\u307E\u308C\u308B\u3082\u306E",
|
|
24236
|
+
creditPackNote: "\u5C0F\u898F\u6A21\u30A2\u30D7\u30EA\u7D04 {appHours} \u6642\u9593\u3001\u307E\u305F\u306F\u30D3\u30EB\u30C9 {buildMinutes} \u5206"
|
|
23942
24237
|
}
|
|
23943
24238
|
};
|
|
23944
24239
|
|
|
@@ -23969,20 +24264,20 @@ var pt_default2 = {
|
|
|
23969
24264
|
features: {
|
|
23970
24265
|
everythingIn: "Tudo do {inherited}, e mais:",
|
|
23971
24266
|
staticOnly: "Somente sites est\xE1ticos: SSG, SPA e HTML puro",
|
|
23972
|
-
anyWorkload: "Execute qualquer coisa: cont\xEAineres,
|
|
23973
|
-
|
|
24267
|
+
anyWorkload: "Execute qualquer coisa: cont\xEAineres, Compose, workers, Postgres, Redis",
|
|
24268
|
+
runningServices: "{runningServices} apps, bancos de dados ou workers em execu\xE7\xE3o",
|
|
24269
|
+
computeMinutes: "{computeMinutes} minutos de computa\xE7\xE3o por m\xEAs",
|
|
23974
24270
|
buildMinutes: "{buildMinutes} minutos de build por m\xEAs",
|
|
23975
|
-
|
|
24271
|
+
power: "At\xE9 {powerCpu} vCPU e {powerRamGb} GB de RAM por app",
|
|
24272
|
+
projects: "{maxProjects} projetos",
|
|
24273
|
+
projectsUnlimited: "Projetos ilimitados",
|
|
23976
24274
|
freeSubdomains: "{freeSubdomains} subdom\xEDnios {freeDomainSuffix} gratuitos",
|
|
23977
24275
|
freeSubdomainsUnlimited: "Subdom\xEDnios {freeDomainSuffix} gratuitos e ilimitados",
|
|
24276
|
+
gitDeploys: "Fa\xE7a deploy do GitHub, GitLab ou qualquer remoto Git",
|
|
23978
24277
|
customDomains: "Dom\xEDnios pr\xF3prios ilimitados, com TLS inclu\xEDdo",
|
|
24278
|
+
deployLogs: "Logs de build e deploy em tempo real",
|
|
24279
|
+
auditLog: "Log de auditoria de cada altera\xE7\xE3o",
|
|
23979
24280
|
unlimitedSeats: "Membros de equipe ilimitados: nunca pague por usu\xE1rio",
|
|
23980
|
-
previewDeploys: "Deploys de pr\xE9-visualiza\xE7\xE3o a cada push",
|
|
23981
|
-
backups: "Backups di\xE1rios com recupera\xE7\xE3o para um ponto no tempo",
|
|
23982
|
-
observability: "Logs em tempo real, m\xE9tricas e alertas de sa\xFAde",
|
|
23983
|
-
mailServer: "Servidor de e-mail integrado: SMTP, IMAP e webmail",
|
|
23984
|
-
auditLog: "Log de auditoria com reten\xE7\xE3o estendida",
|
|
23985
|
-
sharedChannel: "Canal compartilhado no Slack ou Discord",
|
|
23986
24281
|
sso: "SSO e SAML",
|
|
23987
24282
|
customLimits: "Limites sob medida, negociados por contrato",
|
|
23988
24283
|
dedicatedInfra: "Infraestrutura e regi\xF5es dedicadas",
|
|
@@ -23995,12 +24290,7 @@ var pt_default2 = {
|
|
|
23995
24290
|
selfHostedUnlimited: "Deploys, projetos, servidores e dom\xEDnios ilimitados",
|
|
23996
24291
|
selfHostedServices: "Todos os servi\xE7os gerenciados: Postgres, Redis, e-mail",
|
|
23997
24292
|
selfHostedClients: "CLI, web e desktop: um \xFAnico backend",
|
|
23998
|
-
selfHostedFreeSubdomains: "{freeSubdomains} subdom\xEDnios {freeDomainSuffix} gratuitos ao conectar \xE0 Cloud"
|
|
23999
|
-
runningServices: "{runningServices} servi\xE7os em execu\xE7\xE3o: apps, bancos de dados, workers",
|
|
24000
|
-
power: "At\xE9 {powerCpu} vCPU e {powerRamGb} GB de RAM por servi\xE7o",
|
|
24001
|
-
projects: "{maxProjects} projetos",
|
|
24002
|
-
projectsUnlimited: "Projetos ilimitados",
|
|
24003
|
-
meteredCredits: "Computa\xE7\xE3o, largura de banda e armazenamento consomem os seus cr\xE9ditos mensais"
|
|
24293
|
+
selfHostedFreeSubdomains: "{freeSubdomains} subdom\xEDnios {freeDomainSuffix} gratuitos ao conectar \xE0 Cloud"
|
|
24004
24294
|
},
|
|
24005
24295
|
selfHosted: {
|
|
24006
24296
|
name: "Auto-hospedado",
|
|
@@ -24010,9 +24300,9 @@ var pt_default2 = {
|
|
|
24010
24300
|
cta: "Come\xE7ar a auto-hospedar"
|
|
24011
24301
|
},
|
|
24012
24302
|
creditPacks: {
|
|
24013
|
-
pack_5k: "{
|
|
24014
|
-
pack_25k: "{
|
|
24015
|
-
pack_100k: "{
|
|
24303
|
+
pack_5k: "{computeMinutes} minutos de computa\xE7\xE3o",
|
|
24304
|
+
pack_25k: "{computeMinutes} minutos de computa\xE7\xE3o",
|
|
24305
|
+
pack_100k: "{computeMinutes} minutos de computa\xE7\xE3o"
|
|
24016
24306
|
},
|
|
24017
24307
|
ui: {
|
|
24018
24308
|
perMonth: "/m\xEAs",
|
|
@@ -24028,7 +24318,9 @@ var pt_default2 = {
|
|
|
24028
24318
|
billedMonthly: "cobran\xE7a mensal, cancele quando quiser",
|
|
24029
24319
|
campaignBadge: "{percentOff}% de desconto",
|
|
24030
24320
|
campaignEnds: "Oferta termina em {date}",
|
|
24031
|
-
wasPrice: "antes {price}"
|
|
24321
|
+
wasPrice: "antes {price}",
|
|
24322
|
+
standardTitle: "Em todos os planos",
|
|
24323
|
+
creditPackNote: "\u2248 {appHours} horas de um app pequeno, ou {buildMinutes} minutos de build"
|
|
24032
24324
|
}
|
|
24033
24325
|
};
|
|
24034
24326
|
|
|
@@ -24059,20 +24351,20 @@ var tr_default2 = {
|
|
|
24059
24351
|
features: {
|
|
24060
24352
|
everythingIn: "{inherited} plan\u0131ndaki her \u015Fey, ayr\u0131ca:",
|
|
24061
24353
|
staticOnly: "Yaln\u0131zca statik siteler \u2014 SSG, SPA ve d\xFCz HTML",
|
|
24062
|
-
anyWorkload: "Her \u015Feyi \xE7al\u0131\u015Ft\u0131r\u0131n \u2014 container
|
|
24063
|
-
|
|
24354
|
+
anyWorkload: "Her \u015Feyi \xE7al\u0131\u015Ft\u0131r\u0131n \u2014 container, Compose, worker, Postgres, Redis",
|
|
24355
|
+
runningServices: "{runningServices} \xE7al\u0131\u015Fan uygulama, veritaban\u0131 veya worker",
|
|
24356
|
+
computeMinutes: "Ayda {computeMinutes} hesaplama dakikas\u0131",
|
|
24064
24357
|
buildMinutes: "Ayda {buildMinutes} build dakikas\u0131",
|
|
24065
|
-
|
|
24358
|
+
power: "Uygulama ba\u015F\u0131na en fazla {powerCpu} vCPU ve {powerRamGb} GB RAM",
|
|
24359
|
+
projects: "{maxProjects} proje",
|
|
24360
|
+
projectsUnlimited: "S\u0131n\u0131rs\u0131z proje",
|
|
24066
24361
|
freeSubdomains: "{freeSubdomains} \xFCcretsiz {freeDomainSuffix} alt alan ad\u0131",
|
|
24067
24362
|
freeSubdomainsUnlimited: "S\u0131n\u0131rs\u0131z \xFCcretsiz {freeDomainSuffix} alt alan ad\u0131",
|
|
24363
|
+
gitDeploys: "GitHub, GitLab veya herhangi bir Git uzak deposundan da\u011F\u0131t\u0131n",
|
|
24068
24364
|
customDomains: "S\u0131n\u0131rs\u0131z \xF6zel alan ad\u0131, TLS dahil",
|
|
24365
|
+
deployLogs: "Canl\u0131 derleme ve da\u011F\u0131t\u0131m loglar\u0131",
|
|
24366
|
+
auditLog: "Her de\u011Fi\u015Fikli\u011Fin denetim kayd\u0131",
|
|
24069
24367
|
unlimitedSeats: "S\u0131n\u0131rs\u0131z ekip \xFCyesi \u2014 kullan\u0131c\u0131 ba\u015F\u0131na \xF6deme yok",
|
|
24070
|
-
previewDeploys: "Her push'ta \xF6nizleme da\u011F\u0131t\u0131m\u0131",
|
|
24071
|
-
backups: "G\xFCnl\xFCk yedekler ve belirli bir ana geri d\xF6n\xFC\u015F",
|
|
24072
|
-
observability: "Canl\u0131 loglar, metrikler ve sa\u011Fl\u0131k uyar\u0131lar\u0131",
|
|
24073
|
-
mailServer: "Dahili posta sunucusu \u2014 SMTP, IMAP ve webmail",
|
|
24074
|
-
auditLog: "Denetim kayd\u0131, uzat\u0131lm\u0131\u015F saklama s\xFCresiyle",
|
|
24075
|
-
sharedChannel: "Payla\u015F\u0131ml\u0131 Slack veya Discord kanal\u0131",
|
|
24076
24368
|
sso: "SSO ve SAML",
|
|
24077
24369
|
customLimits: "S\xF6zle\u015Fmeye g\xF6re belirlenen \xF6zel limitler",
|
|
24078
24370
|
dedicatedInfra: "Size ayr\u0131lm\u0131\u015F altyap\u0131 ve b\xF6lgeler",
|
|
@@ -24085,12 +24377,7 @@ var tr_default2 = {
|
|
|
24085
24377
|
selfHostedUnlimited: "S\u0131n\u0131rs\u0131z da\u011F\u0131t\u0131m, proje, sunucu ve alan ad\u0131",
|
|
24086
24378
|
selfHostedServices: "T\xFCm y\xF6netilen servisler \u2014 Postgres, Redis, posta",
|
|
24087
24379
|
selfHostedClients: "CLI, web ve masa\xFCst\xFC \u2014 tek backend",
|
|
24088
|
-
selfHostedFreeSubdomains: "Cloud'a ba\u011Fland\u0131\u011F\u0131n\u0131zda {freeSubdomains} \xFCcretsiz {freeDomainSuffix} alt alan ad\u0131"
|
|
24089
|
-
runningServices: "{runningServices} \xE7al\u0131\u015Fan servis \u2014 uygulamalar, veritabanlar\u0131, worker'lar",
|
|
24090
|
-
power: "Servis ba\u015F\u0131na en fazla {powerCpu} vCPU ve {powerRamGb} GB RAM",
|
|
24091
|
-
projects: "{maxProjects} proje",
|
|
24092
|
-
projectsUnlimited: "S\u0131n\u0131rs\u0131z proje",
|
|
24093
|
-
meteredCredits: "Hesaplama, bant geni\u015Fli\u011Fi ve depolaman\u0131n tamam\u0131 ayl\u0131k kredilerinizden d\xFC\u015Fer"
|
|
24380
|
+
selfHostedFreeSubdomains: "Cloud'a ba\u011Fland\u0131\u011F\u0131n\u0131zda {freeSubdomains} \xFCcretsiz {freeDomainSuffix} alt alan ad\u0131"
|
|
24094
24381
|
},
|
|
24095
24382
|
selfHosted: {
|
|
24096
24383
|
name: "Kendi sunucunuzda",
|
|
@@ -24100,9 +24387,9 @@ var tr_default2 = {
|
|
|
24100
24387
|
cta: "Kendi sunucunuzda ba\u015Flay\u0131n"
|
|
24101
24388
|
},
|
|
24102
24389
|
creditPacks: {
|
|
24103
|
-
pack_5k: "{
|
|
24104
|
-
pack_25k: "{
|
|
24105
|
-
pack_100k: "{
|
|
24390
|
+
pack_5k: "{computeMinutes} hesaplama dakikas\u0131",
|
|
24391
|
+
pack_25k: "{computeMinutes} hesaplama dakikas\u0131",
|
|
24392
|
+
pack_100k: "{computeMinutes} hesaplama dakikas\u0131"
|
|
24106
24393
|
},
|
|
24107
24394
|
ui: {
|
|
24108
24395
|
perMonth: "/ay",
|
|
@@ -24118,7 +24405,9 @@ var tr_default2 = {
|
|
|
24118
24405
|
billedMonthly: "ayl\u0131k faturalan\u0131r, istedi\u011Finiz zaman iptal edin",
|
|
24119
24406
|
campaignBadge: "%{percentOff} indirim",
|
|
24120
24407
|
campaignEnds: "Kampanya {date} tarihinde sona eriyor",
|
|
24121
|
-
wasPrice: "eski fiyat {price}"
|
|
24408
|
+
wasPrice: "eski fiyat {price}",
|
|
24409
|
+
standardTitle: "T\xFCm planlarda",
|
|
24410
|
+
creditPackNote: "\u2248 K\xFC\xE7\xFCk bir uygulama i\xE7in {appHours} saat veya {buildMinutes} derleme dakikas\u0131"
|
|
24122
24411
|
}
|
|
24123
24412
|
};
|
|
24124
24413
|
|
|
@@ -24149,20 +24438,20 @@ var zh_default = {
|
|
|
24149
24438
|
features: {
|
|
24150
24439
|
everythingIn: "\u5305\u542B {inherited} \u7684\u5168\u90E8\u529F\u80FD,\u53E6\u6709:",
|
|
24151
24440
|
staticOnly: "\u4EC5\u652F\u6301\u9759\u6001\u7AD9\u70B9:SSG\u3001SPA \u548C\u7EAF HTML",
|
|
24152
|
-
anyWorkload: "\u4EFB\u610F\u5DE5\u4F5C\u8D1F\u8F7D
|
|
24153
|
-
|
|
24441
|
+
anyWorkload: "\u4EFB\u610F\u5DE5\u4F5C\u8D1F\u8F7D:\u5BB9\u5668\u3001Compose\u3001\u540E\u53F0\u4EFB\u52A1\u3001Postgres\u3001Redis",
|
|
24442
|
+
runningServices: "{runningServices} \u4E2A\u540C\u65F6\u8FD0\u884C\u7684\u5E94\u7528\u3001\u6570\u636E\u5E93\u6216\u540E\u53F0\u4EFB\u52A1",
|
|
24443
|
+
computeMinutes: "\u6BCF\u6708 {computeMinutes} \u8BA1\u7B97\u5206\u949F",
|
|
24154
24444
|
buildMinutes: "\u6BCF\u6708 {buildMinutes} \u5206\u949F\u6784\u5EFA\u65F6\u957F",
|
|
24155
|
-
|
|
24445
|
+
power: "\u6BCF\u4E2A\u5E94\u7528\u6700\u9AD8\u53EF\u8FBE {powerCpu} vCPU \u548C {powerRamGb} GB RAM",
|
|
24446
|
+
projects: "{maxProjects} \u4E2A\u9879\u76EE",
|
|
24447
|
+
projectsUnlimited: "\u9879\u76EE\u4E0D\u9650\u6570\u91CF",
|
|
24156
24448
|
freeSubdomains: "{freeSubdomains} \u4E2A\u514D\u8D39 {freeDomainSuffix} \u5B50\u57DF\u540D",
|
|
24157
24449
|
freeSubdomainsUnlimited: "\u514D\u8D39 {freeDomainSuffix} \u5B50\u57DF\u540D\u4E0D\u9650\u6570\u91CF",
|
|
24450
|
+
gitDeploys: "\u4ECE GitHub\u3001GitLab \u6216\u4EFB\u610F Git \u8FDC\u7AEF\u90E8\u7F72",
|
|
24158
24451
|
customDomains: "\u81EA\u5B9A\u4E49\u57DF\u540D\u4E0D\u9650\u6570\u91CF,\u542B TLS",
|
|
24452
|
+
deployLogs: "\u5B9E\u65F6\u6784\u5EFA\u4E0E\u90E8\u7F72\u65E5\u5FD7",
|
|
24453
|
+
auditLog: "\u8BB0\u5F55\u6BCF\u4E00\u6B21\u53D8\u66F4\u7684\u5BA1\u8BA1\u65E5\u5FD7",
|
|
24159
24454
|
unlimitedSeats: "\u56E2\u961F\u6210\u5458\u4E0D\u9650\u4EBA\u6570,\u6C38\u4E0D\u6309\u5E2D\u4F4D\u8BA1\u8D39",
|
|
24160
|
-
previewDeploys: "\u6BCF\u6B21\u63A8\u9001\u90FD\u751F\u6210\u9884\u89C8\u90E8\u7F72",
|
|
24161
|
-
backups: "\u6BCF\u65E5\u5907\u4EFD,\u652F\u6301\u6309\u65F6\u95F4\u70B9\u6062\u590D",
|
|
24162
|
-
observability: "\u5B9E\u65F6\u65E5\u5FD7\u3001\u6307\u6807\u548C\u5065\u5EB7\u544A\u8B66",
|
|
24163
|
-
mailServer: "\u5185\u7F6E\u90AE\u4EF6\u670D\u52A1\u5668:SMTP\u3001IMAP \u548C\u7F51\u9875\u90AE\u7BB1",
|
|
24164
|
-
auditLog: "\u5BA1\u8BA1\u65E5\u5FD7,\u4FDD\u7559\u671F\u66F4\u957F",
|
|
24165
|
-
sharedChannel: "\u5171\u4EAB\u7684 Slack \u6216 Discord \u9891\u9053",
|
|
24166
24455
|
sso: "SSO \u4E0E SAML",
|
|
24167
24456
|
customLimits: "\u81EA\u5B9A\u4E49\u914D\u989D,\u6309\u5408\u540C\u5546\u5B9A",
|
|
24168
24457
|
dedicatedInfra: "\u4E13\u5C5E\u57FA\u7840\u8BBE\u65BD\u4E0E\u4E13\u5C5E\u533A\u57DF",
|
|
@@ -24175,12 +24464,7 @@ var zh_default = {
|
|
|
24175
24464
|
selfHostedUnlimited: "\u90E8\u7F72\u3001\u9879\u76EE\u3001\u670D\u52A1\u5668\u548C\u57DF\u540D\u5747\u4E0D\u9650\u6570\u91CF",
|
|
24176
24465
|
selfHostedServices: "\u5168\u90E8\u6258\u7BA1\u670D\u52A1:Postgres\u3001Redis\u3001\u90AE\u4EF6\u670D\u52A1",
|
|
24177
24466
|
selfHostedClients: "CLI\u3001\u7F51\u9875\u7AEF\u548C\u684C\u9762\u7AEF,\u5171\u7528\u4E00\u4E2A\u540E\u7AEF",
|
|
24178
|
-
selfHostedFreeSubdomains: "\u8FDE\u63A5 Cloud \u540E\u53EF\u83B7\u5F97 {freeSubdomains} \u4E2A\u514D\u8D39 {freeDomainSuffix} \u5B50\u57DF\u540D"
|
|
24179
|
-
runningServices: "{runningServices} \u4E2A\u540C\u65F6\u8FD0\u884C\u7684\u670D\u52A1:\u5E94\u7528\u3001\u6570\u636E\u5E93\u3001\u540E\u53F0\u4EFB\u52A1",
|
|
24180
|
-
power: "\u6BCF\u4E2A\u670D\u52A1\u6700\u9AD8\u53EF\u8FBE {powerCpu} vCPU \u548C {powerRamGb} GB RAM",
|
|
24181
|
-
projects: "{maxProjects} \u4E2A\u9879\u76EE",
|
|
24182
|
-
projectsUnlimited: "\u9879\u76EE\u4E0D\u9650\u6570\u91CF",
|
|
24183
|
-
meteredCredits: "\u8BA1\u7B97\u3001\u6D41\u91CF\u548C\u5B58\u50A8\u90FD\u4ECE\u4F60\u7684\u6BCF\u6708\u79EF\u5206\u4E2D\u6263\u9664"
|
|
24467
|
+
selfHostedFreeSubdomains: "\u8FDE\u63A5 Cloud \u540E\u53EF\u83B7\u5F97 {freeSubdomains} \u4E2A\u514D\u8D39 {freeDomainSuffix} \u5B50\u57DF\u540D"
|
|
24184
24468
|
},
|
|
24185
24469
|
selfHosted: {
|
|
24186
24470
|
name: "\u81EA\u6258\u7BA1",
|
|
@@ -24190,9 +24474,9 @@ var zh_default = {
|
|
|
24190
24474
|
cta: "\u5F00\u59CB\u81EA\u6258\u7BA1"
|
|
24191
24475
|
},
|
|
24192
24476
|
creditPacks: {
|
|
24193
|
-
pack_5k: "{
|
|
24194
|
-
pack_25k: "{
|
|
24195
|
-
pack_100k: "{
|
|
24477
|
+
pack_5k: "{computeMinutes} \u8BA1\u7B97\u5206\u949F",
|
|
24478
|
+
pack_25k: "{computeMinutes} \u8BA1\u7B97\u5206\u949F",
|
|
24479
|
+
pack_100k: "{computeMinutes} \u8BA1\u7B97\u5206\u949F"
|
|
24196
24480
|
},
|
|
24197
24481
|
ui: {
|
|
24198
24482
|
perMonth: "/\u6708",
|
|
@@ -24208,7 +24492,9 @@ var zh_default = {
|
|
|
24208
24492
|
billedMonthly: "\u6309\u6708\u8BA1\u8D39,\u53EF\u968F\u65F6\u53D6\u6D88",
|
|
24209
24493
|
campaignBadge: "\u7ACB\u51CF {percentOff}%",
|
|
24210
24494
|
campaignEnds: "\u4F18\u60E0\u622A\u6B62 {date}",
|
|
24211
|
-
wasPrice: "\u539F\u4EF7 {price}"
|
|
24495
|
+
wasPrice: "\u539F\u4EF7 {price}",
|
|
24496
|
+
standardTitle: "\u6240\u6709\u5957\u9910\u5747\u5305\u542B",
|
|
24497
|
+
creditPackNote: "\u2248 \u5C0F\u578B\u5E94\u7528\u8FD0\u884C {appHours} \u5C0F\u65F6,\u6216 {buildMinutes} \u6784\u5EFA\u5206\u949F"
|
|
24212
24498
|
}
|
|
24213
24499
|
};
|
|
24214
24500
|
|
|
@@ -24258,6 +24544,17 @@ function featureTemplate(key, locale) {
|
|
|
24258
24544
|
return copyFor(locale).features?.[key] ?? en_default2.features[key] ?? null;
|
|
24259
24545
|
}
|
|
24260
24546
|
var PLAN_BY_ID = new Map(PRICING.plans.map((p) => [p.id, p]));
|
|
24547
|
+
var MILLI_PER_COMPUTE_MINUTE = 1e3;
|
|
24548
|
+
function buildUnitsPerMinute() {
|
|
24549
|
+
return PRICING.oblien.buildResources.cpuCores / RESOURCE_TIER_SPECS.low.cpuCores;
|
|
24550
|
+
}
|
|
24551
|
+
function planMonthlyCredits(planId) {
|
|
24552
|
+
const plan = PLAN_BY_ID.get(planId ?? "") ?? PLAN_BY_ID.get(DEFAULT_PLAN_TIER);
|
|
24553
|
+
const { computeMinutesPerMonth, buildMinutesPerMonth } = plan.limits;
|
|
24554
|
+
if (computeMinutesPerMonth === null || buildMinutesPerMonth === null) return null;
|
|
24555
|
+
const units = computeMinutesPerMonth + buildMinutesPerMonth * buildUnitsPerMinute();
|
|
24556
|
+
return Math.round(units * MILLI_PER_COMPUTE_MINUTE);
|
|
24557
|
+
}
|
|
24261
24558
|
function toOblienLimits(limits) {
|
|
24262
24559
|
const { runningServices, maxResourceTier } = limits;
|
|
24263
24560
|
if (runningServices === null && maxResourceTier === null) return null;
|
|
@@ -24287,11 +24584,12 @@ function placeholders(plan, locale) {
|
|
|
24287
24584
|
powerCpu: svc ? formatDecimal(svc.cpuCores, locale) : unlimited,
|
|
24288
24585
|
powerRamGb: svc ? formatDecimal(svc.memoryMb / 1024, locale) : unlimited,
|
|
24289
24586
|
powerDiskGb: svc ? formatCount(Math.round(svc.diskMb / 1024), locale) : unlimited,
|
|
24290
|
-
|
|
24587
|
+
computeMinutes: n(limits.computeMinutesPerMonth),
|
|
24291
24588
|
inherited: plan.inherits ? planName(plan.inherits, locale) : "",
|
|
24292
24589
|
freeDomainSuffix: PRICING.freeDomainSuffix
|
|
24293
24590
|
};
|
|
24294
24591
|
}
|
|
24592
|
+
var EVERYTHING_IN_KEY = "everythingIn";
|
|
24295
24593
|
function resolvePlan(planId, locale = "en") {
|
|
24296
24594
|
const plan = PLAN_BY_ID.get(planId) ?? PLAN_BY_ID.get(DEFAULT_PLAN_TIER);
|
|
24297
24595
|
const values = placeholders(plan, locale);
|
|
@@ -24300,10 +24598,14 @@ function resolvePlan(planId, locale = "en") {
|
|
|
24300
24598
|
name: planName(plan.id, locale),
|
|
24301
24599
|
description: planTagline(plan.id, locale),
|
|
24302
24600
|
price: plan.price,
|
|
24303
|
-
monthlyCredits: plan.
|
|
24601
|
+
monthlyCredits: planMonthlyCredits(plan.id),
|
|
24304
24602
|
oblienLimits: toOblienLimits(plan.limits),
|
|
24305
24603
|
limits: plan.limits,
|
|
24306
|
-
|
|
24604
|
+
...(() => {
|
|
24605
|
+
const lead = plan.features.includes(EVERYTHING_IN_KEY) ? featureTemplate(EVERYTHING_IN_KEY, locale) : null;
|
|
24606
|
+
return lead === null ? {} : { inheritedFrom: fill(lead, values) };
|
|
24607
|
+
})(),
|
|
24608
|
+
features: plan.features.filter((key) => key !== EVERYTHING_IN_KEY).map((key) => {
|
|
24307
24609
|
const template = featureTemplate(key, locale);
|
|
24308
24610
|
return template === null ? null : fill(template, values);
|
|
24309
24611
|
}).filter((s) => s !== null),
|
|
@@ -24317,10 +24619,17 @@ var PLANS = Object.fromEntries(
|
|
|
24317
24619
|
);
|
|
24318
24620
|
function resolveCreditPacks(locale = "en") {
|
|
24319
24621
|
return [...PRICING.creditPacks].sort((a, b) => a.sortOrder - b.sortOrder).map((pack) => {
|
|
24320
|
-
const template = copyFor(locale).creditPacks?.[pack.id] ?? en_default2.creditPacks[pack.id] ?? "{
|
|
24622
|
+
const template = copyFor(locale).creditPacks?.[pack.id] ?? en_default2.creditPacks[pack.id] ?? "{computeMinutes}";
|
|
24623
|
+
const minutes = pack.creditsMilli / MILLI_PER_COMPUTE_MINUTE;
|
|
24624
|
+
const amount = formatCount(minutes, locale);
|
|
24625
|
+
const noteTemplate = copyFor(locale).ui?.creditPackNote ?? en_default2.ui.creditPackNote;
|
|
24321
24626
|
return {
|
|
24322
24627
|
id: pack.id,
|
|
24323
|
-
name: fill(template, {
|
|
24628
|
+
name: fill(template, { computeMinutes: amount, credits: amount }),
|
|
24629
|
+
explains: fill(noteTemplate, {
|
|
24630
|
+
appHours: formatCount(Math.round(minutes / 60), locale),
|
|
24631
|
+
buildMinutes: formatCount(Math.round(minutes / buildUnitsPerMinute()), locale)
|
|
24632
|
+
}),
|
|
24324
24633
|
credits_milli: pack.creditsMilli,
|
|
24325
24634
|
price_cents: pack.priceCents,
|
|
24326
24635
|
sortOrder: pack.sortOrder
|
|
@@ -24688,6 +24997,13 @@ var AUDIT_EVENTS = {
|
|
|
24688
24997
|
label: "Server removed",
|
|
24689
24998
|
tone: "danger"
|
|
24690
24999
|
},
|
|
25000
|
+
"server.removal.rejected": {
|
|
25001
|
+
category: "servers",
|
|
25002
|
+
action: "tried to remove the server",
|
|
25003
|
+
label: "Server removal refused",
|
|
25004
|
+
tone: "warning",
|
|
25005
|
+
description: "A removal was refused because a workload could not be torn down, or was destroyed but left a resource behind for cleanup. The server row was kept so those resources can still be reclaimed."
|
|
25006
|
+
},
|
|
24691
25007
|
"server.exec": {
|
|
24692
25008
|
category: "servers",
|
|
24693
25009
|
action: "ran a command on the server",
|
|
@@ -25451,108 +25767,18 @@ function idSuffix(distroId) {
|
|
|
25451
25767
|
return distroId ? ` (os-release ID=${JSON.stringify(distroId)})` : "";
|
|
25452
25768
|
}
|
|
25453
25769
|
|
|
25454
|
-
// ../../packages/adapters/src/system/errors.ts
|
|
25455
|
-
var SSH_AUTH_ERROR_PATTERNS = [
|
|
25456
|
-
"All configured authentication methods failed"
|
|
25457
|
-
];
|
|
25458
|
-
var RETRYABLE_CONNECTION_ERROR_PATTERNS = [
|
|
25459
|
-
"ECONNRESET",
|
|
25460
|
-
"ECONNREFUSED",
|
|
25461
|
-
"ETIMEDOUT",
|
|
25462
|
-
"EHOSTUNREACH",
|
|
25463
|
-
"ENETUNREACH",
|
|
25464
|
-
"Timed out",
|
|
25465
|
-
"Not connected",
|
|
25466
|
-
"Connection lost",
|
|
25467
|
-
"read ECONNRESET",
|
|
25468
|
-
"Handshake failed",
|
|
25469
|
-
"keepalive timeout",
|
|
25470
|
-
"SSH connection closed before ready",
|
|
25471
|
-
// ssh2 emits "Channel open failure: open failed" / "Channel open failure: …"
|
|
25472
|
-
// when the SSH SERVER refuses a new channel - typically because the cached
|
|
25473
|
-
// connection has gone half-dead (peer-side LOGOUT, network blip,
|
|
25474
|
-
// remote sshd MaxSessions). The inner SshExecutor retries `exec`/
|
|
25475
|
-
// `streamExec` on this, but `pipeLocal`, `transferIn`, and any other
|
|
25476
|
-
// channel-bearing op bubble it up. Listing it here lets `withExecutor`
|
|
25477
|
-
// drop the dead connection and retry transparently - fixes the
|
|
25478
|
-
// "first redeploy fails, second click works" pattern.
|
|
25479
|
-
"Channel open failure",
|
|
25480
|
-
"open failed"
|
|
25481
|
-
// NOT "socket hang up": it is what an HTTP client reports for ANY far end that vanished
|
|
25482
|
-
// mid-request, including a permission-denied Docker socket and a wedged channel, neither
|
|
25483
|
-
// of which a fresh connection fixes. A match here makes `withExecutor` replay its whole
|
|
25484
|
-
// callback — and those callbacks install mail, create mailboxes and ensure the edge, so a
|
|
25485
|
-
// non-retryable cause becomes a repeated mutation. `core/connectivity.ts` labels it
|
|
25486
|
-
// without retrying, `api/lib/remote-state.ts` still maps it to a 503, and the bridge's
|
|
25487
|
-
// 502 carries the real reason — so leaving it out here costs no diagnosis.
|
|
25488
|
-
];
|
|
25489
|
-
var SshDisconnectedError = class extends Error {
|
|
25490
|
-
constructor(message = "SSH connection lost") {
|
|
25491
|
-
super(message);
|
|
25492
|
-
this.name = "SshDisconnectedError";
|
|
25493
|
-
}
|
|
25494
|
-
};
|
|
25495
|
-
function isSshDisconnectedError(err) {
|
|
25496
|
-
return err instanceof SshDisconnectedError || err instanceof Error && err.name === "SshDisconnectedError";
|
|
25497
|
-
}
|
|
25498
|
-
function isSshAuthError(err) {
|
|
25499
|
-
if (!(err instanceof Error)) return false;
|
|
25500
|
-
return SSH_AUTH_ERROR_PATTERNS.some((pattern) => err.message.includes(pattern));
|
|
25501
|
-
}
|
|
25502
|
-
var HostChannelUnavailableError = class extends Error {
|
|
25503
|
-
code;
|
|
25504
|
-
constructor(code, message) {
|
|
25505
|
-
super(message);
|
|
25506
|
-
this.name = "HostChannelUnavailableError";
|
|
25507
|
-
this.code = code;
|
|
25508
|
-
}
|
|
25509
|
-
};
|
|
25510
|
-
function isRetryableRemoteConnectionError(err) {
|
|
25511
|
-
if (isSshDisconnectedError(err)) return true;
|
|
25512
|
-
if (!(err instanceof Error)) return false;
|
|
25513
|
-
return RETRYABLE_CONNECTION_ERROR_PATTERNS.some(
|
|
25514
|
-
(pattern) => err.message.includes(pattern)
|
|
25515
|
-
);
|
|
25516
|
-
}
|
|
25517
|
-
function isRemoteConnectionError(err) {
|
|
25518
|
-
return isSshAuthError(err) || isRetryableRemoteConnectionError(err);
|
|
25519
|
-
}
|
|
25520
|
-
var MAX_COMMAND_CHARS = 120;
|
|
25521
|
-
function commandForError(command) {
|
|
25522
|
-
const oneLine = command.trim().replace(/\s+/g, " ");
|
|
25523
|
-
return oneLine.length > MAX_COMMAND_CHARS ? `${oneLine.slice(0, MAX_COMMAND_CHARS)}\u2026 (${command.length} chars)` : oneLine;
|
|
25524
|
-
}
|
|
25525
|
-
function isRuntimeNotFoundError(err) {
|
|
25526
|
-
if (!err || typeof err !== "object") return false;
|
|
25527
|
-
const e = err;
|
|
25528
|
-
if (e.statusCode === 404) return true;
|
|
25529
|
-
return typeof e.message === "string" && /no such (container|image|volume|network)/i.test(e.message);
|
|
25530
|
-
}
|
|
25531
|
-
|
|
25532
|
-
// ../../packages/adapters/src/system/debug.ts
|
|
25533
|
-
function isTruthy(value) {
|
|
25534
|
-
if (!value) return false;
|
|
25535
|
-
return ["1", "true", "yes", "on", "debug"].includes(value.toLowerCase());
|
|
25536
|
-
}
|
|
25537
|
-
function isSystemDebugEnabled() {
|
|
25538
|
-
return isTruthy(process.env.SYSTEM_DEBUG_LOGS);
|
|
25539
|
-
}
|
|
25540
|
-
function systemDebug(scope, message) {
|
|
25541
|
-
if (!isSystemDebugEnabled()) return;
|
|
25542
|
-
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
25543
|
-
console.log(`[system-debug] ${timestamp} [${scope}] ${message}`);
|
|
25544
|
-
}
|
|
25545
|
-
function formatDuration(startMs) {
|
|
25546
|
-
return `${Date.now() - startMs}ms`;
|
|
25547
|
-
}
|
|
25548
|
-
|
|
25549
25770
|
export {
|
|
25771
|
+
shellQuote,
|
|
25772
|
+
shellSplitWords,
|
|
25773
|
+
commandToArgv,
|
|
25550
25774
|
LANGUAGES,
|
|
25551
25775
|
STACKS,
|
|
25552
25776
|
TRANSFER_EXCLUDES,
|
|
25553
25777
|
buildOutputTransferExcludes,
|
|
25554
25778
|
PACKAGE_ROOT_ONLY_EXCLUDES,
|
|
25555
25779
|
packageManagerEnsureCommand,
|
|
25780
|
+
nodeBinDirs,
|
|
25781
|
+
nodeBinPathExport,
|
|
25556
25782
|
appVolumeTargets,
|
|
25557
25783
|
parseComposeNamespace,
|
|
25558
25784
|
ownsNetworkEndpoint,
|
|
@@ -25561,9 +25787,6 @@ export {
|
|
|
25561
25787
|
composePortToSpec,
|
|
25562
25788
|
isAwsS3Endpoint,
|
|
25563
25789
|
DEFAULT_IMAGE_REGISTRY,
|
|
25564
|
-
shellQuote,
|
|
25565
|
-
shellSplitWords,
|
|
25566
|
-
commandToArgv,
|
|
25567
25790
|
registryForImage,
|
|
25568
25791
|
registryConfigKeys,
|
|
25569
25792
|
buildEdgeImageRef,
|
|
@@ -25577,6 +25800,11 @@ export {
|
|
|
25577
25800
|
AppError,
|
|
25578
25801
|
DeployError,
|
|
25579
25802
|
safeErrorMessage,
|
|
25803
|
+
payloadSpec,
|
|
25804
|
+
normalizeBackupPath,
|
|
25805
|
+
validateBackupPath,
|
|
25806
|
+
validateClearPath,
|
|
25807
|
+
isDbImage,
|
|
25580
25808
|
LOCAL_DASHBOARD_URL,
|
|
25581
25809
|
LOCAL_API_URL,
|
|
25582
25810
|
CLOUD_DASHBOARD_URL,
|
|
@@ -25622,14 +25850,5 @@ export {
|
|
|
25622
25850
|
summarizeHostChannelCause,
|
|
25623
25851
|
hostChannelRuleScope,
|
|
25624
25852
|
hostFirewallRule,
|
|
25625
|
-
hostFirewallRuleRemoval
|
|
25626
|
-
SshDisconnectedError,
|
|
25627
|
-
isSshAuthError,
|
|
25628
|
-
HostChannelUnavailableError,
|
|
25629
|
-
isRetryableRemoteConnectionError,
|
|
25630
|
-
isRemoteConnectionError,
|
|
25631
|
-
commandForError,
|
|
25632
|
-
isRuntimeNotFoundError,
|
|
25633
|
-
systemDebug,
|
|
25634
|
-
formatDuration
|
|
25853
|
+
hostFirewallRuleRemoval
|
|
25635
25854
|
};
|