openship 0.1.1 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5786 -0
- package/dist/server/index.js +324319 -0
- package/dist/server/migrations/0000_init.sql +666 -0
- package/dist/server/migrations/0001_brief_tomorrow_man.sql +47 -0
- package/dist/server/migrations/0002_funny_dazzler.sql +2 -0
- package/dist/server/migrations/0003_third_killer_shrike.sql +1 -0
- package/dist/server/migrations/0004_session_active_org_not_null.sql +10 -0
- package/dist/server/migrations/0005_warm_amazoness.sql +3 -0
- package/dist/server/migrations/0006_lumpy_joystick.sql +1 -0
- package/dist/server/migrations/0007_outgoing_maginty.sql +2 -0
- package/dist/server/migrations/0008_frozen_cutover.sql +3 -0
- package/dist/server/migrations/0009_credits_billing.sql +142 -0
- package/dist/server/migrations/0010_credit_grant_dedupe.sql +14 -0
- package/dist/server/migrations/0011_remove_credit_ledger.sql +23 -0
- package/dist/server/migrations/0012_smart_deploys_and_git_rollback.sql +81 -0
- package/dist/server/migrations/0013_fix_check_run_rollup_unique.sql +38 -0
- package/dist/server/migrations/0014_default_rollback_git.sql +9 -0
- package/dist/server/migrations/0015_billing_idempotency_grants.sql +41 -0
- package/dist/server/migrations/0016_github_auth_high_findings.sql +30 -0
- package/dist/server/migrations/0017_spooky_rumiko_fujikawa.sql +6 -0
- package/dist/server/migrations/0018_calm_shatterstar.sql +1 -0
- package/dist/server/migrations/0019_rename_workspace_install_to_prepare.sql +1 -0
- package/dist/server/migrations/0020_uneven_the_renegades.sql +13 -0
- package/dist/server/migrations/0021_shiny_firestar.sql +2 -0
- package/dist/server/migrations/0022_version_on_success_backfill.sql +6 -0
- package/dist/server/migrations/0023_productive_gorilla_man.sql +17 -0
- package/dist/server/migrations/0024_sleepy_peter_quill.sql +2 -0
- package/dist/server/migrations/0025_smooth_blue_shield.sql +1 -0
- package/dist/server/migrations/0026_mail_backup_source.sql +11 -0
- package/dist/server/migrations/0027_opposite_anthem.sql +6 -0
- package/dist/server/migrations/0028_stale_rogue.sql +18 -0
- package/dist/server/migrations/0029_bouncy_loners.sql +16 -0
- package/dist/server/migrations/0030_bright_darkstar.sql +6 -0
- package/dist/server/migrations/0031_conscious_catseye.sql +13 -0
- package/dist/server/migrations/0032_wet_mimic.sql +51 -0
- package/dist/server/migrations/0033_eminent_molly_hayes.sql +2 -0
- package/dist/server/migrations/meta/0000_snapshot.json +5110 -0
- package/dist/server/migrations/meta/0001_snapshot.json +5257 -0
- package/dist/server/migrations/meta/0002_snapshot.json +5279 -0
- package/dist/server/migrations/meta/0003_snapshot.json +5286 -0
- package/dist/server/migrations/meta/0004_snapshot.json +5286 -0
- package/dist/server/migrations/meta/0005_snapshot.json +5305 -0
- package/dist/server/migrations/meta/0006_snapshot.json +5311 -0
- package/dist/server/migrations/meta/0007_snapshot.json +5323 -0
- package/dist/server/migrations/meta/0016_snapshot.json +6345 -0
- package/dist/server/migrations/meta/0017_snapshot.json +6383 -0
- package/dist/server/migrations/meta/0018_snapshot.json +6390 -0
- package/dist/server/migrations/meta/0019_snapshot.json +6390 -0
- package/dist/server/migrations/meta/0020_snapshot.json +6497 -0
- package/dist/server/migrations/meta/0021_snapshot.json +6509 -0
- package/dist/server/migrations/meta/0022_snapshot.json +6509 -0
- package/dist/server/migrations/meta/0023_snapshot.json +6629 -0
- package/dist/server/migrations/meta/0024_snapshot.json +6641 -0
- package/dist/server/migrations/meta/0025_snapshot.json +6648 -0
- package/dist/server/migrations/meta/0026_snapshot.json +6750 -0
- package/dist/server/migrations/meta/0027_snapshot.json +6757 -0
- package/dist/server/migrations/meta/0028_snapshot.json +6895 -0
- package/dist/server/migrations/meta/0029_snapshot.json +7028 -0
- package/dist/server/migrations/meta/0030_snapshot.json +7066 -0
- package/dist/server/migrations/meta/0031_snapshot.json +7181 -0
- package/dist/server/migrations/meta/0032_snapshot.json +7570 -0
- package/dist/server/migrations/meta/0033_snapshot.json +7597 -0
- package/dist/server/migrations/meta/_journal.json +244 -0
- package/dist/server/pglite/pglite.data +0 -0
- package/dist/server/pglite/pglite.wasm +0 -0
- package/package.json +31 -33
- package/.env.example +0 -38
- package/.nvmrc +0 -1
- package/.prettierrc +0 -7
- package/CONTRIBUTING.md +0 -90
- package/LICENSE +0 -661
- package/README.md +0 -360
- package/apps/api/.env.example +0 -30
- package/apps/api/Dockerfile +0 -22
- package/apps/api/package.json +0 -41
- package/apps/api/src/app.ts +0 -69
- package/apps/api/src/config/env.ts +0 -113
- package/apps/api/src/config/index.ts +0 -1
- package/apps/api/src/index.ts +0 -8
- package/apps/api/src/lib/auth-mode.ts +0 -42
- package/apps/api/src/lib/auth.ts +0 -105
- package/apps/api/src/lib/cache.ts +0 -128
- package/apps/api/src/lib/cloud-auth-proxy.ts +0 -310
- package/apps/api/src/lib/cloud-client.ts +0 -103
- package/apps/api/src/lib/compose-parser.ts +0 -138
- package/apps/api/src/lib/controller-helpers.ts +0 -90
- package/apps/api/src/lib/email-templates.ts +0 -94
- package/apps/api/src/lib/encryption.ts +0 -102
- package/apps/api/src/lib/local-user.ts +0 -65
- package/apps/api/src/lib/mail.ts +0 -48
- package/apps/api/src/lib/notifications.ts +0 -195
- package/apps/api/src/lib/openship-cloud.ts +0 -101
- package/apps/api/src/lib/resources.ts +0 -96
- package/apps/api/src/lib/screenshots.ts +0 -189
- package/apps/api/src/lib/ssh-manager.ts +0 -369
- package/apps/api/src/lib/ssl-scheduler.ts +0 -109
- package/apps/api/src/lib/stack-detector.ts +0 -708
- package/apps/api/src/lib/system-debug.ts +0 -10
- package/apps/api/src/middleware/auth.ts +0 -60
- package/apps/api/src/middleware/error-handler.ts +0 -41
- package/apps/api/src/middleware/index.ts +0 -5
- package/apps/api/src/middleware/internal-auth.ts +0 -40
- package/apps/api/src/middleware/local-only.ts +0 -20
- package/apps/api/src/middleware/rate-limiter.ts +0 -35
- package/apps/api/src/modules/analytics/analytics.controller.ts +0 -111
- package/apps/api/src/modules/analytics/analytics.routes.ts +0 -29
- package/apps/api/src/modules/analytics/analytics.schema.ts +0 -37
- package/apps/api/src/modules/analytics/analytics.service.ts +0 -264
- package/apps/api/src/modules/auth/auth.routes.ts +0 -237
- package/apps/api/src/modules/billing/billing.controller.ts +0 -60
- package/apps/api/src/modules/billing/billing.routes.ts +0 -34
- package/apps/api/src/modules/billing/billing.schema.ts +0 -9
- package/apps/api/src/modules/billing/billing.service.ts +0 -33
- package/apps/api/src/modules/cloud/cloud.controller.ts +0 -225
- package/apps/api/src/modules/cloud/cloud.routes.ts +0 -40
- package/apps/api/src/modules/deployments/build.service.ts +0 -791
- package/apps/api/src/modules/deployments/deployment-lifecycle.ts +0 -138
- package/apps/api/src/modules/deployments/deployment.controller.ts +0 -343
- package/apps/api/src/modules/deployments/deployment.routes.ts +0 -37
- package/apps/api/src/modules/deployments/deployment.schema.ts +0 -39
- package/apps/api/src/modules/deployments/deployment.service.ts +0 -190
- package/apps/api/src/modules/deployments/preflight.ts +0 -280
- package/apps/api/src/modules/deployments/prepare.service.ts +0 -252
- package/apps/api/src/modules/deployments/session-manager.ts +0 -283
- package/apps/api/src/modules/deployments/ssl.service.ts +0 -73
- package/apps/api/src/modules/domains/domain.controller.ts +0 -73
- package/apps/api/src/modules/domains/domain.routes.ts +0 -24
- package/apps/api/src/modules/domains/domain.schema.ts +0 -35
- package/apps/api/src/modules/domains/domain.service.ts +0 -385
- package/apps/api/src/modules/github/github.auth.ts +0 -397
- package/apps/api/src/modules/github/github.controller.ts +0 -387
- package/apps/api/src/modules/github/github.local-auth.ts +0 -251
- package/apps/api/src/modules/github/github.routes.ts +0 -50
- package/apps/api/src/modules/github/github.schema.ts +0 -52
- package/apps/api/src/modules/github/github.service.ts +0 -592
- package/apps/api/src/modules/github/github.types.ts +0 -158
- package/apps/api/src/modules/github/github.webhook.ts +0 -186
- package/apps/api/src/modules/github/index.ts +0 -16
- package/apps/api/src/modules/health/health.routes.ts +0 -45
- package/apps/api/src/modules/projects/project.controller.ts +0 -498
- package/apps/api/src/modules/projects/project.routes.ts +0 -67
- package/apps/api/src/modules/projects/project.schema.ts +0 -107
- package/apps/api/src/modules/projects/project.service.ts +0 -514
- package/apps/api/src/modules/settings/settings.controller.ts +0 -55
- package/apps/api/src/modules/settings/settings.routes.ts +0 -25
- package/apps/api/src/modules/settings/settings.service.ts +0 -49
- package/apps/api/src/modules/system/filesystem.controller.ts +0 -66
- package/apps/api/src/modules/system/index.ts +0 -1
- package/apps/api/src/modules/system/server-check.controller.ts +0 -475
- package/apps/api/src/modules/system/setup-session.ts +0 -255
- package/apps/api/src/modules/system/setup.controller.ts +0 -128
- package/apps/api/src/modules/system/system.routes.ts +0 -42
- package/apps/api/src/modules/webhooks/webhook.controller.ts +0 -64
- package/apps/api/src/modules/webhooks/webhook.routes.ts +0 -15
- package/apps/api/src/modules/webhooks/webhook.service.ts +0 -52
- package/apps/api/src/modules/webhooks/webhook.types.ts +0 -35
- package/apps/api/tsconfig.json +0 -14
- package/apps/cli/package.json +0 -26
- package/apps/cli/src/commands/deploy.ts +0 -11
- package/apps/cli/src/commands/init.ts +0 -8
- package/apps/cli/src/commands/login.ts +0 -8
- package/apps/cli/src/commands/logs.ts +0 -9
- package/apps/cli/src/index.ts +0 -21
- package/apps/cli/src/lib/api-client.ts +0 -35
- package/apps/cli/tsconfig.json +0 -13
- package/apps/dashboard/Dockerfile +0 -22
- package/apps/dashboard/components.json +0 -20
- package/apps/dashboard/next-env.d.ts +0 -6
- package/apps/dashboard/next.config.mjs +0 -16
- package/apps/dashboard/package.json +0 -40
- package/apps/dashboard/postcss.config.mjs +0 -5
- package/apps/dashboard/public/android-chrome-192x192.png +0 -0
- package/apps/dashboard/public/android-chrome-512x512.png +0 -0
- package/apps/dashboard/public/apple-touch-icon.png +0 -0
- package/apps/dashboard/public/favicon-16x16.png +0 -0
- package/apps/dashboard/public/favicon-32x32.png +0 -0
- package/apps/dashboard/public/favicon.ico +0 -0
- package/apps/dashboard/public/site.webmanifest +0 -19
- package/apps/dashboard/src/app/(auth)/forgot-password/page.tsx +0 -114
- package/apps/dashboard/src/app/(auth)/layout.tsx +0 -21
- package/apps/dashboard/src/app/(auth)/login/page.tsx +0 -220
- package/apps/dashboard/src/app/(auth)/providers.tsx +0 -34
- package/apps/dashboard/src/app/(auth)/register/page.tsx +0 -176
- package/apps/dashboard/src/app/(auth)/reset-password/page.tsx +0 -172
- package/apps/dashboard/src/app/(auth)/verify-email/page.tsx +0 -190
- package/apps/dashboard/src/app/(dashboard)/(deployment)/build/[id]/page.tsx +0 -162
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/BuildSummary.tsx +0 -166
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/DnsConfiguration.tsx +0 -119
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/DomainSettings.tsx +0 -291
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/Header.tsx +0 -71
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/Sidebar.tsx +0 -270
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/components/SkeletonLoader.tsx +0 -87
- package/apps/dashboard/src/app/(dashboard)/(deployment)/deploy/[slug]/page.tsx +0 -169
- package/apps/dashboard/src/app/(dashboard)/(deployment)/layout.tsx +0 -7
- package/apps/dashboard/src/app/(dashboard)/billing/page.tsx +0 -3
- package/apps/dashboard/src/app/(dashboard)/deployments/components/CommitDetailsModal.tsx +0 -240
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentCard.tsx +0 -121
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentHeader.tsx +0 -89
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentMenu.tsx +0 -182
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsContent.tsx +0 -324
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsFilters.tsx +0 -99
- package/apps/dashboard/src/app/(dashboard)/deployments/components/DeploymentsList.tsx +0 -31
- package/apps/dashboard/src/app/(dashboard)/deployments/components/EmptyState.tsx +0 -101
- package/apps/dashboard/src/app/(dashboard)/deployments/components/LoadingSkeleton.tsx +0 -57
- package/apps/dashboard/src/app/(dashboard)/deployments/components/ProjectFilter.tsx +0 -109
- package/apps/dashboard/src/app/(dashboard)/deployments/components/index.ts +0 -9
- package/apps/dashboard/src/app/(dashboard)/deployments/page.tsx +0 -14
- package/apps/dashboard/src/app/(dashboard)/deployments/types.ts +0 -44
- package/apps/dashboard/src/app/(dashboard)/deployments/utils.ts +0 -176
- package/apps/dashboard/src/app/(dashboard)/domains/page.tsx +0 -3
- package/apps/dashboard/src/app/(dashboard)/integrations/page.tsx +0 -321
- package/apps/dashboard/src/app/(dashboard)/layout.tsx +0 -27
- package/apps/dashboard/src/app/(dashboard)/library/components/ConnectPrompt.tsx +0 -187
- package/apps/dashboard/src/app/(dashboard)/library/components/LibrarySidebar.tsx +0 -147
- package/apps/dashboard/src/app/(dashboard)/library/components/LoadingSkeleton.tsx +0 -39
- package/apps/dashboard/src/app/(dashboard)/library/components/LocalProjects.tsx +0 -548
- package/apps/dashboard/src/app/(dashboard)/library/components/RepositoryList.tsx +0 -292
- package/apps/dashboard/src/app/(dashboard)/library/components/TemplateGrid.tsx +0 -36
- package/apps/dashboard/src/app/(dashboard)/library/components/UrlImport.tsx +0 -74
- package/apps/dashboard/src/app/(dashboard)/library/page.tsx +0 -121
- package/apps/dashboard/src/app/(dashboard)/library/types.ts +0 -26
- package/apps/dashboard/src/app/(dashboard)/monitoring/page.tsx +0 -3
- package/apps/dashboard/src/app/(dashboard)/page.tsx +0 -485
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/[[...slug]]/layout.tsx +0 -22
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/[[...slug]]/page.tsx +0 -286
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/AdvancedSettings.tsx +0 -235
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/BuildSettings.tsx +0 -174
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DeleteConfirmationDialog.tsx +0 -45
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DeletionModal.tsx +0 -95
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/Deployments.tsx +0 -11
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/DomainSettings.tsx +0 -523
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/EnvironmentSettings.tsx +0 -246
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GeneralSettings.tsx +0 -93
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GitInfo.tsx +0 -261
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/GitSettings.tsx +0 -391
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/LogsSettings.tsx +0 -133
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ProjectNotFound.tsx +0 -95
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ProjectsBottomNavigation.tsx +0 -62
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/ResourceSettings.tsx +0 -333
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SettingSection.tsx +0 -66
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SettingsNavigation.tsx +0 -27
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/SleepModeSettings.tsx +0 -134
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProductionUrl.tsx +0 -25
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProjectIdentity.tsx +0 -159
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/ProjectInfo.tsx +0 -58
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/SkeletonLoader.tsx +0 -170
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/StatsCards.tsx +0 -33
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/TopPaths.tsx +0 -56
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/TrafficChart.tsx +0 -157
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/general/index.ts +0 -14
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/LogsActions.tsx +0 -52
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/ServerLogs.tsx +0 -249
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/TerminalLogs.tsx +0 -682
- package/apps/dashboard/src/app/(dashboard)/projects/[id]/components/logs/logs.css +0 -127
- package/apps/dashboard/src/app/(dashboard)/projects/components/DeploymentCard.tsx +0 -73
- package/apps/dashboard/src/app/(dashboard)/projects/components/ProjectCard.tsx +0 -330
- package/apps/dashboard/src/app/(dashboard)/projects/page.tsx +0 -330
- package/apps/dashboard/src/app/(dashboard)/providers.tsx +0 -23
- package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/components-tab.tsx +0 -329
- package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/overview-tab.tsx +0 -229
- package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/_components/terminal-tab.tsx +0 -38
- package/apps/dashboard/src/app/(dashboard)/servers/[serverId]/page.tsx +0 -437
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/checking-state.tsx +0 -15
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/choose-mode.tsx +0 -54
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/component-row.tsx +0 -65
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/error-banner.tsx +0 -13
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/installing-panel.tsx +0 -227
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/results-panel.tsx +0 -90
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/setup-header.tsx +0 -56
- package/apps/dashboard/src/app/(dashboard)/servers/new/_components/types.ts +0 -13
- package/apps/dashboard/src/app/(dashboard)/servers/new/page.tsx +0 -666
- package/apps/dashboard/src/app/(dashboard)/servers/page.tsx +0 -283
- package/apps/dashboard/src/app/(dashboard)/settings/_components/BuildPreferences.tsx +0 -110
- package/apps/dashboard/src/app/(dashboard)/settings/_components/CloudConnection.tsx +0 -147
- package/apps/dashboard/src/app/(dashboard)/settings/_components/InstanceInfo.tsx +0 -54
- package/apps/dashboard/src/app/(dashboard)/settings/_components/ServerConnection.tsx +0 -407
- package/apps/dashboard/src/app/(dashboard)/settings/_components/SettingsSection.tsx +0 -32
- package/apps/dashboard/src/app/(dashboard)/settings/page.tsx +0 -67
- package/apps/dashboard/src/app/auth/callback/close/page.tsx +0 -23
- package/apps/dashboard/src/app/auth/callback/install/page.tsx +0 -40
- package/apps/dashboard/src/app/authorize/page.tsx +0 -137
- package/apps/dashboard/src/app/globals.css +0 -57
- package/apps/dashboard/src/app/layout.tsx +0 -55
- package/apps/dashboard/src/components/auth-shell.tsx +0 -66
- package/apps/dashboard/src/components/deployments/types.ts +0 -44
- package/apps/dashboard/src/components/global-deployments/index.ts +0 -17
- package/apps/dashboard/src/components/i18n-provider.tsx +0 -100
- package/apps/dashboard/src/components/import-project/BuildSettings.tsx +0 -376
- package/apps/dashboard/src/components/import-project/BuildSkeleton.tsx +0 -161
- package/apps/dashboard/src/components/import-project/BuildTerminal.tsx +0 -358
- package/apps/dashboard/src/components/import-project/ComposeServices.tsx +0 -455
- package/apps/dashboard/src/components/import-project/DeploymentProcessing.tsx +0 -510
- package/apps/dashboard/src/components/import-project/DockerSettings.tsx +0 -64
- package/apps/dashboard/src/components/import-project/EnvironmentVariables.tsx +0 -481
- package/apps/dashboard/src/components/import-project/Frameworks.tsx +0 -90
- package/apps/dashboard/src/components/import-project/ProjectSettings.tsx +0 -160
- package/apps/dashboard/src/components/import-project/types.ts +0 -82
- package/apps/dashboard/src/components/integrations/GithubPermissionModal.tsx +0 -173
- package/apps/dashboard/src/components/language-switcher.tsx +0 -36
- package/apps/dashboard/src/components/logo.tsx +0 -13
- package/apps/dashboard/src/components/network-error-handler.tsx +0 -27
- package/apps/dashboard/src/components/oauth-buttons.tsx +0 -81
- package/apps/dashboard/src/components/overview/ActivityChart.tsx +0 -247
- package/apps/dashboard/src/components/overview/ApiRequestsCard.tsx +0 -111
- package/apps/dashboard/src/components/overview/CreditsCard.tsx +0 -137
- package/apps/dashboard/src/components/overview/DeploymentsChart.tsx +0 -195
- package/apps/dashboard/src/components/overview/EmptyState.tsx +0 -126
- package/apps/dashboard/src/components/overview/LoadingSkeleton.tsx +0 -92
- package/apps/dashboard/src/components/overview/OverviewHeader.tsx +0 -74
- package/apps/dashboard/src/components/overview/OverviewHeroChart.tsx +0 -344
- package/apps/dashboard/src/components/overview/ProjectsCard.tsx +0 -134
- package/apps/dashboard/src/components/overview/QuickLinks.tsx +0 -119
- package/apps/dashboard/src/components/overview/SandboxesCard.tsx +0 -150
- package/apps/dashboard/src/components/overview/StatsGrid.tsx +0 -166
- package/apps/dashboard/src/components/overview/TokenUsageChart.tsx +0 -206
- package/apps/dashboard/src/components/overview/UsageStats.tsx +0 -79
- package/apps/dashboard/src/components/overview/index.ts +0 -30
- package/apps/dashboard/src/components/overview/types.ts +0 -116
- package/apps/dashboard/src/components/page-header.tsx +0 -25
- package/apps/dashboard/src/components/project-settings/ServerSideSwitch.jsx +0 -60
- package/apps/dashboard/src/components/shared/AlertBox.tsx +0 -39
- package/apps/dashboard/src/components/shared/CTASection.tsx +0 -45
- package/apps/dashboard/src/components/shared/ErrorState.tsx +0 -176
- package/apps/dashboard/src/components/shared/FeatureCard.tsx +0 -20
- package/apps/dashboard/src/components/shared/MDXComponents.tsx +0 -24
- package/apps/dashboard/src/components/shared/MachineSettingsModal.tsx +0 -286
- package/apps/dashboard/src/components/shared/Modal.tsx +0 -39
- package/apps/dashboard/src/components/shared/OTPInput.tsx +0 -122
- package/apps/dashboard/src/components/shared/PageHero.tsx +0 -21
- package/apps/dashboard/src/components/shared/PlatformFeatureCard.tsx +0 -27
- package/apps/dashboard/src/components/shared/StatCard.tsx +0 -14
- package/apps/dashboard/src/components/shared/ValueCard.tsx +0 -20
- package/apps/dashboard/src/components/shared/index.ts +0 -8
- package/apps/dashboard/src/components/sidebar.tsx +0 -282
- package/apps/dashboard/src/components/theme-provider.tsx +0 -96
- package/apps/dashboard/src/components/toast.tsx +0 -106
- package/apps/dashboard/src/components/ui/CustomCursor.tsx +0 -107
- package/apps/dashboard/src/components/ui/CustomSelect.tsx +0 -126
- package/apps/dashboard/src/components/ui/DropdownMenu.tsx +0 -174
- package/apps/dashboard/src/components/ui/FileIcon.jsx +0 -59
- package/apps/dashboard/src/components/ui/IconPickerModal.tsx +0 -273
- package/apps/dashboard/src/components/ui/InfoBanner.jsx +0 -39
- package/apps/dashboard/src/components/ui/Logo.tsx +0 -14
- package/apps/dashboard/src/components/ui/Modal.tsx +0 -117
- package/apps/dashboard/src/components/ui/PageContainer.tsx +0 -12
- package/apps/dashboard/src/components/ui/SectionContainer.jsx +0 -7
- package/apps/dashboard/src/components/ui/SlidingToggle.tsx +0 -128
- package/apps/dashboard/src/components/ui/Toast.tsx +0 -29
- package/apps/dashboard/src/components/ui/button.tsx +0 -58
- package/apps/dashboard/src/components/ui/card.tsx +0 -60
- package/apps/dashboard/src/components/ui/input.tsx +0 -20
- package/apps/dashboard/src/components/ui/label.tsx +0 -19
- package/apps/dashboard/src/components/ui/select.tsx +0 -10
- package/apps/dashboard/src/components/ui/textarea.tsx +0 -9
- package/apps/dashboard/src/constants/lang-colors.ts +0 -25
- package/apps/dashboard/src/constants/mock.ts +0 -38
- package/apps/dashboard/src/context/AuthContext.tsx +0 -91
- package/apps/dashboard/src/context/CloudContext.tsx +0 -275
- package/apps/dashboard/src/context/DeploymentContext.tsx +0 -71
- package/apps/dashboard/src/context/GitHubContext.tsx +0 -288
- package/apps/dashboard/src/context/ModalContext.tsx +0 -300
- package/apps/dashboard/src/context/NetworkContext.tsx +0 -32
- package/apps/dashboard/src/context/ProjectSettingsContext.tsx +0 -727
- package/apps/dashboard/src/context/ToastContext.tsx +0 -129
- package/apps/dashboard/src/context/deployment/index.ts +0 -3
- package/apps/dashboard/src/context/deployment/types.ts +0 -183
- package/apps/dashboard/src/context/deployment/useDeploymentBuild.ts +0 -547
- package/apps/dashboard/src/context/deployment/useDeploymentConfig.ts +0 -176
- package/apps/dashboard/src/hooks/useBuildConnection.ts +0 -334
- package/apps/dashboard/src/hooks/useMonitorStream.ts +0 -146
- package/apps/dashboard/src/hooks/useProjectData.ts +0 -110
- package/apps/dashboard/src/hooks/useSSEConnection.ts +0 -465
- package/apps/dashboard/src/hooks/useSSEStream.ts +0 -309
- package/apps/dashboard/src/hooks/useSessions.ts +0 -104
- package/apps/dashboard/src/hooks/useSetupStream.ts +0 -223
- package/apps/dashboard/src/i18n/dictionaries/ar.json +0 -218
- package/apps/dashboard/src/i18n/dictionaries/en.json +0 -218
- package/apps/dashboard/src/i18n/index.ts +0 -16
- package/apps/dashboard/src/lib/api/ai.ts +0 -22
- package/apps/dashboard/src/lib/api/auth.ts +0 -13
- package/apps/dashboard/src/lib/api/client.ts +0 -199
- package/apps/dashboard/src/lib/api/cloud.ts +0 -15
- package/apps/dashboard/src/lib/api/deploy.ts +0 -58
- package/apps/dashboard/src/lib/api/domains.ts +0 -13
- package/apps/dashboard/src/lib/api/endpoints.ts +0 -129
- package/apps/dashboard/src/lib/api/github.ts +0 -31
- package/apps/dashboard/src/lib/api/icons.ts +0 -12
- package/apps/dashboard/src/lib/api/index.ts +0 -41
- package/apps/dashboard/src/lib/api/projects.ts +0 -153
- package/apps/dashboard/src/lib/api/sandbox.ts +0 -14
- package/apps/dashboard/src/lib/api/settings.ts +0 -21
- package/apps/dashboard/src/lib/api/system.ts +0 -159
- package/apps/dashboard/src/lib/auth-client.ts +0 -54
- package/apps/dashboard/src/lib/country.ts +0 -25
- package/apps/dashboard/src/lib/server/api.ts +0 -140
- package/apps/dashboard/src/lib/server/session.ts +0 -103
- package/apps/dashboard/src/lib/sseClient.ts +0 -241
- package/apps/dashboard/src/lib/sseMessageProcessors.ts +0 -323
- package/apps/dashboard/src/lib/utils.ts +0 -6
- package/apps/dashboard/src/proxy.ts +0 -46
- package/apps/dashboard/src/styles/Toast.module.css +0 -92
- package/apps/dashboard/src/styles/fonts.css +0 -93
- package/apps/dashboard/src/styles/theme.css +0 -336
- package/apps/dashboard/src/types/research.ts +0 -42
- package/apps/dashboard/src/utils/SSEParser.js +0 -150
- package/apps/dashboard/src/utils/authWindow.ts +0 -143
- package/apps/dashboard/src/utils/codeTheme.ts +0 -127
- package/apps/dashboard/src/utils/colors.json +0 -2810
- package/apps/dashboard/src/utils/date.ts +0 -121
- package/apps/dashboard/src/utils/deployment.ts +0 -128
- package/apps/dashboard/src/utils/deploymentPhaseDetector.ts +0 -232
- package/apps/dashboard/src/utils/extToLang.js +0 -103
- package/apps/dashboard/src/utils/github.ts +0 -62
- package/apps/dashboard/src/utils/icons.js +0 -46
- package/apps/dashboard/src/utils/repoSlug.ts +0 -110
- package/apps/dashboard/src/utils/research-api.ts +0 -163
- package/apps/dashboard/src/utils/suggestions.ts +0 -84
- package/apps/dashboard/src/utils/theme.js +0 -1
- package/apps/dashboard/src/utils/ui-helpers.tsx +0 -30
- package/apps/dashboard/src/utils/upload.js +0 -12
- package/apps/dashboard/tsconfig.json +0 -33
- package/apps/desktop/forge.config.json +0 -36
- package/apps/desktop/package.json +0 -26
- package/apps/desktop/scripts/dev.mjs +0 -58
- package/apps/desktop/src/main/index.ts +0 -675
- package/apps/desktop/src/main/types/desktop.d.ts +0 -33
- package/apps/desktop/src/preload/index.ts +0 -88
- package/apps/desktop/src/renderer/index.html +0 -462
- package/apps/desktop/src/renderer/onboarding.js +0 -511
- package/apps/desktop/src/renderer/styles.css +0 -1139
- package/apps/desktop/tsconfig.json +0 -17
- package/apps/web/.source/browser.ts +0 -13
- package/apps/web/.source/dynamic.ts +0 -8
- package/apps/web/.source/server.ts +0 -22
- package/apps/web/.source/source.config.mjs +0 -20
- package/apps/web/Dockerfile +0 -22
- package/apps/web/content/blog/how-ai-builds-work.mdx +0 -55
- package/apps/web/content/blog/introducing-openship.mdx +0 -46
- package/apps/web/content/blog/self-hosting-cost-breakdown.mdx +0 -59
- package/apps/web/content/docs/_meta.json +0 -14
- package/apps/web/content/docs/api.mdx +0 -98
- package/apps/web/content/docs/cli.mdx +0 -80
- package/apps/web/content/docs/first-deployment.mdx +0 -56
- package/apps/web/content/docs/index.mdx +0 -27
- package/apps/web/content/docs/installation.mdx +0 -65
- package/apps/web/content/docs/quickstart.mdx +0 -45
- package/apps/web/next-env.d.ts +0 -6
- package/apps/web/next.config.mjs +0 -20
- package/apps/web/package.json +0 -33
- package/apps/web/postcss.config.mjs +0 -5
- package/apps/web/public/android-chrome-192x192.png +0 -0
- package/apps/web/public/android-chrome-512x512.png +0 -0
- package/apps/web/public/apple-touch-icon.png +0 -0
- package/apps/web/public/favicon-16x16.png +0 -0
- package/apps/web/public/favicon-32x32.png +0 -0
- package/apps/web/public/favicon.ico +0 -0
- package/apps/web/public/site.webmanifest +0 -1
- package/apps/web/source.config.ts +0 -17
- package/apps/web/src/app/(marketing)/layout.tsx +0 -9
- package/apps/web/src/app/(marketing)/page.tsx +0 -2
- package/apps/web/src/app/(marketing)/pricing/page.tsx +0 -10
- package/apps/web/src/app/blog/[...slug]/page.tsx +0 -247
- package/apps/web/src/app/blog/blog.css +0 -575
- package/apps/web/src/app/blog/layout.tsx +0 -50
- package/apps/web/src/app/blog/page.tsx +0 -235
- package/apps/web/src/app/docs/[[...slug]]/page.tsx +0 -67
- package/apps/web/src/app/docs/layout.tsx +0 -62
- package/apps/web/src/app/docs/toc-theme.css +0 -71
- package/apps/web/src/app/download/page.tsx +0 -396
- package/apps/web/src/app/globals.css +0 -20
- package/apps/web/src/app/layout.tsx +0 -70
- package/apps/web/src/app/page.tsx +0 -51
- package/apps/web/src/app/robots.ts +0 -15
- package/apps/web/src/app/sitemap.ts +0 -35
- package/apps/web/src/components/blog/share-sidebar.tsx +0 -81
- package/apps/web/src/components/blog/writer-sidebar.tsx +0 -81
- package/apps/web/src/components/landing/ai-native.tsx +0 -169
- package/apps/web/src/components/landing/backups.tsx +0 -139
- package/apps/web/src/components/landing/cdn.tsx +0 -109
- package/apps/web/src/components/landing/coming-soon.tsx +0 -180
- package/apps/web/src/components/landing/dark-section.tsx +0 -166
- package/apps/web/src/components/landing/dashboard.tsx +0 -407
- package/apps/web/src/components/landing/developer-experience.tsx +0 -224
- package/apps/web/src/components/landing/dns-domains.tsx +0 -146
- package/apps/web/src/components/landing/download-button.tsx +0 -151
- package/apps/web/src/components/landing/features/ai-visual.tsx +0 -48
- package/apps/web/src/components/landing/features/cloud-visual.tsx +0 -44
- package/apps/web/src/components/landing/features/git-visual.tsx +0 -61
- package/apps/web/src/components/landing/features/index.tsx +0 -642
- package/apps/web/src/components/landing/features/infra-visual.tsx +0 -69
- package/apps/web/src/components/landing/features/rollback-visual.tsx +0 -42
- package/apps/web/src/components/landing/features/ssl-visual.tsx +0 -41
- package/apps/web/src/components/landing/features/stacks-visual.tsx +0 -54
- package/apps/web/src/components/landing/final-cta.tsx +0 -116
- package/apps/web/src/components/landing/footer.tsx +0 -145
- package/apps/web/src/components/landing/hero.tsx +0 -110
- package/apps/web/src/components/landing/how-it-works.tsx +0 -210
- package/apps/web/src/components/landing/index.ts +0 -21
- package/apps/web/src/components/landing/mail-server.tsx +0 -122
- package/apps/web/src/components/landing/navbar.tsx +0 -199
- package/apps/web/src/components/landing/no-lockin.tsx +0 -185
- package/apps/web/src/components/landing/open-source-cta.tsx +0 -151
- package/apps/web/src/components/landing/portability.tsx +0 -190
- package/apps/web/src/components/landing/pricing.tsx +0 -263
- package/apps/web/src/components/landing/scaling.tsx +0 -209
- package/apps/web/src/components/landing/why-openship.tsx +0 -291
- package/apps/web/src/hooks/use-gsap-scroll.ts +0 -158
- package/apps/web/src/hooks/use-platform.ts +0 -86
- package/apps/web/src/lib/source.ts +0 -12
- package/apps/web/src/styles/fonts.css +0 -84
- package/apps/web/src/styles/landing.css +0 -951
- package/apps/web/src/styles/theme.css +0 -227
- package/apps/web/tsconfig.json +0 -16
- package/bun.lock +0 -3260
- package/docker-compose.yml +0 -90
- package/docs/screenshots/.gitkeep +0 -0
- package/docs/screenshots/screen.png +0 -0
- package/openship.code-workspace +0 -7
- package/packages/adapters/docs/ARCHITECTURE.md +0 -160
- package/packages/adapters/docs/BUILD-PIPELINE.md +0 -171
- package/packages/adapters/docs/CLOUD.md +0 -239
- package/packages/adapters/docs/EXECUTOR.md +0 -174
- package/packages/adapters/docs/LOG-STREAMING.md +0 -175
- package/packages/adapters/docs/SYSTEM.md +0 -191
- package/packages/adapters/package.json +0 -32
- package/packages/adapters/src/index.ts +0 -144
- package/packages/adapters/src/infra/cloud.ts +0 -42
- package/packages/adapters/src/infra/index.ts +0 -9
- package/packages/adapters/src/infra/noop.ts +0 -27
- package/packages/adapters/src/infra/traefik.ts +0 -297
- package/packages/adapters/src/infra/types.ts +0 -36
- package/packages/adapters/src/platform.ts +0 -255
- package/packages/adapters/src/runtime/bare.ts +0 -567
- package/packages/adapters/src/runtime/build-pipeline.ts +0 -237
- package/packages/adapters/src/runtime/cloud.ts +0 -791
- package/packages/adapters/src/runtime/deploy-pipeline.ts +0 -146
- package/packages/adapters/src/runtime/docker.ts +0 -443
- package/packages/adapters/src/runtime/index.ts +0 -69
- package/packages/adapters/src/runtime/local-build.ts +0 -112
- package/packages/adapters/src/runtime/transfer.ts +0 -82
- package/packages/adapters/src/runtime/types.ts +0 -138
- package/packages/adapters/src/system/catalog.ts +0 -188
- package/packages/adapters/src/system/checks.ts +0 -228
- package/packages/adapters/src/system/components.ts +0 -45
- package/packages/adapters/src/system/debug.ts +0 -18
- package/packages/adapters/src/system/environment.ts +0 -168
- package/packages/adapters/src/system/errors.ts +0 -34
- package/packages/adapters/src/system/executor.ts +0 -600
- package/packages/adapters/src/system/index.ts +0 -58
- package/packages/adapters/src/system/installer.ts +0 -310
- package/packages/adapters/src/system/setup.ts +0 -442
- package/packages/adapters/src/system/state.ts +0 -96
- package/packages/adapters/src/system/types.ts +0 -116
- package/packages/adapters/src/toolchain/catalog.ts +0 -439
- package/packages/adapters/src/toolchain/checks.ts +0 -181
- package/packages/adapters/src/toolchain/index.ts +0 -38
- package/packages/adapters/src/toolchain/installer.ts +0 -189
- package/packages/adapters/src/toolchain/types.ts +0 -84
- package/packages/adapters/src/types.ts +0 -277
- package/packages/adapters/tsconfig.json +0 -11
- package/packages/core/package.json +0 -27
- package/packages/core/src/constants.ts +0 -71
- package/packages/core/src/errors.ts +0 -49
- package/packages/core/src/index.ts +0 -6
- package/packages/core/src/stacks.ts +0 -778
- package/packages/core/src/system.ts +0 -111
- package/packages/core/src/types.ts +0 -68
- package/packages/core/src/utils.ts +0 -43
- package/packages/core/tsconfig.json +0 -11
- package/packages/db/drizzle/0000_init.sql +0 -231
- package/packages/db/drizzle/0001_add_server_name.sql +0 -1
- package/packages/db/drizzle/meta/_journal.json +0 -20
- package/packages/db/drizzle.config.ts +0 -10
- package/packages/db/package.json +0 -44
- package/packages/db/src/client.ts +0 -119
- package/packages/db/src/index.ts +0 -60
- package/packages/db/src/repos/account.repo.ts +0 -92
- package/packages/db/src/repos/deployment.repo.ts +0 -168
- package/packages/db/src/repos/domain.repo.ts +0 -102
- package/packages/db/src/repos/git-installation.repo.ts +0 -95
- package/packages/db/src/repos/index.ts +0 -43
- package/packages/db/src/repos/instance-settings.repo.ts +0 -43
- package/packages/db/src/repos/project.repo.ts +0 -159
- package/packages/db/src/repos/session.repo.ts +0 -82
- package/packages/db/src/repos/settings.repo.ts +0 -51
- package/packages/db/src/repos/user.repo.ts +0 -94
- package/packages/db/src/schema/auth.ts +0 -56
- package/packages/db/src/schema/deployment.ts +0 -87
- package/packages/db/src/schema/domain.ts +0 -46
- package/packages/db/src/schema/github.ts +0 -24
- package/packages/db/src/schema/index.ts +0 -6
- package/packages/db/src/schema/project.ts +0 -117
- package/packages/db/src/schema/settings.ts +0 -103
- package/packages/db/tsconfig.json +0 -11
- package/packages/ui/package.json +0 -38
- package/packages/ui/src/components/badge.tsx +0 -29
- package/packages/ui/src/components/button.tsx +0 -44
- package/packages/ui/src/components/card.tsx +0 -26
- package/packages/ui/src/components/status-dot.tsx +0 -25
- package/packages/ui/src/globals.css +0 -18
- package/packages/ui/src/index.tsx +0 -8
- package/packages/ui/src/lib/cn.ts +0 -7
- package/packages/ui/tsconfig.json +0 -14
- package/pnpm-workspace.yaml +0 -3
- package/tsconfig.base.json +0 -18
- package/turbo.json +0 -36
|
@@ -1,442 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SystemManager — orchestrates server provisioning for self-hosted deployments.
|
|
3
|
-
*
|
|
4
|
-
* Design:
|
|
5
|
-
* - All commands run through CommandExecutor (local or SSH)
|
|
6
|
-
* - Setup state is CACHED in a SetupStateStore (DB or file)
|
|
7
|
-
* - Re-checks only happen when explicitly requested or on first boot
|
|
8
|
-
* - Installers receive pre-collected config (no interactive prompts)
|
|
9
|
-
*
|
|
10
|
-
* Typical flow:
|
|
11
|
-
* 1. Dashboard shows setup wizard → collects InstallerConfig
|
|
12
|
-
* 2. API calls manager.setup(config, onLog)
|
|
13
|
-
* 3. Manager checks → installs missing → validates → caches state
|
|
14
|
-
* 4. Subsequent operations call manager.isReady() → reads cache
|
|
15
|
-
* 5. Operations call manager.requireFeature("deploy") → fast path
|
|
16
|
-
*
|
|
17
|
-
* Re-verification:
|
|
18
|
-
* - If 24 hours since last verification, checkAll is re-run
|
|
19
|
-
* - If any operation fails with a "missing component" error,
|
|
20
|
-
* the service layer calls manager.invalidate() to clear cache
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import type { CommandExecutor, LogEntry } from "../types";
|
|
24
|
-
import { checkAll, checkComponents, COMPONENT_CHECKS } from "./checks";
|
|
25
|
-
import { COMPONENT_INSTALLERS } from "./installer";
|
|
26
|
-
import {
|
|
27
|
-
type SetupStateStore,
|
|
28
|
-
type SetupState,
|
|
29
|
-
type ComponentState,
|
|
30
|
-
FileStateStore,
|
|
31
|
-
} from "./state";
|
|
32
|
-
import type {
|
|
33
|
-
ComponentStatus,
|
|
34
|
-
Feature,
|
|
35
|
-
FeatureReadiness,
|
|
36
|
-
InstallerConfig,
|
|
37
|
-
InstallResult,
|
|
38
|
-
PrerequisiteRule,
|
|
39
|
-
RuntimeMode,
|
|
40
|
-
SetupResult,
|
|
41
|
-
SystemLogCallback,
|
|
42
|
-
SystemLog,
|
|
43
|
-
} from "./types";
|
|
44
|
-
|
|
45
|
-
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
46
|
-
|
|
47
|
-
/** How long cached state is considered valid before re-verification (24h). */
|
|
48
|
-
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
49
|
-
|
|
50
|
-
const DOCKER_RULES: PrerequisiteRule[] = [
|
|
51
|
-
{ feature: "build", requires: ["git", "docker"], message: "Build requires Git and Docker" },
|
|
52
|
-
{ feature: "deploy", requires: ["docker"], message: "Deploy requires Docker" },
|
|
53
|
-
{ feature: "routing", requires: ["traefik"], message: "Routing requires Traefik" },
|
|
54
|
-
{ feature: "ssl", requires: ["traefik"], message: "SSL requires Traefik with ACME" },
|
|
55
|
-
];
|
|
56
|
-
|
|
57
|
-
const BARE_RULES: PrerequisiteRule[] = [
|
|
58
|
-
{ feature: "build", requires: ["git", "node"], message: "Build requires Git and Node.js" },
|
|
59
|
-
{ feature: "deploy", requires: ["node"], message: "Deploy requires Node.js" },
|
|
60
|
-
{ feature: "routing", requires: ["traefik"], message: "Routing requires Traefik" },
|
|
61
|
-
{ feature: "ssl", requires: ["traefik"], message: "SSL requires Traefik with ACME" },
|
|
62
|
-
];
|
|
63
|
-
|
|
64
|
-
const REQUIRED_COMPONENTS: Record<RuntimeMode, string[]> = {
|
|
65
|
-
docker: ["docker", "git", "traefik"],
|
|
66
|
-
bare: ["node", "git", "traefik"],
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
// ─── SystemManager ───────────────────────────────────────────────────────────
|
|
70
|
-
|
|
71
|
-
export interface SystemManagerOptions {
|
|
72
|
-
/** Command executor (local or SSH) */
|
|
73
|
-
executor: CommandExecutor;
|
|
74
|
-
/**
|
|
75
|
-
* State store for caching setup results.
|
|
76
|
-
* Defaults to FileStateStore if not provided.
|
|
77
|
-
*/
|
|
78
|
-
stateStore?: SetupStateStore;
|
|
79
|
-
/** Pre-collected installer configuration */
|
|
80
|
-
installerConfig?: InstallerConfig;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export class SystemManager {
|
|
84
|
-
readonly mode: RuntimeMode;
|
|
85
|
-
readonly executor: CommandExecutor;
|
|
86
|
-
|
|
87
|
-
private readonly rules: PrerequisiteRule[];
|
|
88
|
-
private readonly required: string[];
|
|
89
|
-
private readonly stateStore: SetupStateStore;
|
|
90
|
-
private readonly installerConfig: InstallerConfig;
|
|
91
|
-
|
|
92
|
-
/** In-memory cache to avoid even reading from disk/DB on hot paths. */
|
|
93
|
-
private cachedState: SetupState | null = null;
|
|
94
|
-
|
|
95
|
-
constructor(mode: RuntimeMode, opts: SystemManagerOptions) {
|
|
96
|
-
this.mode = mode;
|
|
97
|
-
this.executor = opts.executor;
|
|
98
|
-
this.rules = mode === "docker" ? DOCKER_RULES : BARE_RULES;
|
|
99
|
-
this.required = REQUIRED_COMPONENTS[mode];
|
|
100
|
-
this.stateStore = opts.stateStore ?? new FileStateStore(opts.executor);
|
|
101
|
-
this.installerConfig = opts.installerConfig ?? {};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// ── Fast-path state queries (cached) ─────────────────────────────────
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Is the server fully set up? Reads from cache — never runs checks.
|
|
108
|
-
*
|
|
109
|
-
* Returns false if:
|
|
110
|
-
* - No cached state (first boot)
|
|
111
|
-
* - Cached state says setupComplete = false
|
|
112
|
-
* - Cache is stale (> 24h since last verification)
|
|
113
|
-
*
|
|
114
|
-
* Use this on hot paths (every request). It's essentially free.
|
|
115
|
-
*/
|
|
116
|
-
async isReady(): Promise<boolean> {
|
|
117
|
-
const state = await this.loadState();
|
|
118
|
-
if (!state?.setupComplete) return false;
|
|
119
|
-
|
|
120
|
-
// If cache is stale, trigger background re-verification
|
|
121
|
-
if (this.isStale(state)) {
|
|
122
|
-
// Don't await — let it run in the background
|
|
123
|
-
this.verify().catch(() => {});
|
|
124
|
-
// Still return true — stale cache is better than blocking
|
|
125
|
-
return true;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return true;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Get the cached setup state without running any checks.
|
|
133
|
-
* Returns null if no state has been stored yet.
|
|
134
|
-
*/
|
|
135
|
-
async getState(): Promise<SetupState | null> {
|
|
136
|
-
return this.loadState();
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// ── Status checks (run on demand) ────────────────────────────────────
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Check all registered components — runs actual system commands.
|
|
143
|
-
* Updates the cached state with fresh results.
|
|
144
|
-
*/
|
|
145
|
-
async checkAll(): Promise<import("./types").SystemCheckResult> {
|
|
146
|
-
const components = await checkAll(this.executor);
|
|
147
|
-
|
|
148
|
-
const missing = components
|
|
149
|
-
.filter((c) => this.required.includes(c.name) && !c.healthy)
|
|
150
|
-
.map((c) => c.name);
|
|
151
|
-
|
|
152
|
-
// Update cached state
|
|
153
|
-
await this.updateStateFromChecks(components);
|
|
154
|
-
|
|
155
|
-
return { components, ready: missing.length === 0, missing };
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/** Check only the components required for this runtime mode. */
|
|
159
|
-
async checkRequired(): Promise<import("./types").SystemCheckResult> {
|
|
160
|
-
const components = await checkComponents(this.executor, this.required);
|
|
161
|
-
|
|
162
|
-
const missing = components.filter((c) => !c.healthy).map((c) => c.name);
|
|
163
|
-
|
|
164
|
-
await this.updateStateFromChecks(components);
|
|
165
|
-
|
|
166
|
-
return { components, ready: missing.length === 0, missing };
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Check whether a specific feature is ready.
|
|
171
|
-
*
|
|
172
|
-
* Fast path: if cached state shows all prerequisites installed,
|
|
173
|
-
* returns immediately without running system commands.
|
|
174
|
-
*/
|
|
175
|
-
async checkFeature(feature: Feature): Promise<FeatureReadiness> {
|
|
176
|
-
const rule = this.rules.find((r) => r.feature === feature);
|
|
177
|
-
if (!rule) {
|
|
178
|
-
return { feature, ready: true, missing: [], message: `No prerequisites for "${feature}"` };
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Try fast path from cached state
|
|
182
|
-
const state = await this.loadState();
|
|
183
|
-
if (state?.setupComplete) {
|
|
184
|
-
const allPresent = rule.requires.every(
|
|
185
|
-
(name) => state.components[name]?.installed,
|
|
186
|
-
);
|
|
187
|
-
if (allPresent) {
|
|
188
|
-
return { feature, ready: true, missing: [], message: `${feature} is ready` };
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Slow path: actually check the components
|
|
193
|
-
const statuses = await checkComponents(this.executor, rule.requires);
|
|
194
|
-
const unhealthy = statuses.filter((s) => !s.healthy);
|
|
195
|
-
|
|
196
|
-
return {
|
|
197
|
-
feature,
|
|
198
|
-
ready: unhealthy.length === 0,
|
|
199
|
-
missing: unhealthy,
|
|
200
|
-
message:
|
|
201
|
-
unhealthy.length === 0
|
|
202
|
-
? `${feature} is ready`
|
|
203
|
-
: `${rule.message} — missing: ${unhealthy.map((s) => s.name).join(", ")}`,
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/**
|
|
208
|
-
* Require a feature to be ready, or throw.
|
|
209
|
-
*
|
|
210
|
-
* Fast path reads cached state. Use before operations:
|
|
211
|
-
* await system.requireFeature("deploy");
|
|
212
|
-
*/
|
|
213
|
-
async requireFeature(feature: Feature): Promise<void> {
|
|
214
|
-
const readiness = await this.checkFeature(feature);
|
|
215
|
-
if (!readiness.ready) {
|
|
216
|
-
throw new Error(readiness.message);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// ── Installation ─────────────────────────────────────────────────────
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Install a single component with streamed logs.
|
|
224
|
-
*/
|
|
225
|
-
async installComponent(
|
|
226
|
-
name: string,
|
|
227
|
-
onLog?: SystemLogCallback,
|
|
228
|
-
): Promise<InstallResult> {
|
|
229
|
-
const logFn = onLog ?? (() => {});
|
|
230
|
-
|
|
231
|
-
const installer = COMPONENT_INSTALLERS[name];
|
|
232
|
-
if (!installer) {
|
|
233
|
-
logFn(info(`No installer available for "${name}"`));
|
|
234
|
-
return { component: name, success: false, error: `No installer for "${name}"` };
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
const result = await installer(this.executor, logFn, this.installerConfig);
|
|
238
|
-
|
|
239
|
-
// Update state for this component
|
|
240
|
-
if (result.success) {
|
|
241
|
-
await this.markComponentInstalled(name, result.version);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
return result;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Full setup: check → install missing → validate → cache state.
|
|
249
|
-
*
|
|
250
|
-
* This is the main provisioning entrypoint called from the dashboard
|
|
251
|
-
* setup wizard. The InstallerConfig should be pre-collected from the
|
|
252
|
-
* user (ACME email, domain, etc.) before calling this.
|
|
253
|
-
*/
|
|
254
|
-
async setup(onLog?: SystemLogCallback, config?: InstallerConfig): Promise<SetupResult> {
|
|
255
|
-
const logFn = onLog ?? (() => {});
|
|
256
|
-
const installerConfig = config ?? this.installerConfig;
|
|
257
|
-
|
|
258
|
-
logFn(info(`Starting ${this.mode} server setup...`));
|
|
259
|
-
logFn(info(`Required components: ${this.required.join(", ")}`));
|
|
260
|
-
|
|
261
|
-
// Phase 1: Check current state
|
|
262
|
-
logFn(info("Checking installed components..."));
|
|
263
|
-
const initial = await this.checkRequired();
|
|
264
|
-
|
|
265
|
-
const alreadyInstalled = initial.components
|
|
266
|
-
.filter((c) => c.healthy)
|
|
267
|
-
.map((c) => c.name);
|
|
268
|
-
|
|
269
|
-
if (alreadyInstalled.length > 0) {
|
|
270
|
-
logFn(info(`Already installed: ${alreadyInstalled.join(", ")}`));
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
if (initial.ready) {
|
|
274
|
-
logFn(info("All components are already installed — nothing to do"));
|
|
275
|
-
await this.markSetupComplete();
|
|
276
|
-
return { installed: [], skipped: alreadyInstalled, failed: [], ready: true };
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
logFn(info(`Missing: ${initial.missing.join(", ")}`));
|
|
280
|
-
|
|
281
|
-
// Phase 2: Install each missing component
|
|
282
|
-
const installed: InstallResult[] = [];
|
|
283
|
-
const failed: InstallResult[] = [];
|
|
284
|
-
|
|
285
|
-
for (const name of initial.missing) {
|
|
286
|
-
logFn(info(`\n── Installing ${name} ${"─".repeat(50)}`));
|
|
287
|
-
|
|
288
|
-
const installer = COMPONENT_INSTALLERS[name];
|
|
289
|
-
if (!installer) {
|
|
290
|
-
const result = { component: name, success: false, error: `No installer for "${name}"` };
|
|
291
|
-
failed.push(result);
|
|
292
|
-
continue;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
const result = await installer(this.executor, logFn, installerConfig);
|
|
296
|
-
|
|
297
|
-
if (result.success) {
|
|
298
|
-
installed.push(result);
|
|
299
|
-
await this.markComponentInstalled(name, result.version);
|
|
300
|
-
} else {
|
|
301
|
-
failed.push(result);
|
|
302
|
-
logFn(info(`Failed to install ${name}: ${result.error}`));
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
// Phase 3: Validate
|
|
307
|
-
logFn(info("\nValidating installation..."));
|
|
308
|
-
const final = await this.checkRequired();
|
|
309
|
-
|
|
310
|
-
if (final.ready) {
|
|
311
|
-
logFn(info("Server setup complete — all components healthy"));
|
|
312
|
-
await this.markSetupComplete();
|
|
313
|
-
} else {
|
|
314
|
-
logFn({
|
|
315
|
-
timestamp: new Date().toISOString(),
|
|
316
|
-
message: `Setup incomplete — still missing: ${final.missing.join(", ")}`,
|
|
317
|
-
level: "warn",
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
return {
|
|
322
|
-
installed,
|
|
323
|
-
skipped: alreadyInstalled,
|
|
324
|
-
failed,
|
|
325
|
-
ready: final.ready,
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// ── State management ─────────────────────────────────────────────────
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Invalidate the cached state.
|
|
333
|
-
*
|
|
334
|
-
* Call this when an operation fails because a component is missing
|
|
335
|
-
* (e.g., Docker daemon went down). The next `isReady()` call will
|
|
336
|
-
* return false, and `requireFeature()` will re-check.
|
|
337
|
-
*/
|
|
338
|
-
async invalidate(): Promise<void> {
|
|
339
|
-
this.cachedState = null;
|
|
340
|
-
await this.stateStore.clear();
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Force re-verification: run all checks and update state.
|
|
345
|
-
* Called automatically when cache is stale, or manually by the user.
|
|
346
|
-
*/
|
|
347
|
-
async verify(): Promise<import("./types").SystemCheckResult> {
|
|
348
|
-
const result = await this.checkAll();
|
|
349
|
-
return result;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// ── Utilities ────────────────────────────────────────────────────────
|
|
353
|
-
|
|
354
|
-
getRules(): PrerequisiteRule[] {
|
|
355
|
-
return [...this.rules];
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
getRequired(): string[] {
|
|
359
|
-
return [...this.required];
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
// ── Internal state helpers ───────────────────────────────────────────
|
|
363
|
-
|
|
364
|
-
private async loadState(): Promise<SetupState | null> {
|
|
365
|
-
if (this.cachedState) return this.cachedState;
|
|
366
|
-
this.cachedState = await this.stateStore.get();
|
|
367
|
-
return this.cachedState;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
private isStale(state: SetupState): boolean {
|
|
371
|
-
if (!state.lastVerifiedAt) return true;
|
|
372
|
-
const age = Date.now() - new Date(state.lastVerifiedAt).getTime();
|
|
373
|
-
return age > CACHE_TTL_MS;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
private async updateStateFromChecks(
|
|
377
|
-
components: ComponentStatus[],
|
|
378
|
-
): Promise<void> {
|
|
379
|
-
const existing = (await this.loadState()) ?? this.emptyState();
|
|
380
|
-
|
|
381
|
-
for (const c of components) {
|
|
382
|
-
existing.components[c.name] = {
|
|
383
|
-
installed: c.installed,
|
|
384
|
-
version: c.version,
|
|
385
|
-
installedAt: existing.components[c.name]?.installedAt,
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
const allRequired = this.required.every(
|
|
390
|
-
(name) => existing.components[name]?.installed,
|
|
391
|
-
);
|
|
392
|
-
|
|
393
|
-
existing.setupComplete = allRequired;
|
|
394
|
-
existing.lastVerifiedAt = new Date().toISOString();
|
|
395
|
-
existing.updatedAt = new Date().toISOString();
|
|
396
|
-
|
|
397
|
-
this.cachedState = existing;
|
|
398
|
-
await this.stateStore.set(existing);
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
private async markComponentInstalled(
|
|
402
|
-
name: string,
|
|
403
|
-
version?: string,
|
|
404
|
-
): Promise<void> {
|
|
405
|
-
const state = (await this.loadState()) ?? this.emptyState();
|
|
406
|
-
|
|
407
|
-
state.components[name] = {
|
|
408
|
-
installed: true,
|
|
409
|
-
version,
|
|
410
|
-
installedAt: new Date().toISOString(),
|
|
411
|
-
};
|
|
412
|
-
state.updatedAt = new Date().toISOString();
|
|
413
|
-
|
|
414
|
-
this.cachedState = state;
|
|
415
|
-
await this.stateStore.set(state);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
private async markSetupComplete(): Promise<void> {
|
|
419
|
-
const state = (await this.loadState()) ?? this.emptyState();
|
|
420
|
-
state.setupComplete = true;
|
|
421
|
-
state.lastVerifiedAt = new Date().toISOString();
|
|
422
|
-
state.updatedAt = new Date().toISOString();
|
|
423
|
-
|
|
424
|
-
this.cachedState = state;
|
|
425
|
-
await this.stateStore.set(state);
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
private emptyState(): SetupState {
|
|
429
|
-
return {
|
|
430
|
-
setupComplete: false,
|
|
431
|
-
mode: this.mode,
|
|
432
|
-
components: {},
|
|
433
|
-
updatedAt: new Date().toISOString(),
|
|
434
|
-
};
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
439
|
-
|
|
440
|
-
function info(message: string): SystemLog {
|
|
441
|
-
return { timestamp: new Date().toISOString(), message, level: "info" };
|
|
442
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Setup state persistence — avoids running system checks on every operation.
|
|
3
|
-
*
|
|
4
|
-
* The system layer checks whether Docker, Traefik, Git, etc. are installed.
|
|
5
|
-
* Running these checks on every deploy/build request is wasteful. Instead,
|
|
6
|
-
* we store the setup state and only re-check when:
|
|
7
|
-
* - First boot (no state exists)
|
|
8
|
-
* - User explicitly requests a re-check
|
|
9
|
-
* - A component operation fails (invalidates cached state)
|
|
10
|
-
*
|
|
11
|
-
* Architecture:
|
|
12
|
-
* SetupStateStore is an INTERFACE so the API layer can provide a
|
|
13
|
-
* DB-backed implementation. The default FileStateStore writes to disk
|
|
14
|
-
* as a fallback for environments without a database.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import type { CommandExecutor } from "../types";
|
|
18
|
-
|
|
19
|
-
// ─── Types ───────────────────────────────────────────────────────────────────
|
|
20
|
-
|
|
21
|
-
/** Stored per-component state */
|
|
22
|
-
export interface ComponentState {
|
|
23
|
-
installed: boolean;
|
|
24
|
-
version?: string;
|
|
25
|
-
installedAt?: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/** Full setup state — persisted between restarts */
|
|
29
|
-
export interface SetupState {
|
|
30
|
-
/** Whether the initial setup flow has been completed */
|
|
31
|
-
setupComplete: boolean;
|
|
32
|
-
/** Runtime mode when setup was performed */
|
|
33
|
-
mode: "docker" | "bare";
|
|
34
|
-
/** Per-component state keyed by name */
|
|
35
|
-
components: Record<string, ComponentState>;
|
|
36
|
-
/**
|
|
37
|
-
* ISO timestamp of last full verification.
|
|
38
|
-
* Used to decide if we should re-verify (e.g. after 24h).
|
|
39
|
-
*/
|
|
40
|
-
lastVerifiedAt?: string;
|
|
41
|
-
/** ISO timestamp of last state update */
|
|
42
|
-
updatedAt: string;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Interface for persisting setup state.
|
|
47
|
-
*
|
|
48
|
-
* The API layer provides a DB-backed implementation.
|
|
49
|
-
* FileStateStore is the built-in fallback.
|
|
50
|
-
*/
|
|
51
|
-
export interface SetupStateStore {
|
|
52
|
-
get(): Promise<SetupState | null>;
|
|
53
|
-
set(state: SetupState): Promise<void>;
|
|
54
|
-
clear(): Promise<void>;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// ─── File-based state store ──────────────────────────────────────────────────
|
|
58
|
-
|
|
59
|
-
const DEFAULT_STATE_PATH = "/etc/openship/setup-state.json";
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Persists setup state to a JSON file.
|
|
63
|
-
*
|
|
64
|
-
* Works both locally (node:fs) and remotely (via CommandExecutor) so the
|
|
65
|
-
* same store works regardless of whether the server is local or SSH.
|
|
66
|
-
*/
|
|
67
|
-
export class FileStateStore implements SetupStateStore {
|
|
68
|
-
private readonly statePath: string;
|
|
69
|
-
private readonly executor: CommandExecutor;
|
|
70
|
-
|
|
71
|
-
constructor(executor: CommandExecutor, statePath?: string) {
|
|
72
|
-
this.executor = executor;
|
|
73
|
-
this.statePath = statePath ?? DEFAULT_STATE_PATH;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
async get(): Promise<SetupState | null> {
|
|
77
|
-
try {
|
|
78
|
-
const exists = await this.executor.exists(this.statePath);
|
|
79
|
-
if (!exists) return null;
|
|
80
|
-
|
|
81
|
-
const content = await this.executor.readFile(this.statePath);
|
|
82
|
-
return JSON.parse(content) as SetupState;
|
|
83
|
-
} catch {
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
async set(state: SetupState): Promise<void> {
|
|
89
|
-
const content = JSON.stringify(state, null, 2);
|
|
90
|
-
await this.executor.writeFile(this.statePath, content);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
async clear(): Promise<void> {
|
|
94
|
-
await this.executor.rm(this.statePath);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* System layer types — server setup, prerequisites, and component management.
|
|
3
|
-
*
|
|
4
|
-
* The system layer is ONLY for self-hosted deployments. It takes a
|
|
5
|
-
* bare-metal (or VM) server and prepares it: checking what's installed,
|
|
6
|
-
* installing missing components, and caching the result so we don't
|
|
7
|
-
* re-check on every operation.
|
|
8
|
-
*
|
|
9
|
-
* Key design decisions:
|
|
10
|
-
* - All commands run through CommandExecutor (local or SSH)
|
|
11
|
-
* - Setup state is persisted via SetupStateStore (DB or file)
|
|
12
|
-
* - Installers accept InstallerConfig for values that would
|
|
13
|
-
* otherwise require interactive input (ACME email, domain, etc.)
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
// ─── Log streaming ───────────────────────────────────────────────────────────
|
|
17
|
-
|
|
18
|
-
/** Log entry from system operations — matches LogEntry shape for uniformity. */
|
|
19
|
-
export interface SystemLog {
|
|
20
|
-
timestamp: string;
|
|
21
|
-
message: string;
|
|
22
|
-
level: "info" | "warn" | "error";
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** Callback for streaming logs during system operations. */
|
|
26
|
-
export type SystemLogCallback = (log: SystemLog) => void;
|
|
27
|
-
|
|
28
|
-
// ─── Component status ────────────────────────────────────────────────────────
|
|
29
|
-
|
|
30
|
-
export interface SystemComponentDefinition {
|
|
31
|
-
name: string;
|
|
32
|
-
label: string;
|
|
33
|
-
description: string;
|
|
34
|
-
installable: boolean;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface ComponentStatus {
|
|
38
|
-
name: string;
|
|
39
|
-
label: string;
|
|
40
|
-
description: string;
|
|
41
|
-
installable: boolean;
|
|
42
|
-
installed: boolean;
|
|
43
|
-
version?: string;
|
|
44
|
-
/** Whether the daemon is actively running (Docker, Traefik) */
|
|
45
|
-
running?: boolean;
|
|
46
|
-
/** installed AND running (when applicable) */
|
|
47
|
-
healthy: boolean;
|
|
48
|
-
message: string;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// ─── Aggregate check result ──────────────────────────────────────────────────
|
|
52
|
-
|
|
53
|
-
export interface SystemCheckResult {
|
|
54
|
-
components: ComponentStatus[];
|
|
55
|
-
ready: boolean;
|
|
56
|
-
missing: string[];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// ─── Features & prerequisites ────────────────────────────────────────────────
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* High-level features. Prerequisites vary by runtime mode.
|
|
63
|
-
*
|
|
64
|
-
* Docker mode: build → [git, docker], deploy → [docker], routing → [traefik], ssl → [traefik]
|
|
65
|
-
* Bare mode: build → [git, node], deploy → [node], routing → [traefik], ssl → [traefik]
|
|
66
|
-
*/
|
|
67
|
-
export type Feature = "build" | "deploy" | "routing" | "ssl";
|
|
68
|
-
|
|
69
|
-
export interface FeatureReadiness {
|
|
70
|
-
feature: Feature;
|
|
71
|
-
ready: boolean;
|
|
72
|
-
missing: ComponentStatus[];
|
|
73
|
-
message: string;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export interface PrerequisiteRule {
|
|
77
|
-
feature: Feature;
|
|
78
|
-
requires: string[];
|
|
79
|
-
message: string;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// ─── Installer types ─────────────────────────────────────────────────────────
|
|
83
|
-
|
|
84
|
-
export interface InstallResult {
|
|
85
|
-
component: string;
|
|
86
|
-
success: boolean;
|
|
87
|
-
version?: string;
|
|
88
|
-
error?: string;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export interface SetupResult {
|
|
92
|
-
installed: InstallResult[];
|
|
93
|
-
skipped: string[];
|
|
94
|
-
failed: InstallResult[];
|
|
95
|
-
ready: boolean;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Configuration for installers — pre-collected values that would
|
|
100
|
-
* otherwise require interactive input during installation.
|
|
101
|
-
*
|
|
102
|
-
* The dashboard / CLI collects these from the user BEFORE starting
|
|
103
|
-
* the setup flow, so the installers can run non-interactively.
|
|
104
|
-
*/
|
|
105
|
-
export interface InstallerConfig {
|
|
106
|
-
/** ACME email for Let's Encrypt certificate provisioning */
|
|
107
|
-
acmeEmail?: string;
|
|
108
|
-
/** Primary domain for the platform */
|
|
109
|
-
domain?: string;
|
|
110
|
-
/** Traefik install mode: Docker container or standalone binary */
|
|
111
|
-
traefikMode?: "docker" | "binary";
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// ─── Runtime mode ────────────────────────────────────────────────────────────
|
|
115
|
-
|
|
116
|
-
export type RuntimeMode = "docker" | "bare";
|