codecrypto-cli 1.0.8 → 1.0.9
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/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +64 -7
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/deploy-sc.d.ts.map +1 -1
- package/dist/commands/deploy-sc.js +162 -0
- package/dist/commands/deploy-sc.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +352 -43
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +518 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/docker-build/Dockerfile +4 -0
- package/docker-build/standalone/.next/BUILD_ID +1 -1
- package/docker-build/standalone/.next/app-path-routes-manifest.json +0 -7
- package/docker-build/standalone/.next/build-manifest.json +6 -7
- package/docker-build/standalone/.next/prerender-manifest.json +3 -75
- package/docker-build/standalone/.next/required-server-files.json +2 -2
- package/docker-build/standalone/.next/routes-manifest.json +0 -42
- package/docker-build/standalone/.next/server/app/_global-error/page/build-manifest.json +4 -5
- package/docker-build/standalone/.next/server/app/_global-error/page.js +10 -10
- package/docker-build/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/docker-build/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/docker-build/standalone/.next/server/app/_global-error.html +2 -2
- package/docker-build/standalone/.next/server/app/_global-error.rsc +8 -8
- package/docker-build/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/docker-build/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +8 -8
- package/docker-build/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +4 -4
- package/docker-build/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/docker-build/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/docker-build/standalone/.next/server/app/_not-found/page/build-manifest.json +4 -5
- package/docker-build/standalone/.next/server/app/_not-found/page/next-font-manifest.json +1 -1
- package/docker-build/standalone/.next/server/app/_not-found/page.js +13 -13
- package/docker-build/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/docker-build/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/docker-build/standalone/.next/server/app/_not-found.html +1 -1
- package/docker-build/standalone/.next/server/app/_not-found.rsc +10 -10
- package/docker-build/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
- package/docker-build/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/docker-build/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/docker-build/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/docker-build/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/docker-build/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/docker-build/standalone/.next/server/app/favicon.ico/route.js +5 -6
- package/docker-build/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/docker-build/standalone/.next/server/app/index.html +1 -1
- package/docker-build/standalone/.next/server/app/index.rsc +13 -22
- package/docker-build/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -7
- package/docker-build/standalone/.next/server/app/index.segments/_full.segment.rsc +13 -22
- package/docker-build/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/docker-build/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/docker-build/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/docker-build/standalone/.next/server/app/page/build-manifest.json +4 -5
- package/docker-build/standalone/.next/server/app/page/next-font-manifest.json +1 -1
- package/docker-build/standalone/.next/server/app/page.js +15 -15
- package/docker-build/standalone/.next/server/app/page.js.nft.json +1 -1
- package/docker-build/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/docker-build/standalone/.next/server/app-paths-manifest.json +0 -7
- package/docker-build/standalone/.next/server/chunks/66d90_example-navidad__next-internal_server_app_favicon_ico_route_actions_a30dceae.js +3 -0
- package/docker-build/standalone/.next/server/chunks/[externals]_next_dist_03fe02e0._.js +3 -0
- package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__4b49000d._.js +21 -0
- package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_example-navidad__next-internal_server_app_page_actions_a387aef9.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_example-navidad_377109b0._.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/{2025_cc_CODECRYPTO_infra_server-cc_d03dcb7a._.js → 2025_cc_CODECRYPTO_infra_example-navidad_90799f30._.js} +3 -3
- package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_example-navidad_app_b9057478._.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/66d90_example-navidad__next-internal_server_app__global-error_page_actions_a079475f.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/66d90_example-navidad__next-internal_server_app__not-found_page_actions_ac88cec2.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/{6f6aa_next_dist_5002976b._.js → 77a20_next_dist_51be1544._.js} +3 -3
- package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_8dba0557._.js +6 -0
- package/docker-build/standalone/.next/server/chunks/ssr/{6f6aa_next_dist_client_components_a432b2d3._.js → 77a20_next_dist_client_components_41330064._.js} +2 -2
- package/docker-build/standalone/.next/server/chunks/ssr/{6f6aa_next_dist_client_components_builtin_forbidden_b4e63d3a.js → 77a20_next_dist_client_components_builtin_forbidden_ff3a0457.js} +2 -2
- package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_client_components_builtin_global-error_e0d57e6e.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/{6f6aa_next_dist_client_components_builtin_unauthorized_f08488ad.js → 77a20_next_dist_client_components_builtin_unauthorized_f1c47e13.js} +2 -2
- package/docker-build/standalone/.next/server/chunks/ssr/77a20_next_dist_d332f292._.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/{6f6aa_next_dist_esm_build_templates_app-page_c7a8656a.js → 77a20_next_dist_esm_build_templates_app-page_cf6afba1.js} +3 -3
- package/docker-build/standalone/.next/server/chunks/ssr/{[root-of-the-server]__5ecc39a2._.js → [root-of-the-server]__02f3f427._.js} +2 -2
- package/docker-build/standalone/.next/server/chunks/ssr/{[root-of-the-server]__f2372d3f._.js → [root-of-the-server]__2f460610._.js} +2 -2
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__4722e53c._.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__53b749fa._.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__61942f2d._.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__7707ad1b._.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__864cadbf._.js +10 -0
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__9939e281._.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__b4b0aa8a._.js +3 -0
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__d2b7072b._.js +3 -0
- package/docker-build/standalone/.next/server/middleware-build-manifest.js +4 -5
- package/docker-build/standalone/.next/server/next-font-manifest.js +1 -1
- package/docker-build/standalone/.next/server/next-font-manifest.json +2 -14
- package/docker-build/standalone/.next/server/pages/404.html +1 -1
- package/docker-build/standalone/.next/server/pages/500.html +2 -2
- package/docker-build/standalone/.next/server/server-reference-manifest.js +1 -1
- package/docker-build/standalone/.next/server/server-reference-manifest.json +1 -1
- package/docker-build/standalone/.next/static/chunks/57d1af92f5dc15fa.js +1 -0
- package/docker-build/standalone/.next/static/chunks/6ae71d5e8ea4d1eb.js +1 -0
- package/docker-build/standalone/.next/static/chunks/70977d70c9306213.js +1 -0
- package/docker-build/standalone/.next/static/chunks/777dac7104fe2a30.js +5 -0
- package/docker-build/standalone/.next/static/chunks/a6dad97d9634a72d.js.map +1 -1
- package/docker-build/standalone/.next/static/chunks/d6aec49b013224a2.css +3 -0
- package/docker-build/standalone/.next/static/chunks/turbopack-0ce517fb6224c1f0.js +4 -0
- package/docker-build/standalone/package.json +4 -13
- package/package.json +1 -1
- package/src/commands/auth.ts +71 -8
- package/src/commands/deploy-sc.ts +182 -0
- package/src/commands/deploy.ts +365 -47
- package/src/commands/doctor.ts +498 -0
- package/src/index.ts +2 -0
- package/token.json +69 -0
- package/docker-build/standalone/.next/server/app/api/deploy/route/app-paths-manifest.json +0 -3
- package/docker-build/standalone/.next/server/app/api/deploy/route/build-manifest.json +0 -11
- package/docker-build/standalone/.next/server/app/api/deploy/route/server-reference-manifest.json +0 -4
- package/docker-build/standalone/.next/server/app/api/deploy/route.js +0 -7
- package/docker-build/standalone/.next/server/app/api/deploy/route.js.map +0 -5
- package/docker-build/standalone/.next/server/app/api/deploy/route.js.nft.json +0 -1
- package/docker-build/standalone/.next/server/app/api/deploy/route_client-reference-manifest.js +0 -2
- package/docker-build/standalone/.next/server/app/api/deploy-image/route/app-paths-manifest.json +0 -3
- package/docker-build/standalone/.next/server/app/api/deploy-image/route/build-manifest.json +0 -11
- package/docker-build/standalone/.next/server/app/api/deploy-image/route/server-reference-manifest.json +0 -4
- package/docker-build/standalone/.next/server/app/api/deploy-image/route.js +0 -6
- package/docker-build/standalone/.next/server/app/api/deploy-image/route.js.map +0 -5
- package/docker-build/standalone/.next/server/app/api/deploy-image/route.js.nft.json +0 -1
- package/docker-build/standalone/.next/server/app/api/deploy-image/route_client-reference-manifest.js +0 -2
- package/docker-build/standalone/.next/server/app/api/docker-images/route/app-paths-manifest.json +0 -3
- package/docker-build/standalone/.next/server/app/api/docker-images/route/build-manifest.json +0 -11
- package/docker-build/standalone/.next/server/app/api/docker-images/route/server-reference-manifest.json +0 -4
- package/docker-build/standalone/.next/server/app/api/docker-images/route.js +0 -6
- package/docker-build/standalone/.next/server/app/api/docker-images/route.js.map +0 -5
- package/docker-build/standalone/.next/server/app/api/docker-images/route.js.nft.json +0 -1
- package/docker-build/standalone/.next/server/app/api/docker-images/route_client-reference-manifest.js +0 -2
- package/docker-build/standalone/.next/server/app/api/faucet/route/app-paths-manifest.json +0 -3
- package/docker-build/standalone/.next/server/app/api/faucet/route/build-manifest.json +0 -11
- package/docker-build/standalone/.next/server/app/api/faucet/route/server-reference-manifest.json +0 -4
- package/docker-build/standalone/.next/server/app/api/faucet/route.js +0 -9
- package/docker-build/standalone/.next/server/app/api/faucet/route.js.map +0 -5
- package/docker-build/standalone/.next/server/app/api/faucet/route.js.nft.json +0 -1
- package/docker-build/standalone/.next/server/app/api/faucet/route_client-reference-manifest.js +0 -2
- package/docker-build/standalone/.next/server/app/deploy/page/app-paths-manifest.json +0 -3
- package/docker-build/standalone/.next/server/app/deploy/page/build-manifest.json +0 -17
- package/docker-build/standalone/.next/server/app/deploy/page/next-font-manifest.json +0 -11
- package/docker-build/standalone/.next/server/app/deploy/page/react-loadable-manifest.json +0 -1
- package/docker-build/standalone/.next/server/app/deploy/page/server-reference-manifest.json +0 -4
- package/docker-build/standalone/.next/server/app/deploy/page.js +0 -16
- package/docker-build/standalone/.next/server/app/deploy/page.js.map +0 -5
- package/docker-build/standalone/.next/server/app/deploy/page.js.nft.json +0 -1
- package/docker-build/standalone/.next/server/app/deploy/page_client-reference-manifest.js +0 -2
- package/docker-build/standalone/.next/server/app/deploy.html +0 -1
- package/docker-build/standalone/.next/server/app/deploy.meta +0 -15
- package/docker-build/standalone/.next/server/app/deploy.rsc +0 -20
- package/docker-build/standalone/.next/server/app/deploy.segments/_full.segment.rsc +0 -20
- package/docker-build/standalone/.next/server/app/deploy.segments/_head.segment.rsc +0 -6
- package/docker-build/standalone/.next/server/app/deploy.segments/_index.segment.rsc +0 -5
- package/docker-build/standalone/.next/server/app/deploy.segments/_tree.segment.rsc +0 -4
- package/docker-build/standalone/.next/server/app/deploy.segments/deploy/__PAGE__.segment.rsc +0 -9
- package/docker-build/standalone/.next/server/app/deploy.segments/deploy.segment.rsc +0 -4
- package/docker-build/standalone/.next/server/app/faucet/page/app-paths-manifest.json +0 -3
- package/docker-build/standalone/.next/server/app/faucet/page/build-manifest.json +0 -17
- package/docker-build/standalone/.next/server/app/faucet/page/next-font-manifest.json +0 -11
- package/docker-build/standalone/.next/server/app/faucet/page/react-loadable-manifest.json +0 -1
- package/docker-build/standalone/.next/server/app/faucet/page/server-reference-manifest.json +0 -4
- package/docker-build/standalone/.next/server/app/faucet/page.js +0 -16
- package/docker-build/standalone/.next/server/app/faucet/page.js.map +0 -5
- package/docker-build/standalone/.next/server/app/faucet/page.js.nft.json +0 -1
- package/docker-build/standalone/.next/server/app/faucet/page_client-reference-manifest.js +0 -2
- package/docker-build/standalone/.next/server/app/faucet.html +0 -1
- package/docker-build/standalone/.next/server/app/faucet.meta +0 -15
- package/docker-build/standalone/.next/server/app/faucet.rsc +0 -20
- package/docker-build/standalone/.next/server/app/faucet.segments/_full.segment.rsc +0 -20
- package/docker-build/standalone/.next/server/app/faucet.segments/_head.segment.rsc +0 -6
- package/docker-build/standalone/.next/server/app/faucet.segments/_index.segment.rsc +0 -5
- package/docker-build/standalone/.next/server/app/faucet.segments/_tree.segment.rsc +0 -4
- package/docker-build/standalone/.next/server/app/faucet.segments/faucet/__PAGE__.segment.rsc +0 -9
- package/docker-build/standalone/.next/server/app/faucet.segments/faucet.segment.rsc +0 -4
- package/docker-build/standalone/.next/server/app/images/page/app-paths-manifest.json +0 -3
- package/docker-build/standalone/.next/server/app/images/page/build-manifest.json +0 -17
- package/docker-build/standalone/.next/server/app/images/page/next-font-manifest.json +0 -11
- package/docker-build/standalone/.next/server/app/images/page/react-loadable-manifest.json +0 -1
- package/docker-build/standalone/.next/server/app/images/page/server-reference-manifest.json +0 -4
- package/docker-build/standalone/.next/server/app/images/page.js +0 -16
- package/docker-build/standalone/.next/server/app/images/page.js.map +0 -5
- package/docker-build/standalone/.next/server/app/images/page.js.nft.json +0 -1
- package/docker-build/standalone/.next/server/app/images/page_client-reference-manifest.js +0 -2
- package/docker-build/standalone/.next/server/app/images.html +0 -1
- package/docker-build/standalone/.next/server/app/images.meta +0 -15
- package/docker-build/standalone/.next/server/app/images.rsc +0 -20
- package/docker-build/standalone/.next/server/app/images.segments/_full.segment.rsc +0 -20
- package/docker-build/standalone/.next/server/app/images.segments/_head.segment.rsc +0 -6
- package/docker-build/standalone/.next/server/app/images.segments/_index.segment.rsc +0 -5
- package/docker-build/standalone/.next/server/app/images.segments/_tree.segment.rsc +0 -4
- package/docker-build/standalone/.next/server/app/images.segments/images/__PAGE__.segment.rsc +0 -9
- package/docker-build/standalone/.next/server/app/images.segments/images.segment.rsc +0 -4
- package/docker-build/standalone/.next/server/chunks/10072_infra_server-cc__next-internal_server_app_api_deploy_route_actions_6cdc6432.js +0 -3
- package/docker-build/standalone/.next/server/chunks/10072_infra_server-cc__next-internal_server_app_api_faucet_route_actions_f54ec975.js +0 -3
- package/docker-build/standalone/.next/server/chunks/10072_infra_server-cc__next-internal_server_app_favicon_ico_route_actions_d73715d1.js +0 -3
- package/docker-build/standalone/.next/server/chunks/66d90_server-cc__next-internal_server_app_api_deploy-image_route_actions_b340a7f4.js +0 -3
- package/docker-build/standalone/.next/server/chunks/66d90_server-cc__next-internal_server_app_api_docker-images_route_actions_4adcb030.js +0 -3
- package/docker-build/standalone/.next/server/chunks/6f6aa_4d460f49._.js +0 -30
- package/docker-build/standalone/.next/server/chunks/6f6aa_@noble_curves_esm_secp256k1_c7f9b58b.js +0 -3
- package/docker-build/standalone/.next/server/chunks/6f6aa_next_dist_esm_build_templates_app-route_1a9ee783.js +0 -6
- package/docker-build/standalone/.next/server/chunks/6f6aa_next_dist_esm_build_templates_app-route_8d132e6a.js +0 -3
- package/docker-build/standalone/.next/server/chunks/6f6aa_viem__esm_utils_ccip_bb7bf310.js +0 -3
- package/docker-build/standalone/.next/server/chunks/[externals]_next_dist_b01ab6e1._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__0928cca7._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__0c6b3bd9._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__1846bb23._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__8f8a2ff9._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__90ea784b._.js +0 -21
- package/docker-build/standalone/.next/server/chunks/[root-of-the-server]__f6379956._.js +0 -39
- package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_server-cc__next-internal_server_app__global-error_page_actions_bdbde336.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_server-cc__next-internal_server_app__not-found_page_actions_41269af3.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_server-cc__next-internal_server_app_deploy_page_actions_3988cfb8.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_server-cc__next-internal_server_app_faucet_page_actions_e5e8dd8a.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/10072_infra_server-cc__next-internal_server_app_images_page_actions_bcdfd86b.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_293382c4._.js +0 -4
- package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_55723634._.js +0 -4
- package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_821445df._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_8545ebc7._.js +0 -4
- package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_acad38a1._.js +0 -6
- package/docker-build/standalone/.next/server/chunks/ssr/2025_cc_CODECRYPTO_infra_server-cc_app_b373a582._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/6f6aa_7c51ed4c._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/6f6aa_next_dist_05cd73d5._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/6f6aa_next_dist_3e60adb5._.js +0 -6
- package/docker-build/standalone/.next/server/chunks/ssr/6f6aa_next_dist_client_components_builtin_global-error_edcabd66.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e0d983d._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f25bf3b._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__10dae68a._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__1ebd727b._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__30996048._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__587c95dd._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__6382fff8._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__8ed1042a._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__91644c56._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__a2833bcd._.js +0 -10
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__acf31a1c._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__ae009f46._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__daca67ae._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__f2ed834a._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/[root-of-the-server]__ff0dddf3._.js +0 -3
- package/docker-build/standalone/.next/server/chunks/ssr/e6d68_cc_CODECRYPTO_infra_server-cc__next-internal_server_app_page_actions_12ae3ff1.js +0 -3
- package/docker-build/standalone/.next/static/chunks/0c03a563297c48f4.js +0 -1
- package/docker-build/standalone/.next/static/chunks/3142ddfdb448fd24.js +0 -1
- package/docker-build/standalone/.next/static/chunks/35b2ae0057b43b20.js +0 -1
- package/docker-build/standalone/.next/static/chunks/5a1aef391fd12242.js +0 -1
- package/docker-build/standalone/.next/static/chunks/66401b6fc62891de.js +0 -4
- package/docker-build/standalone/.next/static/chunks/782a67ca986fb1bd.js +0 -1
- package/docker-build/standalone/.next/static/chunks/8b27abf6cb0fca62.js +0 -2
- package/docker-build/standalone/.next/static/chunks/8dba80aa68873762.css +0 -3
- package/docker-build/standalone/.next/static/chunks/902797f337bf356c.js +0 -1
- package/docker-build/standalone/.next/static/chunks/9706b17cfd50df01.js +0 -1
- package/docker-build/standalone/.next/static/chunks/df3b8eb181fde7c2.js +0 -1
- package/docker-build/standalone/.next/static/chunks/turbopack-237950634fd3a365.js +0 -4
- package/docker-build/standalone/public/deploy-test.html +0 -276
- /package/docker-build/standalone/.next/static/{ZrQJjBH5oznRmy8xN4NKX → _NbfI2TKfapiyxsQgIG3h}/_buildManifest.js +0 -0
- /package/docker-build/standalone/.next/static/{ZrQJjBH5oznRmy8xN4NKX → _NbfI2TKfapiyxsQgIG3h}/_clientMiddlewareManifest.json +0 -0
- /package/docker-build/standalone/.next/static/{ZrQJjBH5oznRmy8xN4NKX → _NbfI2TKfapiyxsQgIG3h}/_ssgManifest.js +0 -0
package/src/commands/deploy.ts
CHANGED
|
@@ -17,6 +17,8 @@ export const deployCommand = new Command('deploy')
|
|
|
17
17
|
.option('--env-file <path>', 'Path to .env file with environment variables')
|
|
18
18
|
.option('--port <port>', 'Application port', '3000')
|
|
19
19
|
.option('--domain-base <domain>', 'Domain base for deployment', 'proyectos.codecrypto.academy')
|
|
20
|
+
.option('--image-version <version>', 'Image version/tag to deploy (overrides package.json version)')
|
|
21
|
+
.option('--skip-git-check', 'Skip Git repository status check', false)
|
|
20
22
|
.action(async (projectPath: string, destFolder: string, options) => {
|
|
21
23
|
console.log(chalk.blue('\n🐳 CodeCrypto Docker Deployment\n'));
|
|
22
24
|
|
|
@@ -35,9 +37,81 @@ export const deployCommand = new Command('deploy')
|
|
|
35
37
|
process.exit(1);
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
//
|
|
40
|
+
// Validar que no hay archivos pendientes de commit (a menos que se omita)
|
|
41
|
+
if (!options.skipGitCheck) {
|
|
42
|
+
const gitCheckSpinner = ora('Checking Git status...').start();
|
|
43
|
+
try {
|
|
44
|
+
// Verificar si es un repositorio git usando git rev-parse
|
|
45
|
+
// Esto es más robusto que solo verificar .git ya que funciona con submodules y worktrees
|
|
46
|
+
let isGitRepo = false;
|
|
47
|
+
try {
|
|
48
|
+
execSync('git rev-parse --git-dir', {
|
|
49
|
+
cwd: resolvedProjectPath,
|
|
50
|
+
encoding: 'utf-8',
|
|
51
|
+
stdio: 'pipe',
|
|
52
|
+
});
|
|
53
|
+
isGitRepo = true;
|
|
54
|
+
} catch {
|
|
55
|
+
// No es un repositorio git o git no está disponible
|
|
56
|
+
isGitRepo = false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (isGitRepo) {
|
|
60
|
+
// Verificar si hay cambios sin commitear
|
|
61
|
+
try {
|
|
62
|
+
const gitStatus = execSync('git status --porcelain', {
|
|
63
|
+
cwd: resolvedProjectPath,
|
|
64
|
+
encoding: 'utf-8',
|
|
65
|
+
stdio: 'pipe',
|
|
66
|
+
}).trim();
|
|
67
|
+
|
|
68
|
+
if (gitStatus) {
|
|
69
|
+
gitCheckSpinner.fail('Uncommitted changes detected');
|
|
70
|
+
console.error(chalk.red('\n❌ Error: Hay archivos pendientes de commit en el repositorio'));
|
|
71
|
+
console.error(chalk.yellow('\n📋 Archivos modificados/sin commitear:'));
|
|
72
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
73
|
+
|
|
74
|
+
// Mostrar los archivos pendientes
|
|
75
|
+
const files = gitStatus.split('\n').filter(line => line.trim());
|
|
76
|
+
files.forEach(file => {
|
|
77
|
+
const status = file.substring(0, 2);
|
|
78
|
+
const fileName = file.substring(3);
|
|
79
|
+
let statusColor = chalk.yellow;
|
|
80
|
+
if (status.includes('A')) statusColor = chalk.green;
|
|
81
|
+
else if (status.includes('D')) statusColor = chalk.red;
|
|
82
|
+
else if (status.includes('M')) statusColor = chalk.yellow;
|
|
83
|
+
console.log(chalk.gray(` ${statusColor(status)} ${chalk.white(fileName)}`));
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
87
|
+
console.error(chalk.yellow('\n💡 Por favor, haz commit de tus cambios antes de desplegar:'));
|
|
88
|
+
console.error(chalk.cyan(' git add .'));
|
|
89
|
+
console.error(chalk.cyan(' git commit -m "your message"'));
|
|
90
|
+
console.error(chalk.yellow('\n O usa --skip-git-check para omitir esta validación (no recomendado)'));
|
|
91
|
+
process.exit(1);
|
|
92
|
+
} else {
|
|
93
|
+
gitCheckSpinner.succeed('Git repository is clean');
|
|
94
|
+
}
|
|
95
|
+
} catch (error: any) {
|
|
96
|
+
// Si git status falla, puede ser que haya algún problema
|
|
97
|
+
gitCheckSpinner.warn('Could not check Git status, continuing...');
|
|
98
|
+
if (error.message) {
|
|
99
|
+
console.log(chalk.yellow(` Warning: ${error.message}`));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
gitCheckSpinner.succeed('Not a Git repository (skipping check)');
|
|
104
|
+
}
|
|
105
|
+
} catch (error: any) {
|
|
106
|
+
gitCheckSpinner.warn('Git check failed, continuing...');
|
|
107
|
+
}
|
|
108
|
+
} else {
|
|
109
|
+
console.log(chalk.yellow('⚠️ Git status check skipped (--skip-git-check)'));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Leer versión del package.json o usar la versión especificada
|
|
39
113
|
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
40
|
-
const version = packageJson.version || 'latest';
|
|
114
|
+
const version = options.imageVersion || packageJson.version || 'latest';
|
|
41
115
|
const projectName = path.basename(resolvedProjectPath);
|
|
42
116
|
const imageBase = `jviejo/${projectName}`;
|
|
43
117
|
const imageName = `${imageBase}:${version}`;
|
|
@@ -155,6 +229,7 @@ export const deployCommand = new Command('deploy')
|
|
|
155
229
|
}
|
|
156
230
|
|
|
157
231
|
// Paso 3: Crear Dockerfile con variables NEXT_PUBLIC_*
|
|
232
|
+
const dockerfileSpinner = ora('Creating Dockerfile...').start();
|
|
158
233
|
const dockerfilePath = path.join(resolvedDestFolder, 'Dockerfile');
|
|
159
234
|
|
|
160
235
|
// Construir ARG y ENV para NEXT_PUBLIC_*
|
|
@@ -190,21 +265,71 @@ EXPOSE 3000
|
|
|
190
265
|
CMD ["node", "server.js"]
|
|
191
266
|
`;
|
|
192
267
|
fs.writeFileSync(dockerfilePath, dockerfileContent);
|
|
268
|
+
|
|
269
|
+
dockerfileSpinner.succeed('Dockerfile created');
|
|
270
|
+
|
|
271
|
+
// Mostrar contenido del Dockerfile si hay variables NEXT_PUBLIC_*
|
|
272
|
+
if (nextPublicEnvVars.length > 0) {
|
|
273
|
+
console.log(chalk.gray('\n📄 Dockerfile content:'));
|
|
274
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
275
|
+
console.log(chalk.white(dockerfileContent));
|
|
276
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
277
|
+
console.log(chalk.gray(`\n NEXT_PUBLIC_* variables: ${chalk.cyan(nextPublicEnvVars.length)}`));
|
|
278
|
+
nextPublicEnvVars.forEach(env => {
|
|
279
|
+
const [key] = env.split('=');
|
|
280
|
+
console.log(chalk.gray(` - ${chalk.cyan(key)}`));
|
|
281
|
+
});
|
|
282
|
+
} else {
|
|
283
|
+
console.log(chalk.gray('\n📄 Dockerfile created (no NEXT_PUBLIC_* variables found)'));
|
|
284
|
+
}
|
|
193
285
|
|
|
194
286
|
// Paso 4: Verificar/crear builder multi-plataforma
|
|
195
287
|
const builderSpinner = ora('Setting up multi-platform builder...').start();
|
|
196
288
|
try {
|
|
197
|
-
|
|
289
|
+
// Listar builders disponibles, ignorando errores de builders con problemas
|
|
290
|
+
let buildersOutput = '';
|
|
291
|
+
try {
|
|
292
|
+
// Redirigir stderr a /dev/null para ignorar errores de builders problemáticos
|
|
293
|
+
buildersOutput = execSync('docker buildx ls 2>/dev/null', {
|
|
294
|
+
encoding: 'utf-8',
|
|
295
|
+
stdio: 'pipe',
|
|
296
|
+
shell: '/bin/sh',
|
|
297
|
+
});
|
|
298
|
+
} catch (error) {
|
|
299
|
+
// Si hay errores al listar builders (por ejemplo, builder "cc" con problemas SSH),
|
|
300
|
+
// intentar continuar de todas formas
|
|
301
|
+
console.log(chalk.yellow('⚠️ Warning: Some builders have connection issues, continuing...'));
|
|
302
|
+
}
|
|
303
|
+
|
|
198
304
|
const builderName = 'multiarch-builder';
|
|
199
|
-
if (!
|
|
200
|
-
|
|
305
|
+
if (!buildersOutput.includes(builderName)) {
|
|
306
|
+
builderSpinner.text = 'Creating multi-platform builder...';
|
|
307
|
+
execSync(`docker buildx create --name ${builderName} --use --bootstrap`, {
|
|
308
|
+
stdio: 'pipe',
|
|
309
|
+
// No heredar stderr para evitar errores de otros builders
|
|
310
|
+
});
|
|
201
311
|
} else {
|
|
202
|
-
|
|
203
|
-
|
|
312
|
+
builderSpinner.text = 'Using existing multi-platform builder...';
|
|
313
|
+
try {
|
|
314
|
+
execSync(`docker buildx use ${builderName}`, { stdio: 'pipe' });
|
|
315
|
+
} catch (error) {
|
|
316
|
+
// Si falla, intentar crearlo de nuevo
|
|
317
|
+
builderSpinner.text = 'Recreating multi-platform builder...';
|
|
318
|
+
try {
|
|
319
|
+
execSync(`docker buildx rm ${builderName}`, { stdio: 'pipe' });
|
|
320
|
+
} catch {
|
|
321
|
+
// Ignorar si no existe
|
|
322
|
+
}
|
|
323
|
+
execSync(`docker buildx create --name ${builderName} --use --bootstrap`, { stdio: 'pipe' });
|
|
324
|
+
}
|
|
325
|
+
}
|
|
204
326
|
builderSpinner.succeed('Builder ready');
|
|
205
|
-
} catch (error) {
|
|
327
|
+
} catch (error: any) {
|
|
206
328
|
builderSpinner.fail('Failed to setup builder');
|
|
207
329
|
console.error(chalk.red('Error setting up Docker buildx builder'));
|
|
330
|
+
console.error(chalk.yellow('💡 Tip: If you have problematic builders configured, you can remove them with:'));
|
|
331
|
+
console.error(chalk.cyan(' docker buildx rm <builder-name>'));
|
|
332
|
+
console.error(chalk.yellow(' Or inspect them with: docker buildx inspect <builder-name>'));
|
|
208
333
|
process.exit(1);
|
|
209
334
|
}
|
|
210
335
|
|
|
@@ -243,6 +368,14 @@ CMD ["node", "server.js"]
|
|
|
243
368
|
--progress=plain \
|
|
244
369
|
.`;
|
|
245
370
|
|
|
371
|
+
console.log(chalk.gray('\n🔨 Build command:'));
|
|
372
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
373
|
+
console.log(chalk.cyan(buildCommand));
|
|
374
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
375
|
+
console.log(chalk.gray(`\n Working directory: ${chalk.cyan(resolvedDestFolder)}`));
|
|
376
|
+
console.log(chalk.gray(` Platforms: ${chalk.cyan('linux/amd64, linux/arm64')}`));
|
|
377
|
+
console.log(chalk.gray(` Push to registry: ${shouldPush ? chalk.green('Yes') : chalk.yellow('No')}\n`));
|
|
378
|
+
|
|
246
379
|
execSync(buildCommand, {
|
|
247
380
|
cwd: resolvedDestFolder,
|
|
248
381
|
stdio: 'inherit'
|
|
@@ -250,8 +383,9 @@ CMD ["node", "server.js"]
|
|
|
250
383
|
|
|
251
384
|
buildDockerSpinner.succeed('Docker image built successfully');
|
|
252
385
|
|
|
253
|
-
console.log(chalk.green('\n✅
|
|
254
|
-
console.log(chalk.gray('Image details:'));
|
|
386
|
+
console.log(chalk.green('\n✅ Image build and push completed successfully!'));
|
|
387
|
+
console.log(chalk.gray('📦 Image details:'));
|
|
388
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
255
389
|
console.log(chalk.white(` Platforms: ${chalk.cyan('linux/amd64, linux/arm64')}`));
|
|
256
390
|
console.log(chalk.white(` Version: ${chalk.cyan(version)}`));
|
|
257
391
|
console.log(chalk.white(` Tags:`));
|
|
@@ -260,6 +394,11 @@ CMD ["node", "server.js"]
|
|
|
260
394
|
if (shouldPush) {
|
|
261
395
|
console.log(chalk.white(` Registry: ${chalk.cyan('Docker Hub')}`));
|
|
262
396
|
console.log(chalk.white(` URL: ${chalk.cyan(`https://hub.docker.com/r/${imageBase}`)}`));
|
|
397
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
398
|
+
console.log(chalk.green(`\n✅ Image pushed to Docker Hub successfully!`));
|
|
399
|
+
} else {
|
|
400
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
401
|
+
console.log(chalk.yellow(`\n⚠️ Image built locally (not pushed to registry)`));
|
|
263
402
|
}
|
|
264
403
|
} catch (error) {
|
|
265
404
|
buildDockerSpinner.fail('Docker build failed');
|
|
@@ -272,8 +411,13 @@ CMD ["node", "server.js"]
|
|
|
272
411
|
|
|
273
412
|
// Paso 6: Desplegar en servidor remoto si se solicita
|
|
274
413
|
if (options.deploy) {
|
|
414
|
+
// Para despliegue, usar la versión especificada o la del package.json
|
|
415
|
+
const deployImageName = options.imageVersion
|
|
416
|
+
? `${imageBase}:${options.imageVersion}`
|
|
417
|
+
: (shouldPush ? imageName : imageLatest);
|
|
418
|
+
|
|
275
419
|
await deployToRemoteServer({
|
|
276
|
-
imageName:
|
|
420
|
+
imageName: deployImageName,
|
|
277
421
|
serviceName: options.serviceName || projectName,
|
|
278
422
|
domainBase: options.domainBase,
|
|
279
423
|
port: options.port,
|
|
@@ -288,6 +432,115 @@ CMD ["node", "server.js"]
|
|
|
288
432
|
}
|
|
289
433
|
});
|
|
290
434
|
|
|
435
|
+
// Función para leer certificados Docker desde token.json
|
|
436
|
+
function loadDockerCertificatesFromToken(): { caPem: string; certPem: string; keyPem: string; certPath: string } {
|
|
437
|
+
const tokenFilePath = path.join(os.homedir(), '.codecrypto', 'token.json');
|
|
438
|
+
|
|
439
|
+
if (!fs.existsSync(tokenFilePath)) {
|
|
440
|
+
throw new Error(`Token file not found at ${tokenFilePath}. Please run 'codecrypto auth' first.`);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
let tokenData: any;
|
|
444
|
+
try {
|
|
445
|
+
tokenData = JSON.parse(fs.readFileSync(tokenFilePath, 'utf-8'));
|
|
446
|
+
} catch (error: any) {
|
|
447
|
+
throw new Error(`Failed to read token file: ${error.message}`);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
if (!tokenData.adminGlobals || !Array.isArray(tokenData.adminGlobals)) {
|
|
451
|
+
throw new Error('adminGlobals not found in token.json. Please run "codecrypto auth --force" to refresh your token.');
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Buscar los certificados Docker en el array adminGlobals
|
|
455
|
+
// Las keys que buscamos son:
|
|
456
|
+
// - docker-client/ca-pem
|
|
457
|
+
// - docker-client/cert.pem
|
|
458
|
+
// - docker-client/key.pem
|
|
459
|
+
const certKeys = {
|
|
460
|
+
ca: 'docker-client/ca-pem',
|
|
461
|
+
cert: 'docker-client/cert.pem',
|
|
462
|
+
key: 'docker-client/key.pem'
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
const certificates: { ca?: string; cert?: string; key?: string } = {};
|
|
466
|
+
|
|
467
|
+
// Lista de keys encontradas para debugging
|
|
468
|
+
const foundKeys: string[] = [];
|
|
469
|
+
|
|
470
|
+
// Iterar sobre adminGlobals para encontrar los certificados
|
|
471
|
+
for (const global of tokenData.adminGlobals) {
|
|
472
|
+
if (global && global.key) {
|
|
473
|
+
foundKeys.push(global.key);
|
|
474
|
+
// Buscar cada certificado por su key exacta
|
|
475
|
+
if (global.key === certKeys.ca) {
|
|
476
|
+
certificates.ca = global.value;
|
|
477
|
+
} else if (global.key === certKeys.cert) {
|
|
478
|
+
certificates.cert = global.value;
|
|
479
|
+
} else if (global.key === certKeys.key) {
|
|
480
|
+
certificates.key = global.value;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Verificar que todos los certificados estén presentes
|
|
486
|
+
if (!certificates.ca) {
|
|
487
|
+
const availableKeys = foundKeys.filter(k => k.includes('docker-client')).join(', ') || 'none';
|
|
488
|
+
throw new Error(
|
|
489
|
+
`Certificate not found: ${certKeys.ca} in adminGlobals.\n` +
|
|
490
|
+
` Available docker-client keys: ${availableKeys || 'none'}\n` +
|
|
491
|
+
` Total adminGlobals entries: ${tokenData.adminGlobals.length}\n` +
|
|
492
|
+
` Please run "codecrypto auth --force" to refresh your token.`
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
if (!certificates.cert) {
|
|
496
|
+
const availableKeys = foundKeys.filter(k => k.includes('docker-client')).join(', ') || 'none';
|
|
497
|
+
throw new Error(
|
|
498
|
+
`Certificate not found: ${certKeys.cert} in adminGlobals.\n` +
|
|
499
|
+
` Available docker-client keys: ${availableKeys || 'none'}\n` +
|
|
500
|
+
` Total adminGlobals entries: ${tokenData.adminGlobals.length}\n` +
|
|
501
|
+
` Please run "codecrypto auth --force" to refresh your token.`
|
|
502
|
+
);
|
|
503
|
+
}
|
|
504
|
+
if (!certificates.key) {
|
|
505
|
+
const availableKeys = foundKeys.filter(k => k.includes('docker-client')).join(', ') || 'none';
|
|
506
|
+
throw new Error(
|
|
507
|
+
`Certificate not found: ${certKeys.key} in adminGlobals.\n` +
|
|
508
|
+
` Available docker-client keys: ${availableKeys || 'none'}\n` +
|
|
509
|
+
` Total adminGlobals entries: ${tokenData.adminGlobals.length}\n` +
|
|
510
|
+
` Please run "codecrypto auth --force" to refresh your token.`
|
|
511
|
+
);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// Crear directorio para certificados si no existe
|
|
515
|
+
const dockerCertPath = path.join(os.homedir(), '.codecrypto', 'docker-client');
|
|
516
|
+
if (!fs.existsSync(dockerCertPath)) {
|
|
517
|
+
fs.mkdirSync(dockerCertPath, { recursive: true });
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// Escribir certificados a archivos
|
|
521
|
+
const caPemPath = path.join(dockerCertPath, 'ca.pem');
|
|
522
|
+
const certPemPath = path.join(dockerCertPath, 'cert.pem');
|
|
523
|
+
const keyPemPath = path.join(dockerCertPath, 'key.pem');
|
|
524
|
+
|
|
525
|
+
fs.writeFileSync(caPemPath, certificates.ca, 'utf-8');
|
|
526
|
+
fs.writeFileSync(certPemPath, certificates.cert, 'utf-8');
|
|
527
|
+
fs.writeFileSync(keyPemPath, certificates.key, 'utf-8');
|
|
528
|
+
|
|
529
|
+
// Establecer permisos correctos para la clave privada (solo lectura para el propietario)
|
|
530
|
+
try {
|
|
531
|
+
fs.chmodSync(keyPemPath, 0o600);
|
|
532
|
+
} catch (error) {
|
|
533
|
+
// Ignorar errores de chmod en Windows
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
return {
|
|
537
|
+
caPem: certificates.ca,
|
|
538
|
+
certPem: certificates.cert,
|
|
539
|
+
keyPem: certificates.key,
|
|
540
|
+
certPath: dockerCertPath
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
|
|
291
544
|
// Función para desplegar en servidor remoto
|
|
292
545
|
async function deployToRemoteServer(config: {
|
|
293
546
|
imageName: string;
|
|
@@ -300,13 +553,19 @@ async function deployToRemoteServer(config: {
|
|
|
300
553
|
const deploySpinner = ora('Configuring remote Docker connection...').start();
|
|
301
554
|
|
|
302
555
|
try {
|
|
303
|
-
//
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
556
|
+
// Cargar certificados desde token.json
|
|
557
|
+
let dockerCertPath: string;
|
|
558
|
+
try {
|
|
559
|
+
const certs = loadDockerCertificatesFromToken();
|
|
560
|
+
dockerCertPath = certs.certPath;
|
|
561
|
+
deploySpinner.succeed('Docker certificates loaded from token.json');
|
|
562
|
+
} catch (error: any) {
|
|
563
|
+
deploySpinner.fail('Failed to load Docker certificates');
|
|
564
|
+
console.error(chalk.red(`❌ Error: ${error.message}`));
|
|
565
|
+
console.error(chalk.yellow('\n💡 To fix this issue:'));
|
|
566
|
+
console.error(chalk.yellow(' 1. Run: codecrypto auth --force'));
|
|
567
|
+
console.error(chalk.yellow(' 2. This will refresh your token with the latest adminGlobals'));
|
|
568
|
+
console.error(chalk.yellow(' 3. Then try the deploy command again\n'));
|
|
310
569
|
process.exit(1);
|
|
311
570
|
}
|
|
312
571
|
|
|
@@ -321,44 +580,79 @@ async function deployToRemoteServer(config: {
|
|
|
321
580
|
}
|
|
322
581
|
}
|
|
323
582
|
|
|
324
|
-
//
|
|
325
|
-
const
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
583
|
+
// Construir prefijo de comando Docker con parámetros TLS
|
|
584
|
+
const dockerHost = 'tcp://server.codecrypto.academy:2376';
|
|
585
|
+
const dockerTlsPrefix = `docker -H ${dockerHost} \\
|
|
586
|
+
--tlsverify \\
|
|
587
|
+
--tlscacert="${path.join(dockerCertPath, 'ca.pem')}" \\
|
|
588
|
+
--tlscert="${path.join(dockerCertPath, 'cert.pem')}" \\
|
|
589
|
+
--tlskey="${path.join(dockerCertPath, 'key.pem')}"`;
|
|
590
|
+
|
|
591
|
+
console.log(chalk.gray('\n🔌 Remote Docker configuration:'));
|
|
592
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
593
|
+
console.log(chalk.white(` Docker Host: ${chalk.cyan(dockerHost)}`));
|
|
594
|
+
console.log(chalk.white(` TLS Verify: ${chalk.cyan('enabled')}`));
|
|
595
|
+
console.log(chalk.white(` Certificates Source: ${chalk.cyan('token.json (adminGlobals)')}`));
|
|
596
|
+
console.log(chalk.white(` Certificates Path: ${chalk.cyan(dockerCertPath)}`));
|
|
597
|
+
console.log(chalk.gray(' Certificates loaded:'));
|
|
598
|
+
requiredCerts.forEach(cert => {
|
|
599
|
+
const certPath = path.join(dockerCertPath, cert);
|
|
600
|
+
const exists = fs.existsSync(certPath);
|
|
601
|
+
console.log(chalk.gray(` ${exists ? '✓' : '✗'} ${chalk.cyan(cert)}`));
|
|
602
|
+
});
|
|
603
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
604
|
+
console.log(chalk.yellow('\n💡 All docker commands will use TLS parameters directly\n'));
|
|
333
605
|
|
|
334
606
|
// Construir nombre completo del dominio
|
|
335
607
|
const fullDomain = `${config.serviceName}.${config.domainBase}`;
|
|
336
608
|
const serviceName = config.serviceName.toLowerCase().replace(/[^a-z0-9-]/g, '-');
|
|
337
609
|
|
|
338
610
|
// Detener y eliminar contenedor existente si existe
|
|
339
|
-
const stopSpinner = ora('Checking
|
|
611
|
+
const stopSpinner = ora('Checking and removing existing container...').start();
|
|
340
612
|
try {
|
|
341
|
-
|
|
342
|
-
|
|
613
|
+
// Verificar si el contenedor existe
|
|
614
|
+
const checkCmd = `${dockerTlsPrefix} ps -a --filter name=^${fullDomain}$ --format "{{.Names}}"`;
|
|
615
|
+
const existingContainer = execSync(checkCmd, {
|
|
343
616
|
stdio: 'pipe',
|
|
344
617
|
encoding: 'utf-8',
|
|
345
|
-
|
|
618
|
+
shell: '/bin/sh',
|
|
619
|
+
}).trim();
|
|
346
620
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
621
|
+
if (existingContainer === fullDomain) {
|
|
622
|
+
// Contenedor existe, detenerlo primero (si está corriendo)
|
|
623
|
+
try {
|
|
624
|
+
const stopCmd = `${dockerTlsPrefix} stop ${fullDomain}`;
|
|
625
|
+
execSync(stopCmd, { stdio: 'pipe', shell: '/bin/sh' });
|
|
626
|
+
console.log(chalk.gray(` ✓ Container ${fullDomain} stopped`));
|
|
627
|
+
} catch (error: any) {
|
|
628
|
+
// Container might not be running, that's okay
|
|
629
|
+
console.log(chalk.gray(` ℹ Container ${fullDomain} was not running`));
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
// Eliminar el contenedor
|
|
633
|
+
try {
|
|
634
|
+
const rmCmd = `${dockerTlsPrefix} rm -f ${fullDomain}`;
|
|
635
|
+
execSync(rmCmd, { stdio: 'pipe', shell: '/bin/sh' });
|
|
636
|
+
stopSpinner.succeed(`Existing container ${fullDomain} removed`);
|
|
637
|
+
} catch (error: any) {
|
|
638
|
+
stopSpinner.fail(`Failed to remove container ${fullDomain}`);
|
|
639
|
+
console.error(chalk.red(` Error: ${error.message}`));
|
|
640
|
+
process.exit(1);
|
|
641
|
+
}
|
|
642
|
+
} else {
|
|
643
|
+
stopSpinner.succeed('No existing container found');
|
|
352
644
|
}
|
|
353
|
-
|
|
645
|
+
} catch (error: any) {
|
|
646
|
+
// Si el comando falla, puede ser que el contenedor no exista
|
|
647
|
+
// Intentar eliminarlo de todas formas con -f para forzar
|
|
354
648
|
try {
|
|
355
|
-
|
|
356
|
-
|
|
649
|
+
const forceRmCmd = `${dockerTlsPrefix} rm -f ${fullDomain}`;
|
|
650
|
+
execSync(forceRmCmd, { stdio: 'pipe', shell: '/bin/sh' });
|
|
651
|
+
stopSpinner.succeed('Existing container removed (forced)');
|
|
357
652
|
} catch {
|
|
358
|
-
|
|
653
|
+
// Si falla, asumir que no existe y continuar
|
|
654
|
+
stopSpinner.succeed('No existing container found');
|
|
359
655
|
}
|
|
360
|
-
} catch (error) {
|
|
361
|
-
stopSpinner.warn('Could not check for existing container');
|
|
362
656
|
}
|
|
363
657
|
|
|
364
658
|
// Preparar opciones de entorno
|
|
@@ -376,12 +670,12 @@ async function deployToRemoteServer(config: {
|
|
|
376
670
|
});
|
|
377
671
|
}
|
|
378
672
|
|
|
379
|
-
// Construir comando docker run
|
|
380
|
-
const dockerRunCmd =
|
|
673
|
+
// Construir comando docker run con parámetros TLS
|
|
674
|
+
const dockerRunCmd = `${dockerTlsPrefix} run -d \\
|
|
381
675
|
--name ${fullDomain} \\
|
|
382
676
|
--network academy-network \\
|
|
383
677
|
--restart unless-stopped \\
|
|
384
|
-
${envOpts.join(' \\\n ')
|
|
678
|
+
${envOpts.length > 0 ? envOpts.join(' \\\n ') + ' \\' : ''}
|
|
385
679
|
-l traefik.enable=true \\
|
|
386
680
|
-l "traefik.http.routers.${serviceName}-router.rule=Host(\\\`${fullDomain}\\\`)" \\
|
|
387
681
|
-l traefik.http.routers.${serviceName}-router.entrypoints=websecure \\
|
|
@@ -389,11 +683,30 @@ async function deployToRemoteServer(config: {
|
|
|
389
683
|
-l traefik.http.services.${serviceName}-service.loadbalancer.server.port=${config.port} \\
|
|
390
684
|
${config.imageName}`;
|
|
391
685
|
|
|
686
|
+
console.log(chalk.gray('\n🚀 Deployment command (executing on remote Docker):'));
|
|
687
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
688
|
+
console.log(chalk.cyan(dockerRunCmd));
|
|
689
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
690
|
+
console.log(chalk.gray(`\n Remote Docker: ${chalk.cyan(dockerHost)}`));
|
|
691
|
+
console.log(chalk.gray(` TLS Certificates: ${chalk.cyan(dockerCertPath)}`));
|
|
692
|
+
console.log(chalk.gray(` Service name: ${chalk.cyan(config.serviceName)}`));
|
|
693
|
+
console.log(chalk.gray(` Full domain: ${chalk.cyan(fullDomain)}`));
|
|
694
|
+
console.log(chalk.gray(` Image: ${chalk.cyan(config.imageName)}`));
|
|
695
|
+
console.log(chalk.gray(` Port: ${chalk.cyan(config.port)}`));
|
|
696
|
+
console.log(chalk.gray(` Environment variables: ${chalk.cyan(config.envVars.length)}`));
|
|
697
|
+
if (config.envVars.length > 0) {
|
|
698
|
+
config.envVars.forEach(env => {
|
|
699
|
+
const [key] = env.split('=');
|
|
700
|
+
console.log(chalk.gray(` - ${chalk.cyan(key)}`));
|
|
701
|
+
});
|
|
702
|
+
}
|
|
703
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
704
|
+
|
|
392
705
|
const runSpinner = ora('Deploying container to remote server...').start();
|
|
393
706
|
|
|
394
707
|
try {
|
|
708
|
+
// Ejecutar comando docker con parámetros TLS directamente
|
|
395
709
|
execSync(dockerRunCmd, {
|
|
396
|
-
env: dockerEnv,
|
|
397
710
|
stdio: 'inherit',
|
|
398
711
|
shell: '/bin/sh',
|
|
399
712
|
});
|
|
@@ -401,12 +714,17 @@ async function deployToRemoteServer(config: {
|
|
|
401
714
|
runSpinner.succeed('Container deployed successfully');
|
|
402
715
|
|
|
403
716
|
console.log(chalk.green('\n✅ Remote deployment completed successfully!'));
|
|
404
|
-
console.log(chalk.gray('Deployment details:'));
|
|
717
|
+
console.log(chalk.gray('📋 Deployment details:'));
|
|
718
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
405
719
|
console.log(chalk.white(` Service: ${chalk.cyan(config.serviceName)}`));
|
|
406
720
|
console.log(chalk.white(` Domain: ${chalk.cyan(fullDomain)}`));
|
|
407
721
|
console.log(chalk.white(` URL: ${chalk.cyan(`https://${fullDomain}`)}`));
|
|
408
722
|
console.log(chalk.white(` Image: ${chalk.cyan(config.imageName)}`));
|
|
409
723
|
console.log(chalk.white(` Port: ${chalk.cyan(config.port)}`));
|
|
724
|
+
console.log(chalk.white(` Network: ${chalk.cyan('academy-network')}`));
|
|
725
|
+
console.log(chalk.white(` Restart policy: ${chalk.cyan('unless-stopped')}`));
|
|
726
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
727
|
+
console.log(chalk.green(`\n🌐 Your application is now available at: ${chalk.cyan.underline(`https://${fullDomain}`)}`));
|
|
410
728
|
} catch (error) {
|
|
411
729
|
runSpinner.fail('Failed to deploy container');
|
|
412
730
|
console.error(chalk.red('\n❌ Error deploying container to remote server'));
|