@geekmidas/cli 9.0.2 → 10.0.0-alpha.1
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/README.md +66 -122
- package/dist/{CachedStateProvider-BdX7klRc.cjs → CachedStateProvider-BLo7zv7S.cjs} +1 -1
- package/dist/CachedStateProvider-BxoAm-B2.mjs +3 -0
- package/dist/{CachedStateProvider-klLWZXWF.cjs → CachedStateProvider-CqPdW7CB.cjs} +1 -1
- package/dist/{CachedStateProvider-klLWZXWF.cjs.map → CachedStateProvider-CqPdW7CB.cjs.map} +1 -1
- package/dist/{CachedStateProvider-CzyFct42.mjs → CachedStateProvider-DTniehMP.mjs} +1 -1
- package/dist/{CachedStateProvider-CzyFct42.mjs.map → CachedStateProvider-DTniehMP.mjs.map} +1 -1
- package/dist/{HostingerProvider-B2ZYz7Yc.mjs → HostingerProvider-Cft7lEYr.mjs} +4 -3
- package/dist/HostingerProvider-Cft7lEYr.mjs.map +1 -0
- package/dist/{HostingerProvider-CrHfsgz9.cjs → HostingerProvider-h3EbEp-Z.cjs} +4 -3
- package/dist/HostingerProvider-h3EbEp-Z.cjs.map +1 -0
- package/dist/{LocalStateProvider-CP49rjzt.mjs → LocalStateProvider-Bn6tS-oL.mjs} +1 -1
- package/dist/{LocalStateProvider-CP49rjzt.mjs.map → LocalStateProvider-Bn6tS-oL.mjs.map} +1 -1
- package/dist/{LocalStateProvider-CalzNfNA.cjs → LocalStateProvider-Db9SEjyH.cjs} +1 -1
- package/dist/{LocalStateProvider-CalzNfNA.cjs.map → LocalStateProvider-Db9SEjyH.cjs.map} +1 -1
- package/dist/{Route53Provider-tlgBzrRQ.mjs → Route53Provider-RdpUDJQk.mjs} +1 -1
- package/dist/{Route53Provider-tlgBzrRQ.mjs.map → Route53Provider-RdpUDJQk.mjs.map} +1 -1
- package/dist/{Route53Provider-DwgXiLxt.cjs → Route53Provider-di2fMM5N.cjs} +1 -1
- package/dist/{Route53Provider-DwgXiLxt.cjs.map → Route53Provider-di2fMM5N.cjs.map} +1 -1
- package/dist/{SSMStateProvider-BlrTiV5m.mjs → SSMStateProvider-BRt2py-A.mjs} +1 -1
- package/dist/{SSMStateProvider-BlrTiV5m.mjs.map → SSMStateProvider-BRt2py-A.mjs.map} +1 -1
- package/dist/{SSMStateProvider-Bt6r8CTL.cjs → SSMStateProvider-DyX8s9HI.cjs} +1 -1
- package/dist/{SSMStateProvider-Bt6r8CTL.cjs.map → SSMStateProvider-DyX8s9HI.cjs.map} +1 -1
- package/dist/{backup-provisioner-Xunq-p_8.mjs → backup-provisioner-Bgj5Vi_L.mjs} +2 -2
- package/dist/{backup-provisioner-Xunq-p_8.mjs.map → backup-provisioner-Bgj5Vi_L.mjs.map} +1 -1
- package/dist/{backup-provisioner-B3HBN-2k.cjs → backup-provisioner-BrsHwYG0.cjs} +2 -2
- package/dist/{backup-provisioner-B3HBN-2k.cjs.map → backup-provisioner-BrsHwYG0.cjs.map} +1 -1
- package/dist/{bundler-Dufq3uvI.cjs → bundler-BY1OmV1e.cjs} +44 -14
- package/dist/bundler-BY1OmV1e.cjs.map +1 -0
- package/dist/{bundler-DkA4qzUD.mjs → bundler-Be8Zg4Wd.mjs} +45 -15
- package/dist/bundler-Be8Zg4Wd.mjs.map +1 -0
- package/dist/config-D8o6I_7Z.mjs +469 -0
- package/dist/config-D8o6I_7Z.mjs.map +1 -0
- package/dist/config-DbPE1KXF.cjs +535 -0
- package/dist/config-DbPE1KXF.cjs.map +1 -0
- package/dist/config.cjs +3 -2
- package/dist/config.d.cts +2 -2
- package/dist/config.d.cts.map +1 -1
- package/dist/config.d.mts +2 -2
- package/dist/config.d.mts.map +1 -1
- package/dist/config.mjs +3 -2
- package/dist/{credentials-s1kLcIzK.mjs → credentials-B5zRHdAl.mjs} +21 -6
- package/dist/credentials-B5zRHdAl.mjs.map +1 -0
- package/dist/{credentials-C8DWtnMY.cjs → credentials-BapzjyV5.cjs} +26 -5
- package/dist/credentials-BapzjyV5.cjs.map +1 -0
- package/dist/credentials-Dh0Q6HzY.mjs +2548 -0
- package/dist/credentials-Dh0Q6HzY.mjs.map +1 -0
- package/dist/credentials-K961ThG3.cjs +2680 -0
- package/dist/credentials-K961ThG3.cjs.map +1 -0
- package/dist/deploy/sniffer-routes-worker.cjs +6 -2
- package/dist/deploy/sniffer-routes-worker.cjs.map +1 -1
- package/dist/deploy/sniffer-routes-worker.mjs +6 -2
- package/dist/deploy/sniffer-routes-worker.mjs.map +1 -1
- package/dist/discover-CAlFgYec.mjs +229 -0
- package/dist/discover-CAlFgYec.mjs.map +1 -0
- package/dist/discover-DTmFeloL.cjs +271 -0
- package/dist/discover-DTmFeloL.cjs.map +1 -0
- package/dist/dokploy-api-BS2xnJLZ.mjs +3 -0
- package/dist/{dokploy-api-CqOIKHme.cjs → dokploy-api-BsVH0y_s.cjs} +141 -32
- package/dist/dokploy-api-BsVH0y_s.cjs.map +1 -0
- package/dist/dokploy-api-BuxDRo3l.cjs +3 -0
- package/dist/{dokploy-api-sfZFlWuE.mjs → dokploy-api-aTFPz7_4.mjs} +141 -32
- package/dist/dokploy-api-aTFPz7_4.mjs.map +1 -0
- package/dist/emit-CbcRolsa.cjs +236 -0
- package/dist/emit-CbcRolsa.cjs.map +1 -0
- package/dist/emit-CiZS_5Ub.mjs +206 -0
- package/dist/emit-CiZS_5Ub.mjs.map +1 -0
- package/dist/{encryption-MfXAiFTm.cjs → encryption-C6jaU0hE.cjs} +1 -1
- package/dist/{encryption-MfXAiFTm.cjs.map → encryption-C6jaU0hE.cjs.map} +1 -1
- package/dist/{encryption-BVS7Vmzs.cjs → encryption-CHzzeR8a.cjs} +1 -1
- package/dist/encryption-CQUncu7v.mjs +3 -0
- package/dist/{encryption-CO5Q4Bhf.mjs → encryption-D-abyhZx.mjs} +1 -1
- package/dist/{encryption-CO5Q4Bhf.mjs.map → encryption-D-abyhZx.mjs.map} +1 -1
- package/dist/fullstack-secrets-C-GGohke.cjs +111 -0
- package/dist/fullstack-secrets-C-GGohke.cjs.map +1 -0
- package/dist/fullstack-secrets-D1o9-G5l.mjs +87 -0
- package/dist/fullstack-secrets-D1o9-G5l.mjs.map +1 -0
- package/dist/{fullstack-secrets-BYzi6Hwl.cjs → generator-CNzBw7g5.cjs} +1 -114
- package/dist/generator-CNzBw7g5.cjs.map +1 -0
- package/dist/{fullstack-secrets-l8s3II_H.mjs → generator-VE2JrFlY.mjs} +2 -85
- package/dist/generator-VE2JrFlY.mjs.map +1 -0
- package/dist/index-BThUzEIp.d.mts +175 -0
- package/dist/index-BThUzEIp.d.mts.map +1 -0
- package/dist/index-CHB4tSzX.d.cts +175 -0
- package/dist/index-CHB4tSzX.d.cts.map +1 -0
- package/dist/index.cjs +2530 -1810
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +2506 -1786
- package/dist/index.mjs.map +1 -1
- package/dist/{openapi-Cfwi0fqF.mjs → openapi-CgpMWMmM.mjs} +174 -95
- package/dist/openapi-CgpMWMmM.mjs.map +1 -0
- package/dist/{openapi-BzNOC7_i.cjs → openapi-CljONd_M.cjs} +175 -108
- package/dist/openapi-CljONd_M.cjs.map +1 -0
- package/dist/{openapi-react-query-C4iIvpPf.mjs → openapi-react-query-Byltvm_7.mjs} +2 -2
- package/dist/openapi-react-query-Byltvm_7.mjs.map +1 -0
- package/dist/{openapi-react-query-CYWik72n.cjs → openapi-react-query-CmJ1xDbn.cjs} +2 -2
- package/dist/openapi-react-query-CmJ1xDbn.cjs.map +1 -0
- package/dist/openapi-react-query.cjs +1 -1
- package/dist/openapi-react-query.mjs +1 -1
- package/dist/openapi.cjs +4 -3
- package/dist/openapi.d.cts +1 -1
- package/dist/openapi.d.mts +1 -1
- package/dist/openapi.mjs +4 -3
- package/dist/reconcile/public.cjs +9 -0
- package/dist/reconcile/public.d.cts +125 -0
- package/dist/reconcile/public.d.cts.map +1 -0
- package/dist/reconcile/public.d.mts +125 -0
- package/dist/reconcile/public.d.mts.map +1 -0
- package/dist/reconcile/public.mjs +4 -0
- package/dist/{reconcile-B2FoJE0a.mjs → reconcile-CFs8C_1a.mjs} +5 -4
- package/dist/reconcile-CFs8C_1a.mjs.map +1 -0
- package/dist/{reconcile-BzqKJ2Rt.cjs → reconcile-D0pimNiy.cjs} +5 -4
- package/dist/reconcile-D0pimNiy.cjs.map +1 -0
- package/dist/setup-CJiQM2pX.cjs +473 -0
- package/dist/setup-CJiQM2pX.cjs.map +1 -0
- package/dist/setup-DMtU3p41.cjs +11 -0
- package/dist/setup-DOsYueeQ.mjs +443 -0
- package/dist/setup-DOsYueeQ.mjs.map +1 -0
- package/dist/setup-DSutDAlt.mjs +11 -0
- package/dist/{storage-B1wvztiJ.cjs → storage-BJmzYxt8.cjs} +1 -1
- package/dist/{storage-B1wvztiJ.cjs.map → storage-BJmzYxt8.cjs.map} +1 -1
- package/dist/{storage-DOEtT2Hr.cjs → storage-BM9hGpgv.cjs} +1 -1
- package/dist/{storage-dbb9RyBl.mjs → storage-Bi24WfoW.mjs} +1 -1
- package/dist/{storage-dbb9RyBl.mjs.map → storage-Bi24WfoW.mjs.map} +1 -1
- package/dist/{storage-Cs4WBsc4.mjs → storage-CYlGwWTj.mjs} +1 -1
- package/dist/{sync-CSooqRQ8.mjs → sync-CmEuNZsB.mjs} +2 -2
- package/dist/{sync-CSooqRQ8.mjs.map → sync-CmEuNZsB.mjs.map} +1 -1
- package/dist/sync-D306yOWu.cjs +4 -0
- package/dist/{sync-o_CtEbvR.cjs → sync-SizaChmC.cjs} +2 -2
- package/dist/{sync-o_CtEbvR.cjs.map → sync-SizaChmC.cjs.map} +1 -1
- package/dist/{sync-B5UHXwRM.mjs → sync-hOqAWHR6.mjs} +1 -1
- package/dist/{index-Bw548Bta.d.mts → types-C-arnQ1r.d.mts} +590 -143
- package/dist/types-C-arnQ1r.d.mts.map +1 -0
- package/dist/{index-DTpkeFb8.d.cts → types-abJQuk7m.d.cts} +590 -143
- package/dist/types-abJQuk7m.d.cts.map +1 -0
- package/dist/workspace/index.cjs +5 -1
- package/dist/workspace/index.d.cts +3 -3
- package/dist/workspace/index.d.mts +3 -3
- package/dist/workspace/index.mjs +2 -2
- package/dist/{workspace-D-37Ylqo.mjs → workspace-7FqprxuJ.mjs} +117 -30
- package/dist/workspace-7FqprxuJ.mjs.map +1 -0
- package/dist/workspace-8acupeaI.cjs +9 -0
- package/dist/{workspace-CQTT7HJQ.cjs → workspace-XvqO9jIv.cjs} +139 -28
- package/dist/workspace-XvqO9jIv.cjs.map +1 -0
- package/dist/workspace-yP5AHnrn.mjs +8 -0
- package/package.json +26 -9
- package/CHANGELOG.md +0 -650
- package/FUNCTION_CRON_SUPPORT.md +0 -266
- package/dist/CachedStateProvider-GcGziXh1.mjs +0 -3
- package/dist/HostingerProvider-B2ZYz7Yc.mjs.map +0 -1
- package/dist/HostingerProvider-CrHfsgz9.cjs.map +0 -1
- package/dist/bundler-DkA4qzUD.mjs.map +0 -1
- package/dist/bundler-Dufq3uvI.cjs.map +0 -1
- package/dist/config-Bbu1JKvf.mjs +0 -211
- package/dist/config-Bbu1JKvf.mjs.map +0 -1
- package/dist/config-DujV8DbR.cjs +0 -253
- package/dist/config-DujV8DbR.cjs.map +0 -1
- package/dist/credentials-C8DWtnMY.cjs.map +0 -1
- package/dist/credentials-s1kLcIzK.mjs.map +0 -1
- package/dist/dokploy-api-BPYkG-ZZ.cjs +0 -3
- package/dist/dokploy-api-BiSzWM4v.mjs +0 -3
- package/dist/dokploy-api-CqOIKHme.cjs.map +0 -1
- package/dist/dokploy-api-sfZFlWuE.mjs.map +0 -1
- package/dist/encryption-Bd_m4q3g.mjs +0 -3
- package/dist/fullstack-secrets-BYzi6Hwl.cjs.map +0 -1
- package/dist/fullstack-secrets-l8s3II_H.mjs.map +0 -1
- package/dist/index-Bw548Bta.d.mts.map +0 -1
- package/dist/index-DTpkeFb8.d.cts.map +0 -1
- package/dist/openapi-BzNOC7_i.cjs.map +0 -1
- package/dist/openapi-Cfwi0fqF.mjs.map +0 -1
- package/dist/openapi-react-query-C4iIvpPf.mjs.map +0 -1
- package/dist/openapi-react-query-CYWik72n.cjs.map +0 -1
- package/dist/reconcile-B2FoJE0a.mjs.map +0 -1
- package/dist/reconcile-BzqKJ2Rt.cjs.map +0 -1
- package/dist/setup-DDXUXzzl.mjs +0 -765
- package/dist/setup-DDXUXzzl.mjs.map +0 -1
- package/dist/setup-DLwhfyt-.cjs +0 -8
- package/dist/setup-Dh-B7YTX.mjs +0 -8
- package/dist/setup-WZ-xqAQO.cjs +0 -849
- package/dist/setup-WZ-xqAQO.cjs.map +0 -1
- package/dist/sync-BLA94rgC.cjs +0 -4
- package/dist/types-B3GQUg3k.d.mts +0 -280
- package/dist/types-B3GQUg3k.d.mts.map +0 -1
- package/dist/types-BWQDiooe.d.cts +0 -280
- package/dist/types-BWQDiooe.d.cts.map +0 -1
- package/dist/workspace-CQTT7HJQ.cjs.map +0 -1
- package/dist/workspace-D-37Ylqo.mjs.map +0 -1
- package/docs/OPENAPI_TYPESCRIPT_DESIGN.md +0 -408
- package/docs/dev-server-resilience-design.md +0 -189
- package/docs/manifest-refactor-design.md +0 -287
- package/examples/cron-example.ts +0 -45
- package/examples/env.ts +0 -33
- package/examples/function-example.ts +0 -40
- package/examples/gkm.config.json +0 -22
- package/examples/gkm.config.ts +0 -14
- package/examples/gkm.minimal.config.json +0 -7
- package/examples/gkm.production.config.json +0 -27
- package/examples/logger.ts +0 -10
- package/scripts/sync-versions.ts +0 -108
- package/src/__tests__/EndpointGenerator.hooks.spec.ts +0 -204
- package/src/__tests__/config.spec.ts +0 -422
- package/src/__tests__/loadEnvFiles.spec.ts +0 -131
- package/src/__tests__/normalizeHooksConfig.spec.ts +0 -63
- package/src/__tests__/openapi-react-query.spec.ts +0 -506
- package/src/__tests__/openapi.spec.ts +0 -625
- package/src/__tests__/test-helpers.ts +0 -181
- package/src/auth/__tests__/credentials.spec.ts +0 -331
- package/src/auth/__tests__/index.spec.ts +0 -237
- package/src/auth/credentials.ts +0 -286
- package/src/auth/index.ts +0 -233
- package/src/build/__tests__/bundler.spec.ts +0 -446
- package/src/build/__tests__/endpoint-analyzer.spec.ts +0 -623
- package/src/build/__tests__/handler-templates.spec.ts +0 -1287
- package/src/build/__tests__/index-new.spec.ts +0 -550
- package/src/build/__tests__/manifests.spec.ts +0 -583
- package/src/build/__tests__/partitions.spec.ts +0 -110
- package/src/build/__tests__/workspace-build.spec.ts +0 -215
- package/src/build/bundler.ts +0 -256
- package/src/build/endpoint-analyzer.ts +0 -236
- package/src/build/handler-templates.ts +0 -1253
- package/src/build/index.ts +0 -616
- package/src/build/manifests.ts +0 -285
- package/src/build/partitions.ts +0 -58
- package/src/build/providerResolver.ts +0 -184
- package/src/build/types.ts +0 -104
- package/src/config.ts +0 -330
- package/src/credentials/__tests__/fullDockerPorts.spec.ts +0 -144
- package/src/credentials/__tests__/helpers.ts +0 -112
- package/src/credentials/__tests__/prepareEntryCredentials.spec.ts +0 -125
- package/src/credentials/__tests__/readonlyDockerPorts.spec.ts +0 -190
- package/src/credentials/__tests__/workspaceCredentials.spec.ts +0 -209
- package/src/credentials/index.ts +0 -843
- package/src/debug.ts +0 -68
- package/src/deploy/CachedStateProvider.ts +0 -86
- package/src/deploy/LocalStateProvider.ts +0 -57
- package/src/deploy/SSMStateProvider.ts +0 -117
- package/src/deploy/StateProvider.ts +0 -175
- package/src/deploy/__tests__/CachedStateProvider.spec.ts +0 -235
- package/src/deploy/__tests__/HostingerProvider.spec.ts +0 -347
- package/src/deploy/__tests__/LocalStateProvider.spec.ts +0 -130
- package/src/deploy/__tests__/Route53Provider.spec.ts +0 -425
- package/src/deploy/__tests__/SSMStateProvider.spec.ts +0 -201
- package/src/deploy/__tests__/__fixtures__/entry-apps/async-entry.ts +0 -24
- package/src/deploy/__tests__/__fixtures__/entry-apps/nested-config-entry.ts +0 -24
- package/src/deploy/__tests__/__fixtures__/entry-apps/no-env-entry.ts +0 -12
- package/src/deploy/__tests__/__fixtures__/entry-apps/simple-entry.ts +0 -14
- package/src/deploy/__tests__/__fixtures__/entry-apps/throwing-entry.ts +0 -16
- package/src/deploy/__tests__/__fixtures__/env-parsers/non-function-export.ts +0 -10
- package/src/deploy/__tests__/__fixtures__/env-parsers/optional-env-parser.ts +0 -21
- package/src/deploy/__tests__/__fixtures__/env-parsers/parseable-env-parser.ts +0 -18
- package/src/deploy/__tests__/__fixtures__/env-parsers/throwing-env-parser.ts +0 -16
- package/src/deploy/__tests__/__fixtures__/env-parsers/valid-env-parser.ts +0 -16
- package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/auth.ts +0 -16
- package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/health.ts +0 -13
- package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/users.ts +0 -15
- package/src/deploy/__tests__/__fixtures__/route-apps/services.ts +0 -55
- package/src/deploy/__tests__/backup-provisioner.spec.ts +0 -428
- package/src/deploy/__tests__/createDnsProvider.spec.ts +0 -195
- package/src/deploy/__tests__/createStateProvider.spec.ts +0 -126
- package/src/deploy/__tests__/dns-orchestration.spec.ts +0 -192
- package/src/deploy/__tests__/dns-verification.spec.ts +0 -229
- package/src/deploy/__tests__/docker.spec.ts +0 -149
- package/src/deploy/__tests__/dokploy-api.spec.ts +0 -697
- package/src/deploy/__tests__/dokploy.spec.ts +0 -435
- package/src/deploy/__tests__/domain.spec.ts +0 -235
- package/src/deploy/__tests__/env-resolver.spec.ts +0 -903
- package/src/deploy/__tests__/index.spec.ts +0 -1091
- package/src/deploy/__tests__/init.spec.ts +0 -793
- package/src/deploy/__tests__/secrets.spec.ts +0 -303
- package/src/deploy/__tests__/sniffer.spec.ts +0 -838
- package/src/deploy/__tests__/state-e2e.spec.ts +0 -387
- package/src/deploy/__tests__/state.spec.ts +0 -876
- package/src/deploy/__tests__/undeploy.spec.ts +0 -758
- package/src/deploy/backup-provisioner.ts +0 -316
- package/src/deploy/dns/DnsProvider.ts +0 -201
- package/src/deploy/dns/HostingerProvider.ts +0 -174
- package/src/deploy/dns/Route53Provider.ts +0 -340
- package/src/deploy/dns/hostinger-api.ts +0 -261
- package/src/deploy/dns/index.ts +0 -627
- package/src/deploy/docker.ts +0 -260
- package/src/deploy/dokploy-api.ts +0 -1101
- package/src/deploy/dokploy.ts +0 -177
- package/src/deploy/domain.ts +0 -134
- package/src/deploy/env-resolver.ts +0 -305
- package/src/deploy/index.ts +0 -2094
- package/src/deploy/init.ts +0 -427
- package/src/deploy/secrets.ts +0 -187
- package/src/deploy/sniffer-envkit-patch.ts +0 -61
- package/src/deploy/sniffer-hooks.ts +0 -57
- package/src/deploy/sniffer-loader.ts +0 -28
- package/src/deploy/sniffer-routes-worker.ts +0 -104
- package/src/deploy/sniffer-worker.ts +0 -75
- package/src/deploy/sniffer.ts +0 -578
- package/src/deploy/state-commands.ts +0 -274
- package/src/deploy/state.ts +0 -482
- package/src/deploy/types.ts +0 -102
- package/src/deploy/undeploy.ts +0 -407
- package/src/dev/__tests__/entry-integration.spec.ts +0 -347
- package/src/dev/__tests__/entry.spec.ts +0 -144
- package/src/dev/__tests__/index.spec.ts +0 -2084
- package/src/dev/index.ts +0 -1649
- package/src/docker/__tests__/compose.spec.ts +0 -1142
- package/src/docker/__tests__/templates.spec.ts +0 -694
- package/src/docker/compose.ts +0 -808
- package/src/docker/index.ts +0 -523
- package/src/docker/templates.ts +0 -1067
- package/src/exec/index.ts +0 -118
- package/src/generators/CronGenerator.ts +0 -105
- package/src/generators/EndpointGenerator.ts +0 -954
- package/src/generators/FunctionGenerator.ts +0 -117
- package/src/generators/Generator.ts +0 -147
- package/src/generators/OpenApiTsGenerator.ts +0 -821
- package/src/generators/QueueGenerator.ts +0 -245
- package/src/generators/SubscriberGenerator.ts +0 -282
- package/src/generators/TopicGenerator.ts +0 -45
- package/src/generators/__tests__/CronGenerator.spec.ts +0 -445
- package/src/generators/__tests__/EndpointGenerator.spec.ts +0 -544
- package/src/generators/__tests__/FunctionGenerator.spec.ts +0 -256
- package/src/generators/__tests__/Generator.bustCache.spec.ts +0 -72
- package/src/generators/__tests__/OpenApiTsGenerator.registry.spec.ts +0 -98
- package/src/generators/__tests__/OpenApiTsGenerator.responseType.spec.ts +0 -56
- package/src/generators/__tests__/QueueGenerator.spec.ts +0 -141
- package/src/generators/__tests__/SubscriberGenerator.spec.ts +0 -410
- package/src/generators/index.ts +0 -11
- package/src/index.ts +0 -972
- package/src/init/__tests__/generators.spec.ts +0 -1070
- package/src/init/__tests__/init.spec.ts +0 -577
- package/src/init/__tests__/utils.spec.ts +0 -104
- package/src/init/generators/auth.ts +0 -225
- package/src/init/generators/config.ts +0 -316
- package/src/init/generators/docker.ts +0 -388
- package/src/init/generators/env.ts +0 -62
- package/src/init/generators/index.ts +0 -6
- package/src/init/generators/mobile-expo.ts +0 -576
- package/src/init/generators/models.ts +0 -153
- package/src/init/generators/monorepo.ts +0 -475
- package/src/init/generators/package.ts +0 -95
- package/src/init/generators/source.ts +0 -15
- package/src/init/generators/test.ts +0 -178
- package/src/init/generators/ui.ts +0 -1473
- package/src/init/generators/web-tanstack.ts +0 -348
- package/src/init/generators/web.ts +0 -363
- package/src/init/index.ts +0 -542
- package/src/init/templates/api.ts +0 -404
- package/src/init/templates/index.ts +0 -342
- package/src/init/templates/minimal.ts +0 -207
- package/src/init/templates/serverless.ts +0 -148
- package/src/init/templates/worker.ts +0 -216
- package/src/init/utils.ts +0 -197
- package/src/init/versions.ts +0 -52
- package/src/openapi-react-query.ts +0 -288
- package/src/openapi.ts +0 -259
- package/src/secrets/__tests__/encryption.spec.ts +0 -226
- package/src/secrets/__tests__/generator.spec.ts +0 -575
- package/src/secrets/__tests__/index.spec.ts +0 -91
- package/src/secrets/__tests__/reconcile.spec.ts +0 -123
- package/src/secrets/__tests__/storage.spec.ts +0 -645
- package/src/secrets/encryption.ts +0 -91
- package/src/secrets/generator.ts +0 -329
- package/src/secrets/index.ts +0 -417
- package/src/secrets/keystore.ts +0 -144
- package/src/secrets/reconcile.ts +0 -53
- package/src/secrets/storage.ts +0 -337
- package/src/secrets/sync.ts +0 -136
- package/src/secrets/types.ts +0 -70
- package/src/setup/__tests__/auto-setup.spec.ts +0 -147
- package/src/setup/__tests__/reconcile-secrets.spec.ts +0 -439
- package/src/setup/fullstack-secrets.ts +0 -140
- package/src/setup/index.ts +0 -411
- package/src/test/__tests__/__fixtures__/workspace.ts +0 -104
- package/src/test/__tests__/api.spec.ts +0 -199
- package/src/test/__tests__/auth.spec.ts +0 -162
- package/src/test/__tests__/index.spec.ts +0 -502
- package/src/test/__tests__/web.spec.ts +0 -210
- package/src/test/index.ts +0 -198
- package/src/types.ts +0 -363
- package/src/upgrade/__tests__/index.spec.ts +0 -354
- package/src/upgrade/index.ts +0 -253
- package/src/workspace/__tests__/client-generator.spec.ts +0 -326
- package/src/workspace/__tests__/index.spec.ts +0 -766
- package/src/workspace/__tests__/publicEnv.spec.ts +0 -64
- package/src/workspace/__tests__/schema.spec.ts +0 -737
- package/src/workspace/__tests__/type-inference.spec.ts +0 -251
- package/src/workspace/client-generator.ts +0 -109
- package/src/workspace/index.ts +0 -433
- package/src/workspace/publicEnv.ts +0 -57
- package/src/workspace/schema.ts +0 -861
- package/src/workspace/types.ts +0 -943
- package/tsconfig.json +0 -9
- package/tsdown.config.ts +0 -22
|
@@ -1,1101 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Centralized Dokploy API client
|
|
3
|
-
*
|
|
4
|
-
* Handles authentication, error handling, and provides typed methods for all Dokploy API endpoints.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export interface DokployApiOptions {
|
|
8
|
-
/** Dokploy server URL (e.g., https://dokploy.example.com) */
|
|
9
|
-
baseUrl: string;
|
|
10
|
-
/** API token for authentication */
|
|
11
|
-
token: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface DokployErrorResponse {
|
|
15
|
-
message?: string;
|
|
16
|
-
issues?: Array<{ message: string }>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export class DokployApiError extends Error {
|
|
20
|
-
constructor(
|
|
21
|
-
message: string,
|
|
22
|
-
public status: number,
|
|
23
|
-
public statusText: string,
|
|
24
|
-
public issues?: Array<{ message: string }>,
|
|
25
|
-
) {
|
|
26
|
-
super(message);
|
|
27
|
-
this.name = 'DokployApiError';
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Dokploy API client
|
|
33
|
-
*/
|
|
34
|
-
export class DokployApi {
|
|
35
|
-
private baseUrl: string;
|
|
36
|
-
private token: string;
|
|
37
|
-
|
|
38
|
-
constructor(options: DokployApiOptions) {
|
|
39
|
-
this.baseUrl = options.baseUrl.replace(/\/$/, ''); // Remove trailing slash
|
|
40
|
-
this.token = options.token;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Make a GET request to the Dokploy API
|
|
45
|
-
*/
|
|
46
|
-
async get<T>(endpoint: string): Promise<T> {
|
|
47
|
-
return this.request<T>('GET', endpoint);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Make a POST request to the Dokploy API
|
|
52
|
-
*/
|
|
53
|
-
async post<T>(endpoint: string, body?: Record<string, unknown>): Promise<T> {
|
|
54
|
-
return this.request<T>('POST', endpoint, body);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Make a request to the Dokploy API
|
|
59
|
-
*/
|
|
60
|
-
private async request<T>(
|
|
61
|
-
method: 'GET' | 'POST' | 'PUT' | 'DELETE',
|
|
62
|
-
endpoint: string,
|
|
63
|
-
body?: Record<string, unknown>,
|
|
64
|
-
): Promise<T> {
|
|
65
|
-
const url = `${this.baseUrl}/api/${endpoint}`;
|
|
66
|
-
|
|
67
|
-
const response = await fetch(url, {
|
|
68
|
-
method,
|
|
69
|
-
headers: {
|
|
70
|
-
'Content-Type': 'application/json',
|
|
71
|
-
'x-api-key': this.token,
|
|
72
|
-
},
|
|
73
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
if (!response.ok) {
|
|
77
|
-
let errorMessage = `Dokploy API error: ${response.status} ${response.statusText}`;
|
|
78
|
-
let issues: Array<{ message: string }> | undefined;
|
|
79
|
-
|
|
80
|
-
try {
|
|
81
|
-
const errorBody = (await response.json()) as DokployErrorResponse;
|
|
82
|
-
if (errorBody.message) {
|
|
83
|
-
errorMessage = `Dokploy API error: ${errorBody.message}`;
|
|
84
|
-
}
|
|
85
|
-
if (errorBody.issues?.length) {
|
|
86
|
-
issues = errorBody.issues;
|
|
87
|
-
errorMessage += `\n Issues: ${errorBody.issues.map((i) => i.message).join(', ')}`;
|
|
88
|
-
}
|
|
89
|
-
} catch {
|
|
90
|
-
// Ignore JSON parse errors
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
throw new DokployApiError(
|
|
94
|
-
errorMessage,
|
|
95
|
-
response.status,
|
|
96
|
-
response.statusText,
|
|
97
|
-
issues,
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Handle empty responses (204 No Content or empty body)
|
|
102
|
-
const text = await response.text();
|
|
103
|
-
if (!text || text.trim() === '') {
|
|
104
|
-
return undefined as T;
|
|
105
|
-
}
|
|
106
|
-
return JSON.parse(text) as T;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Validate the API token by making a test request
|
|
111
|
-
*/
|
|
112
|
-
async validateToken(): Promise<boolean> {
|
|
113
|
-
try {
|
|
114
|
-
await this.get('project.all');
|
|
115
|
-
return true;
|
|
116
|
-
} catch {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// ============================================
|
|
122
|
-
// Project endpoints
|
|
123
|
-
// ============================================
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* List all projects
|
|
127
|
-
*/
|
|
128
|
-
async listProjects(): Promise<DokployProject[]> {
|
|
129
|
-
return this.get<DokployProject[]>('project.all');
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Get a single project by ID
|
|
134
|
-
*/
|
|
135
|
-
async getProject(projectId: string): Promise<DokployProjectDetails> {
|
|
136
|
-
return this.get<DokployProjectDetails>(
|
|
137
|
-
`project.one?projectId=${projectId}`,
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Create a new project
|
|
143
|
-
*/
|
|
144
|
-
async createProject(
|
|
145
|
-
name: string,
|
|
146
|
-
description?: string,
|
|
147
|
-
): Promise<{ project: DokployProject; environment: DokployEnvironment }> {
|
|
148
|
-
return this.post<{
|
|
149
|
-
project: DokployProject;
|
|
150
|
-
environment: DokployEnvironment;
|
|
151
|
-
}>('project.create', {
|
|
152
|
-
name,
|
|
153
|
-
description: description ?? `Created by gkm CLI`,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Delete a project and all its resources
|
|
159
|
-
*/
|
|
160
|
-
async deleteProject(projectId: string): Promise<void> {
|
|
161
|
-
await this.post('project.remove', { projectId });
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// ============================================
|
|
165
|
-
// Environment endpoints
|
|
166
|
-
// ============================================
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Create an environment in a project
|
|
170
|
-
*/
|
|
171
|
-
async createEnvironment(
|
|
172
|
-
projectId: string,
|
|
173
|
-
name: string,
|
|
174
|
-
description?: string,
|
|
175
|
-
): Promise<DokployEnvironment> {
|
|
176
|
-
return this.post<DokployEnvironment>('environment.create', {
|
|
177
|
-
projectId,
|
|
178
|
-
name,
|
|
179
|
-
description: description ?? `${name} environment`,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// ============================================
|
|
184
|
-
// Application endpoints
|
|
185
|
-
// ============================================
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* List all applications in a project
|
|
189
|
-
*/
|
|
190
|
-
async listApplications(projectId: string): Promise<DokployApplication[]> {
|
|
191
|
-
try {
|
|
192
|
-
return await this.get<DokployApplication[]>(
|
|
193
|
-
`application.all?projectId=${projectId}`,
|
|
194
|
-
);
|
|
195
|
-
} catch {
|
|
196
|
-
// Fallback: endpoint might not exist in older Dokploy versions
|
|
197
|
-
return [];
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Find an application by name in a project
|
|
203
|
-
*/
|
|
204
|
-
async findApplicationByName(
|
|
205
|
-
projectId: string,
|
|
206
|
-
name: string,
|
|
207
|
-
): Promise<DokployApplication | undefined> {
|
|
208
|
-
const applications = await this.listApplications(projectId);
|
|
209
|
-
const normalizedName = name.toLowerCase().replace(/[^a-z0-9-]/g, '-');
|
|
210
|
-
return applications.find(
|
|
211
|
-
(app) => app.name === name || app.appName === normalizedName,
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Create a new application
|
|
217
|
-
*/
|
|
218
|
-
async createApplication(
|
|
219
|
-
name: string,
|
|
220
|
-
projectId: string,
|
|
221
|
-
environmentId: string,
|
|
222
|
-
): Promise<DokployApplication> {
|
|
223
|
-
return this.post<DokployApplication>('application.create', {
|
|
224
|
-
name,
|
|
225
|
-
projectId,
|
|
226
|
-
environmentId,
|
|
227
|
-
appName: name.toLowerCase().replace(/[^a-z0-9-]/g, '-'),
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Find or create an application by name
|
|
233
|
-
*/
|
|
234
|
-
async findOrCreateApplication(
|
|
235
|
-
name: string,
|
|
236
|
-
projectId: string,
|
|
237
|
-
environmentId: string,
|
|
238
|
-
): Promise<{ application: DokployApplication; created: boolean }> {
|
|
239
|
-
const existing = await this.findApplicationByName(projectId, name);
|
|
240
|
-
if (existing) {
|
|
241
|
-
return { application: existing, created: false };
|
|
242
|
-
}
|
|
243
|
-
const application = await this.createApplication(
|
|
244
|
-
name,
|
|
245
|
-
projectId,
|
|
246
|
-
environmentId,
|
|
247
|
-
);
|
|
248
|
-
return { application, created: true };
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Get an application by ID
|
|
253
|
-
*/
|
|
254
|
-
async getApplication(
|
|
255
|
-
applicationId: string,
|
|
256
|
-
): Promise<DokployApplication | null> {
|
|
257
|
-
try {
|
|
258
|
-
return await this.get<DokployApplication>(
|
|
259
|
-
`application.one?applicationId=${applicationId}`,
|
|
260
|
-
);
|
|
261
|
-
} catch {
|
|
262
|
-
// Application not found
|
|
263
|
-
return null;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* Update an application
|
|
269
|
-
*/
|
|
270
|
-
async updateApplication(
|
|
271
|
-
applicationId: string,
|
|
272
|
-
updates: Partial<DokployApplicationUpdate>,
|
|
273
|
-
): Promise<void> {
|
|
274
|
-
await this.post('application.update', {
|
|
275
|
-
applicationId,
|
|
276
|
-
...updates,
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
* Save environment variables for an application
|
|
282
|
-
*/
|
|
283
|
-
async saveApplicationEnv(applicationId: string, env: string): Promise<void> {
|
|
284
|
-
await this.post('application.saveEnvironment', {
|
|
285
|
-
applicationId,
|
|
286
|
-
env,
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Configure application to use Docker provider (pull from registry)
|
|
292
|
-
*
|
|
293
|
-
* For private registries, either:
|
|
294
|
-
* - Use `registryId` if the registry is configured in Dokploy
|
|
295
|
-
* - Or provide `username`, `password`, and `registryUrl` directly
|
|
296
|
-
*/
|
|
297
|
-
async saveDockerProvider(
|
|
298
|
-
applicationId: string,
|
|
299
|
-
dockerImage: string,
|
|
300
|
-
options?: {
|
|
301
|
-
/** Registry ID in Dokploy (for pre-configured registries) */
|
|
302
|
-
registryId?: string;
|
|
303
|
-
/** Registry username (for direct auth) */
|
|
304
|
-
username?: string;
|
|
305
|
-
/** Registry password (for direct auth) */
|
|
306
|
-
password?: string;
|
|
307
|
-
/** Registry URL (for direct auth, e.g., ghcr.io) */
|
|
308
|
-
registryUrl?: string;
|
|
309
|
-
},
|
|
310
|
-
): Promise<void> {
|
|
311
|
-
await this.post('application.saveDockerProvider', {
|
|
312
|
-
applicationId,
|
|
313
|
-
dockerImage,
|
|
314
|
-
...options,
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* Deploy an application
|
|
320
|
-
*/
|
|
321
|
-
async deployApplication(applicationId: string): Promise<void> {
|
|
322
|
-
await this.post('application.deploy', { applicationId });
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Delete an application
|
|
327
|
-
*/
|
|
328
|
-
async deleteApplication(applicationId: string): Promise<void> {
|
|
329
|
-
await this.post('application.remove', { applicationId });
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
// ============================================
|
|
333
|
-
// Registry endpoints
|
|
334
|
-
// ============================================
|
|
335
|
-
|
|
336
|
-
/**
|
|
337
|
-
* List all registries
|
|
338
|
-
*/
|
|
339
|
-
async listRegistries(): Promise<DokployRegistry[]> {
|
|
340
|
-
return this.get<DokployRegistry[]>('registry.all');
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Create a new registry
|
|
345
|
-
*/
|
|
346
|
-
async createRegistry(
|
|
347
|
-
registryName: string,
|
|
348
|
-
registryUrl: string,
|
|
349
|
-
username: string,
|
|
350
|
-
password: string,
|
|
351
|
-
options?: {
|
|
352
|
-
imagePrefix?: string;
|
|
353
|
-
},
|
|
354
|
-
): Promise<DokployRegistry> {
|
|
355
|
-
return this.post<DokployRegistry>('registry.create', {
|
|
356
|
-
registryName,
|
|
357
|
-
registryUrl,
|
|
358
|
-
username,
|
|
359
|
-
password,
|
|
360
|
-
imagePrefix: options?.imagePrefix,
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Get a registry by ID
|
|
366
|
-
*/
|
|
367
|
-
async getRegistry(registryId: string): Promise<DokployRegistry> {
|
|
368
|
-
return this.get<DokployRegistry>(`registry.one?registryId=${registryId}`);
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
/**
|
|
372
|
-
* Update a registry
|
|
373
|
-
*/
|
|
374
|
-
async updateRegistry(
|
|
375
|
-
registryId: string,
|
|
376
|
-
updates: Partial<{
|
|
377
|
-
registryName: string;
|
|
378
|
-
registryUrl: string;
|
|
379
|
-
username: string;
|
|
380
|
-
password: string;
|
|
381
|
-
imagePrefix: string;
|
|
382
|
-
}>,
|
|
383
|
-
): Promise<void> {
|
|
384
|
-
await this.post('registry.update', { registryId, ...updates });
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* Delete a registry
|
|
389
|
-
*/
|
|
390
|
-
async deleteRegistry(registryId: string): Promise<void> {
|
|
391
|
-
await this.post('registry.remove', { registryId });
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// ============================================
|
|
395
|
-
// Postgres endpoints
|
|
396
|
-
// ============================================
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* List all Postgres databases in a project
|
|
400
|
-
*/
|
|
401
|
-
async listPostgres(projectId: string): Promise<DokployPostgres[]> {
|
|
402
|
-
try {
|
|
403
|
-
return await this.get<DokployPostgres[]>(
|
|
404
|
-
`postgres.all?projectId=${projectId}`,
|
|
405
|
-
);
|
|
406
|
-
} catch {
|
|
407
|
-
// Fallback: endpoint might not exist in older Dokploy versions
|
|
408
|
-
return [];
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
/**
|
|
413
|
-
* Find a Postgres database by name in a project
|
|
414
|
-
*/
|
|
415
|
-
async findPostgresByName(
|
|
416
|
-
projectId: string,
|
|
417
|
-
name: string,
|
|
418
|
-
): Promise<DokployPostgres | undefined> {
|
|
419
|
-
const databases = await this.listPostgres(projectId);
|
|
420
|
-
const normalizedName = name.toLowerCase().replace(/[^a-z0-9-]/g, '-');
|
|
421
|
-
return databases.find(
|
|
422
|
-
(db) => db.name === name || db.appName === normalizedName,
|
|
423
|
-
);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
/**
|
|
427
|
-
* Create a new Postgres database
|
|
428
|
-
*/
|
|
429
|
-
async createPostgres(
|
|
430
|
-
name: string,
|
|
431
|
-
projectId: string,
|
|
432
|
-
environmentId: string,
|
|
433
|
-
options?: {
|
|
434
|
-
appName?: string;
|
|
435
|
-
databaseName?: string;
|
|
436
|
-
databaseUser?: string;
|
|
437
|
-
databasePassword?: string;
|
|
438
|
-
dockerImage?: string;
|
|
439
|
-
description?: string;
|
|
440
|
-
},
|
|
441
|
-
): Promise<DokployPostgres> {
|
|
442
|
-
return this.post<DokployPostgres>('postgres.create', {
|
|
443
|
-
name,
|
|
444
|
-
projectId,
|
|
445
|
-
environmentId,
|
|
446
|
-
appName:
|
|
447
|
-
options?.appName ?? name.toLowerCase().replace(/[^a-z0-9-]/g, '-'),
|
|
448
|
-
databaseName: options?.databaseName,
|
|
449
|
-
databaseUser: options?.databaseUser ?? 'postgres',
|
|
450
|
-
databasePassword: options?.databasePassword,
|
|
451
|
-
dockerImage: options?.dockerImage ?? 'postgres:18',
|
|
452
|
-
description: options?.description ?? `Postgres database for ${name}`,
|
|
453
|
-
});
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
/**
|
|
457
|
-
* Find or create a Postgres database by name
|
|
458
|
-
*/
|
|
459
|
-
async findOrCreatePostgres(
|
|
460
|
-
name: string,
|
|
461
|
-
projectId: string,
|
|
462
|
-
environmentId: string,
|
|
463
|
-
options?: {
|
|
464
|
-
databaseName?: string;
|
|
465
|
-
databasePassword?: string;
|
|
466
|
-
},
|
|
467
|
-
): Promise<{ postgres: DokployPostgres; created: boolean }> {
|
|
468
|
-
const existing = await this.findPostgresByName(projectId, name);
|
|
469
|
-
if (existing) {
|
|
470
|
-
return { postgres: existing, created: false };
|
|
471
|
-
}
|
|
472
|
-
const postgres = await this.createPostgres(
|
|
473
|
-
name,
|
|
474
|
-
projectId,
|
|
475
|
-
environmentId,
|
|
476
|
-
options,
|
|
477
|
-
);
|
|
478
|
-
return { postgres, created: true };
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
/**
|
|
482
|
-
* Get a Postgres database by ID
|
|
483
|
-
*/
|
|
484
|
-
async getPostgres(postgresId: string): Promise<DokployPostgres> {
|
|
485
|
-
return this.get<DokployPostgres>(`postgres.one?postgresId=${postgresId}`);
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
/**
|
|
489
|
-
* Deploy a Postgres database
|
|
490
|
-
*/
|
|
491
|
-
async deployPostgres(postgresId: string): Promise<void> {
|
|
492
|
-
await this.post('postgres.deploy', { postgresId });
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
/**
|
|
496
|
-
* Save environment variables for Postgres
|
|
497
|
-
*/
|
|
498
|
-
async savePostgresEnv(postgresId: string, env: string): Promise<void> {
|
|
499
|
-
await this.post('postgres.saveEnvironment', { postgresId, env });
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
/**
|
|
503
|
-
* Set external port for Postgres (for external access)
|
|
504
|
-
*/
|
|
505
|
-
async savePostgresExternalPort(
|
|
506
|
-
postgresId: string,
|
|
507
|
-
externalPort: number | null,
|
|
508
|
-
): Promise<void> {
|
|
509
|
-
await this.post('postgres.saveExternalPort', { postgresId, externalPort });
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
/**
|
|
513
|
-
* Update Postgres configuration
|
|
514
|
-
*/
|
|
515
|
-
async updatePostgres(
|
|
516
|
-
postgresId: string,
|
|
517
|
-
updates: Partial<DokployPostgresUpdate>,
|
|
518
|
-
): Promise<void> {
|
|
519
|
-
await this.post('postgres.update', { postgresId, ...updates });
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
/**
|
|
523
|
-
* Delete a Postgres database
|
|
524
|
-
*/
|
|
525
|
-
async deletePostgres(postgresId: string): Promise<void> {
|
|
526
|
-
await this.post('postgres.remove', { postgresId });
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
// ============================================
|
|
530
|
-
// Redis endpoints
|
|
531
|
-
// ============================================
|
|
532
|
-
|
|
533
|
-
/**
|
|
534
|
-
* List all Redis instances in a project
|
|
535
|
-
*/
|
|
536
|
-
async listRedis(projectId: string): Promise<DokployRedis[]> {
|
|
537
|
-
try {
|
|
538
|
-
return await this.get<DokployRedis[]>(`redis.all?projectId=${projectId}`);
|
|
539
|
-
} catch {
|
|
540
|
-
// Fallback: endpoint might not exist in older Dokploy versions
|
|
541
|
-
return [];
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
/**
|
|
546
|
-
* Find a Redis instance by name in a project
|
|
547
|
-
*/
|
|
548
|
-
async findRedisByName(
|
|
549
|
-
projectId: string,
|
|
550
|
-
name: string,
|
|
551
|
-
): Promise<DokployRedis | undefined> {
|
|
552
|
-
const instances = await this.listRedis(projectId);
|
|
553
|
-
const normalizedName = name.toLowerCase().replace(/[^a-z0-9-]/g, '-');
|
|
554
|
-
return instances.find(
|
|
555
|
-
(redis) => redis.name === name || redis.appName === normalizedName,
|
|
556
|
-
);
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
/**
|
|
560
|
-
* Create a new Redis instance
|
|
561
|
-
*/
|
|
562
|
-
async createRedis(
|
|
563
|
-
name: string,
|
|
564
|
-
projectId: string,
|
|
565
|
-
environmentId: string,
|
|
566
|
-
options?: {
|
|
567
|
-
appName?: string;
|
|
568
|
-
databasePassword?: string;
|
|
569
|
-
dockerImage?: string;
|
|
570
|
-
description?: string;
|
|
571
|
-
},
|
|
572
|
-
): Promise<DokployRedis> {
|
|
573
|
-
return this.post<DokployRedis>('redis.create', {
|
|
574
|
-
name,
|
|
575
|
-
projectId,
|
|
576
|
-
environmentId,
|
|
577
|
-
appName:
|
|
578
|
-
options?.appName ?? name.toLowerCase().replace(/[^a-z0-9-]/g, '-'),
|
|
579
|
-
databasePassword: options?.databasePassword,
|
|
580
|
-
dockerImage: options?.dockerImage ?? 'redis:8',
|
|
581
|
-
description: options?.description ?? `Redis instance for ${name}`,
|
|
582
|
-
});
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
/**
|
|
586
|
-
* Find or create a Redis instance by name
|
|
587
|
-
*/
|
|
588
|
-
async findOrCreateRedis(
|
|
589
|
-
name: string,
|
|
590
|
-
projectId: string,
|
|
591
|
-
environmentId: string,
|
|
592
|
-
options?: {
|
|
593
|
-
databasePassword?: string;
|
|
594
|
-
},
|
|
595
|
-
): Promise<{ redis: DokployRedis; created: boolean }> {
|
|
596
|
-
const existing = await this.findRedisByName(projectId, name);
|
|
597
|
-
if (existing) {
|
|
598
|
-
return { redis: existing, created: false };
|
|
599
|
-
}
|
|
600
|
-
const redis = await this.createRedis(
|
|
601
|
-
name,
|
|
602
|
-
projectId,
|
|
603
|
-
environmentId,
|
|
604
|
-
options,
|
|
605
|
-
);
|
|
606
|
-
return { redis, created: true };
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
/**
|
|
610
|
-
* Get a Redis instance by ID
|
|
611
|
-
*/
|
|
612
|
-
async getRedis(redisId: string): Promise<DokployRedis> {
|
|
613
|
-
return this.get<DokployRedis>(`redis.one?redisId=${redisId}`);
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
/**
|
|
617
|
-
* Deploy a Redis instance
|
|
618
|
-
*/
|
|
619
|
-
async deployRedis(redisId: string): Promise<void> {
|
|
620
|
-
await this.post('redis.deploy', { redisId });
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
/**
|
|
624
|
-
* Save environment variables for Redis
|
|
625
|
-
*/
|
|
626
|
-
async saveRedisEnv(redisId: string, env: string): Promise<void> {
|
|
627
|
-
await this.post('redis.saveEnvironment', { redisId, env });
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
/**
|
|
631
|
-
* Set external port for Redis (for external access)
|
|
632
|
-
*/
|
|
633
|
-
async saveRedisExternalPort(
|
|
634
|
-
redisId: string,
|
|
635
|
-
externalPort: number | null,
|
|
636
|
-
): Promise<void> {
|
|
637
|
-
await this.post('redis.saveExternalPort', { redisId, externalPort });
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
/**
|
|
641
|
-
* Update Redis configuration
|
|
642
|
-
*/
|
|
643
|
-
async updateRedis(
|
|
644
|
-
redisId: string,
|
|
645
|
-
updates: Partial<DokployRedisUpdate>,
|
|
646
|
-
): Promise<void> {
|
|
647
|
-
await this.post('redis.update', { redisId, ...updates });
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
/**
|
|
651
|
-
* Delete a Redis instance
|
|
652
|
-
*/
|
|
653
|
-
async deleteRedis(redisId: string): Promise<void> {
|
|
654
|
-
await this.post('redis.remove', { redisId });
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
// ============================================
|
|
658
|
-
// Domain endpoints
|
|
659
|
-
// ============================================
|
|
660
|
-
|
|
661
|
-
/**
|
|
662
|
-
* Create a new domain for an application
|
|
663
|
-
*/
|
|
664
|
-
async createDomain(options: DokployDomainCreate): Promise<DokployDomain> {
|
|
665
|
-
return this.post<DokployDomain>(
|
|
666
|
-
'domain.create',
|
|
667
|
-
options as unknown as Record<string, unknown>,
|
|
668
|
-
);
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
/**
|
|
672
|
-
* Update an existing domain
|
|
673
|
-
*/
|
|
674
|
-
async updateDomain(
|
|
675
|
-
domainId: string,
|
|
676
|
-
updates: Partial<DokployDomainCreate>,
|
|
677
|
-
): Promise<void> {
|
|
678
|
-
await this.post('domain.update', { domainId, ...updates });
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
/**
|
|
682
|
-
* Delete a domain
|
|
683
|
-
*/
|
|
684
|
-
async deleteDomain(domainId: string): Promise<void> {
|
|
685
|
-
await this.post('domain.delete', { domainId });
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
/**
|
|
689
|
-
* Get a domain by ID
|
|
690
|
-
*/
|
|
691
|
-
async getDomain(domainId: string): Promise<DokployDomain> {
|
|
692
|
-
return this.get<DokployDomain>(`domain.one?domainId=${domainId}`);
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
/**
|
|
696
|
-
* Get all domains for an application
|
|
697
|
-
*/
|
|
698
|
-
async getDomainsByApplicationId(
|
|
699
|
-
applicationId: string,
|
|
700
|
-
): Promise<DokployDomain[]> {
|
|
701
|
-
return this.get<DokployDomain[]>(
|
|
702
|
-
`domain.byApplicationId?applicationId=${applicationId}`,
|
|
703
|
-
);
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
/**
|
|
707
|
-
* Validate a domain and trigger SSL certificate generation
|
|
708
|
-
*
|
|
709
|
-
* This should be called after DNS records are created and propagated.
|
|
710
|
-
* It triggers Let's Encrypt certificate generation for HTTPS domains.
|
|
711
|
-
*
|
|
712
|
-
* @param domain - The domain hostname to validate (e.g., 'api.example.com')
|
|
713
|
-
*/
|
|
714
|
-
async validateDomain(
|
|
715
|
-
domain: string,
|
|
716
|
-
): Promise<{ isValid: boolean; resolvedIp: string }> {
|
|
717
|
-
return this.post<{ isValid: boolean; resolvedIp: string }>(
|
|
718
|
-
'domain.validateDomain',
|
|
719
|
-
{ domain },
|
|
720
|
-
);
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
/**
|
|
724
|
-
* Auto-generate a domain name for an application
|
|
725
|
-
*/
|
|
726
|
-
async generateDomain(
|
|
727
|
-
appName: string,
|
|
728
|
-
serverId?: string,
|
|
729
|
-
): Promise<{ domain: string }> {
|
|
730
|
-
return this.post<{ domain: string }>('domain.generateDomain', {
|
|
731
|
-
appName,
|
|
732
|
-
serverId,
|
|
733
|
-
});
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
// ============================================
|
|
737
|
-
// Destination endpoints (backup storage)
|
|
738
|
-
// ============================================
|
|
739
|
-
|
|
740
|
-
/**
|
|
741
|
-
* List all backup destinations
|
|
742
|
-
*/
|
|
743
|
-
async listDestinations(): Promise<DokployDestination[]> {
|
|
744
|
-
return this.get<DokployDestination[]>('destination.all');
|
|
745
|
-
}
|
|
746
|
-
|
|
747
|
-
/**
|
|
748
|
-
* Get a destination by ID
|
|
749
|
-
*/
|
|
750
|
-
async getDestination(destinationId: string): Promise<DokployDestination> {
|
|
751
|
-
return this.get<DokployDestination>(
|
|
752
|
-
`destination.one?destinationId=${destinationId}`,
|
|
753
|
-
);
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
/**
|
|
757
|
-
* Create a new S3 backup destination
|
|
758
|
-
*/
|
|
759
|
-
async createDestination(
|
|
760
|
-
options: DokployDestinationCreate,
|
|
761
|
-
): Promise<DokployDestination> {
|
|
762
|
-
return this.post<DokployDestination>('destination.create', { ...options });
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
/**
|
|
766
|
-
* Find a destination by name
|
|
767
|
-
*/
|
|
768
|
-
async findDestinationByName(
|
|
769
|
-
name: string,
|
|
770
|
-
): Promise<DokployDestination | undefined> {
|
|
771
|
-
const destinations = await this.listDestinations();
|
|
772
|
-
return destinations.find((d) => d.name === name);
|
|
773
|
-
}
|
|
774
|
-
|
|
775
|
-
/**
|
|
776
|
-
* Find or create a destination by name
|
|
777
|
-
*/
|
|
778
|
-
async findOrCreateDestination(
|
|
779
|
-
name: string,
|
|
780
|
-
options: Omit<DokployDestinationCreate, 'name'>,
|
|
781
|
-
): Promise<{ destination: DokployDestination; created: boolean }> {
|
|
782
|
-
const existing = await this.findDestinationByName(name);
|
|
783
|
-
if (existing) {
|
|
784
|
-
return { destination: existing, created: false };
|
|
785
|
-
}
|
|
786
|
-
const destination = await this.createDestination({ name, ...options });
|
|
787
|
-
return { destination, created: true };
|
|
788
|
-
}
|
|
789
|
-
|
|
790
|
-
/**
|
|
791
|
-
* Update a destination
|
|
792
|
-
*/
|
|
793
|
-
async updateDestination(
|
|
794
|
-
destinationId: string,
|
|
795
|
-
updates: Partial<DokployDestinationCreate>,
|
|
796
|
-
): Promise<void> {
|
|
797
|
-
await this.post('destination.update', { destinationId, ...updates });
|
|
798
|
-
}
|
|
799
|
-
|
|
800
|
-
/**
|
|
801
|
-
* Delete a destination
|
|
802
|
-
*/
|
|
803
|
-
async deleteDestination(destinationId: string): Promise<void> {
|
|
804
|
-
await this.post('destination.remove', { destinationId });
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
/**
|
|
808
|
-
* Test connection to a destination
|
|
809
|
-
*/
|
|
810
|
-
async testDestinationConnection(
|
|
811
|
-
destinationId: string,
|
|
812
|
-
): Promise<{ success: boolean }> {
|
|
813
|
-
return this.post<{ success: boolean }>('destination.testConnection', {
|
|
814
|
-
destinationId,
|
|
815
|
-
});
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
// ============================================
|
|
819
|
-
// Backup endpoints (scheduled backups)
|
|
820
|
-
// ============================================
|
|
821
|
-
|
|
822
|
-
/**
|
|
823
|
-
* Create a backup schedule for postgres
|
|
824
|
-
*/
|
|
825
|
-
async createPostgresBackup(
|
|
826
|
-
options: DokployBackupCreate,
|
|
827
|
-
): Promise<DokployBackup> {
|
|
828
|
-
return this.post<DokployBackup>('backup.create', {
|
|
829
|
-
...options,
|
|
830
|
-
databaseType: 'postgres',
|
|
831
|
-
});
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
/**
|
|
835
|
-
* List backups for a postgres database
|
|
836
|
-
*/
|
|
837
|
-
async listPostgresBackups(postgresId: string): Promise<DokployBackup[]> {
|
|
838
|
-
return this.get<DokployBackup[]>(
|
|
839
|
-
`backup.all?postgresId=${postgresId}&databaseType=postgres`,
|
|
840
|
-
);
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
/**
|
|
844
|
-
* Get a backup by ID
|
|
845
|
-
*/
|
|
846
|
-
async getBackup(backupId: string): Promise<DokployBackup> {
|
|
847
|
-
return this.get<DokployBackup>(`backup.one?backupId=${backupId}`);
|
|
848
|
-
}
|
|
849
|
-
|
|
850
|
-
/**
|
|
851
|
-
* Update a backup schedule
|
|
852
|
-
*/
|
|
853
|
-
async updateBackup(
|
|
854
|
-
backupId: string,
|
|
855
|
-
updates: Partial<DokployBackupUpdate>,
|
|
856
|
-
): Promise<void> {
|
|
857
|
-
await this.post('backup.update', { backupId, ...updates });
|
|
858
|
-
}
|
|
859
|
-
|
|
860
|
-
/**
|
|
861
|
-
* Delete a backup schedule
|
|
862
|
-
*/
|
|
863
|
-
async deleteBackup(backupId: string): Promise<void> {
|
|
864
|
-
await this.post('backup.remove', { backupId });
|
|
865
|
-
}
|
|
866
|
-
|
|
867
|
-
/**
|
|
868
|
-
* Trigger a manual backup run
|
|
869
|
-
*/
|
|
870
|
-
async runBackupManually(backupId: string): Promise<void> {
|
|
871
|
-
await this.post('backup.manualBackup', { backupId });
|
|
872
|
-
}
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
// ============================================
|
|
876
|
-
// Type definitions for Dokploy API responses
|
|
877
|
-
// ============================================
|
|
878
|
-
|
|
879
|
-
export interface DokployProject {
|
|
880
|
-
projectId: string;
|
|
881
|
-
name: string;
|
|
882
|
-
description: string | null;
|
|
883
|
-
createdAt?: string;
|
|
884
|
-
adminId?: string;
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
export interface DokployEnvironment {
|
|
888
|
-
environmentId: string;
|
|
889
|
-
name: string;
|
|
890
|
-
description: string | null;
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
export interface DokployProjectDetails extends DokployProject {
|
|
894
|
-
environments: DokployEnvironment[];
|
|
895
|
-
}
|
|
896
|
-
|
|
897
|
-
export interface DokployApplication {
|
|
898
|
-
applicationId: string;
|
|
899
|
-
name: string;
|
|
900
|
-
appName: string;
|
|
901
|
-
projectId: string;
|
|
902
|
-
environmentId?: string;
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
export interface DokployApplicationUpdate {
|
|
906
|
-
registryId: string;
|
|
907
|
-
dockerImage: string;
|
|
908
|
-
sourceType: 'docker';
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
export interface DokployRegistry {
|
|
912
|
-
registryId: string;
|
|
913
|
-
registryName: string;
|
|
914
|
-
registryUrl: string;
|
|
915
|
-
username: string;
|
|
916
|
-
imagePrefix: string | null;
|
|
917
|
-
}
|
|
918
|
-
|
|
919
|
-
export interface DokployPostgres {
|
|
920
|
-
postgresId: string;
|
|
921
|
-
name: string;
|
|
922
|
-
appName: string;
|
|
923
|
-
databaseName: string;
|
|
924
|
-
databaseUser: string;
|
|
925
|
-
databasePassword: string;
|
|
926
|
-
dockerImage: string;
|
|
927
|
-
description: string | null;
|
|
928
|
-
projectId: string;
|
|
929
|
-
environmentId: string;
|
|
930
|
-
applicationStatus: 'idle' | 'running' | 'done' | 'error';
|
|
931
|
-
externalPort: number | null;
|
|
932
|
-
createdAt?: string;
|
|
933
|
-
}
|
|
934
|
-
|
|
935
|
-
export interface DokployPostgresUpdate {
|
|
936
|
-
name: string;
|
|
937
|
-
appName: string;
|
|
938
|
-
databaseName: string;
|
|
939
|
-
databaseUser: string;
|
|
940
|
-
databasePassword: string;
|
|
941
|
-
dockerImage: string;
|
|
942
|
-
description: string;
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
export interface DokployRedis {
|
|
946
|
-
redisId: string;
|
|
947
|
-
name: string;
|
|
948
|
-
appName: string;
|
|
949
|
-
databasePassword: string;
|
|
950
|
-
dockerImage: string;
|
|
951
|
-
description: string | null;
|
|
952
|
-
projectId: string;
|
|
953
|
-
environmentId: string;
|
|
954
|
-
applicationStatus: 'idle' | 'running' | 'done' | 'error';
|
|
955
|
-
externalPort: number | null;
|
|
956
|
-
createdAt?: string;
|
|
957
|
-
}
|
|
958
|
-
|
|
959
|
-
export interface DokployRedisUpdate {
|
|
960
|
-
name: string;
|
|
961
|
-
appName: string;
|
|
962
|
-
databasePassword: string;
|
|
963
|
-
dockerImage: string;
|
|
964
|
-
description: string;
|
|
965
|
-
}
|
|
966
|
-
|
|
967
|
-
export type DokployCertificateType = 'letsencrypt' | 'none' | 'custom';
|
|
968
|
-
export type DokployDomainType = 'application' | 'compose' | 'preview';
|
|
969
|
-
|
|
970
|
-
export interface DokployDomainCreate {
|
|
971
|
-
/** Domain hostname (e.g., 'api.example.com') */
|
|
972
|
-
host: string;
|
|
973
|
-
/** URL path (optional, e.g., '/api') */
|
|
974
|
-
path?: string | null;
|
|
975
|
-
/** Container port to route to (1-65535) */
|
|
976
|
-
port?: number | null;
|
|
977
|
-
/** Enable HTTPS */
|
|
978
|
-
https?: boolean;
|
|
979
|
-
/** Associated application ID */
|
|
980
|
-
applicationId?: string | null;
|
|
981
|
-
/** Certificate type for HTTPS */
|
|
982
|
-
certificateType?: DokployCertificateType;
|
|
983
|
-
/** Custom certificate resolver name */
|
|
984
|
-
customCertResolver?: string | null;
|
|
985
|
-
/** Docker Compose service ID */
|
|
986
|
-
composeId?: string | null;
|
|
987
|
-
/** Service name for compose */
|
|
988
|
-
serviceName?: string | null;
|
|
989
|
-
/** Domain type */
|
|
990
|
-
domainType?: DokployDomainType | null;
|
|
991
|
-
/** Preview deployment ID */
|
|
992
|
-
previewDeploymentId?: string | null;
|
|
993
|
-
/** Internal routing path */
|
|
994
|
-
internalPath?: string | null;
|
|
995
|
-
/** Strip path from forwarded requests */
|
|
996
|
-
stripPath?: boolean;
|
|
997
|
-
}
|
|
998
|
-
|
|
999
|
-
export interface DokployDomain extends DokployDomainCreate {
|
|
1000
|
-
domainId: string;
|
|
1001
|
-
createdAt?: string;
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1004
|
-
// ============================================
|
|
1005
|
-
// Destination types (backup storage)
|
|
1006
|
-
// ============================================
|
|
1007
|
-
|
|
1008
|
-
export interface DokployDestination {
|
|
1009
|
-
destinationId: string;
|
|
1010
|
-
name: string;
|
|
1011
|
-
accessKey: string;
|
|
1012
|
-
bucket: string;
|
|
1013
|
-
region: string;
|
|
1014
|
-
endpoint: string | null;
|
|
1015
|
-
createdAt?: string;
|
|
1016
|
-
}
|
|
1017
|
-
|
|
1018
|
-
export interface DokployDestinationCreate {
|
|
1019
|
-
/** User-friendly name for the destination */
|
|
1020
|
-
name: string;
|
|
1021
|
-
/** S3 access key ID */
|
|
1022
|
-
accessKey: string;
|
|
1023
|
-
/** S3 secret access key */
|
|
1024
|
-
secretAccessKey: string;
|
|
1025
|
-
/** S3 bucket name */
|
|
1026
|
-
bucket: string;
|
|
1027
|
-
/** AWS region (e.g., 'us-east-1') */
|
|
1028
|
-
region: string;
|
|
1029
|
-
/** Optional endpoint for S3-compatible services */
|
|
1030
|
-
endpoint?: string;
|
|
1031
|
-
}
|
|
1032
|
-
|
|
1033
|
-
// ============================================
|
|
1034
|
-
// Backup types (scheduled backups)
|
|
1035
|
-
// ============================================
|
|
1036
|
-
|
|
1037
|
-
export type DokployDatabaseType = 'postgres' | 'mysql' | 'mariadb' | 'mongo';
|
|
1038
|
-
|
|
1039
|
-
export interface DokployBackup {
|
|
1040
|
-
backupId: string;
|
|
1041
|
-
schedule: string;
|
|
1042
|
-
prefix: string;
|
|
1043
|
-
enabled: boolean;
|
|
1044
|
-
destinationId: string;
|
|
1045
|
-
postgresId?: string;
|
|
1046
|
-
databaseType: DokployDatabaseType;
|
|
1047
|
-
keepLatestCount: number | null;
|
|
1048
|
-
createdAt?: string;
|
|
1049
|
-
}
|
|
1050
|
-
|
|
1051
|
-
export interface DokployBackupCreate {
|
|
1052
|
-
/** Cron schedule (e.g., '0 2 * * *' for 2 AM daily) */
|
|
1053
|
-
schedule: string;
|
|
1054
|
-
/** Backup file prefix (e.g., 'production/postgres') */
|
|
1055
|
-
prefix: string;
|
|
1056
|
-
/** Destination ID for backup storage */
|
|
1057
|
-
destinationId: string;
|
|
1058
|
-
/** Database name to backup */
|
|
1059
|
-
database: string;
|
|
1060
|
-
/** Postgres instance ID */
|
|
1061
|
-
postgresId: string;
|
|
1062
|
-
/** Enable/disable backup (default: true) */
|
|
1063
|
-
enabled?: boolean;
|
|
1064
|
-
/** Number of backups to keep (default: keep all) */
|
|
1065
|
-
keepLatestCount?: number;
|
|
1066
|
-
}
|
|
1067
|
-
|
|
1068
|
-
export interface DokployBackupUpdate {
|
|
1069
|
-
schedule?: string;
|
|
1070
|
-
prefix?: string;
|
|
1071
|
-
enabled?: boolean;
|
|
1072
|
-
keepLatestCount?: number;
|
|
1073
|
-
}
|
|
1074
|
-
|
|
1075
|
-
/**
|
|
1076
|
-
* Create a Dokploy API client from stored credentials or environment
|
|
1077
|
-
*/
|
|
1078
|
-
export async function createDokployApi(
|
|
1079
|
-
endpoint?: string,
|
|
1080
|
-
): Promise<DokployApi | null> {
|
|
1081
|
-
const { getDokployCredentials } = await import('../auth/credentials');
|
|
1082
|
-
|
|
1083
|
-
// Try environment variable first
|
|
1084
|
-
const envToken = process.env.DOKPLOY_API_TOKEN;
|
|
1085
|
-
const envEndpoint = endpoint || process.env.DOKPLOY_ENDPOINT;
|
|
1086
|
-
|
|
1087
|
-
if (envToken && envEndpoint) {
|
|
1088
|
-
return new DokployApi({ baseUrl: envEndpoint, token: envToken });
|
|
1089
|
-
}
|
|
1090
|
-
|
|
1091
|
-
// Fall back to stored credentials
|
|
1092
|
-
const creds = await getDokployCredentials();
|
|
1093
|
-
if (creds) {
|
|
1094
|
-
return new DokployApi({
|
|
1095
|
-
baseUrl: endpoint || creds.endpoint,
|
|
1096
|
-
token: creds.token,
|
|
1097
|
-
});
|
|
1098
|
-
}
|
|
1099
|
-
|
|
1100
|
-
return null;
|
|
1101
|
-
}
|