Skip to content

[Feat] Applications - #1276

Open
saeedvaziry wants to merge 30 commits into
4.xfrom
feat/apps
Open

saeedvaziry wants to merge 30 commits into
4.xfrom
feat/apps

Conversation

@saeedvaziry

@saeedvaziry saeedvaziry commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Summary

Introduces Applications (Beta): a runtime-agnostic way to deploy one repository across multiple servers, built around Application → Environment → Component. Staging and production can have independent branches, variables, runtime versions and infrastructure.

Applications live alongside Sites—this does not replace Sites or automatically convert existing deployments.

What we're delivering

  • Composable components: web, worker and scheduler capabilities, plus dedicated load balancers.
  • Editable runtime presets: PHP, Laravel, Node, Bun, static and custom; plugins can add presets/capabilities.
  • Coordinated deployments: one pinned commit, stage barriers, a release command run once on the primary, cancellation, recovery, environment rollback, auto-deploy and live-release joins.
  • Routing and resources: domains/SSL, Nginx/Caddy load balancing, and attached MySQL/MariaDB/PostgreSQL or Redis/Valkey with managed credentials and private-network access.
  • Dashboard and coexistence: read-only topology, per-component deployment logs, component ownership on worker/cron pages, shared-resource guards and user/plugin documentation.

High-level picture

An example environment; web, worker and scheduler capabilities can also share a component. Load balancing is optional.

flowchart LR
    Domain["Domains + SSL"] --> LB
    subgraph Environment["One environment across multiple servers"]
        LB["Load balancer<br/>Server A"] --> Web1["Web component<br/>Server B"]
        LB --> Web2["Web component<br/>Server C"]
        Jobs["Worker + scheduler<br/>Server D"]
        Web1 --> Resources["Attached databases / Redis"]
        Web2 --> Resources
        Jobs --> Resources
    end
    Domain -. "or direct" .-> Web1
Loading

Deployment flow

Every stage waits for its participants. App components run the code stages; load balancers participate only in release.

flowchart LR
    Pin["Pin commit SHA"] --> Clone["Clone"] --> Build["Build"]
    Build --> Command["Release command<br/>primary only"]
    Command --> Release["Activate code + env<br/>restart processes / reload LB"]
    Release --> Post["Post-release"]
    Release -. "release failure" .-> Recover["Recover previous<br/>code + env"]
Loading

Validation and Beta boundaries

  • Full PHP suite, PHPStan, TypeScript, lint and build passed; changed-line coverage exceeded the 75% gate. Whole-branch review and follow-up fixes completed.
  • Isolated Ubuntu 24.04/26.04 checks covered Nginx/Caddy presets, private GitHub SSH deployments, four-server routing/resources, rollback/join and teardown.
  • Still outstanding: real GitHub App/webhook ingress, public DNS/ACME, visual sign-off and formatting.
  • Recovery is coordinated, not an atomic cross-server transaction; it cannot undo database migrations or external script effects. No public Applications API, Site conversion or component moves in this Beta.

See Applications documentation for the workflows and detailed boundaries.

@coderabbitai

coderabbitai Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 539 files, which is 239 over the limit of 300.

To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch.

Usage-priced reviews support at most 300 files.

Run configuration
Commits

Reviewing files that changed from the base of the PR and between 8598e4d and e9c6078.

Files selected for processing: 539
  • .github/instructions/php-laravel.instructions.md
  • .gitignore
  • CLAUDE.md
  • app/Actions/Application/CreateApplication.php
  • app/Actions/Application/DeleteApplication.php
  • app/Actions/Application/GetApplicationRuntime.php
  • app/Actions/Application/GetApplicationSourceControl.php
  • app/Actions/Application/UpdateApplication.php
  • app/Actions/Application/ValidateApplication.php
  • app/Actions/Bootstrap/GetBootstrap.php
  • app/Actions/Component/BroadcastComponentUpdate.php
  • app/Actions/Component/CreateComponent.php
  • app/Actions/Component/DeleteComponent.php
  • app/Actions/Component/GenerateLoadBalancerConfig.php
  • app/Actions/Component/GetComponentOptions.php
  • app/Actions/Component/HasComponentRelease.php
  • app/Actions/Component/InstallComponent.php
  • app/Actions/Component/PurgeServerComponents.php
  • app/Actions/Component/RestartComponentWorkers.php
  • app/Actions/Component/RetryComponentInstall.php
  • app/Actions/Component/SyncComponentCapabilities.php
  • app/Actions/Component/SyncComponentDeployKeys.php
  • app/Actions/Component/SyncComponentRuntime.php
  • app/Actions/Component/SyncComponentVhost.php
  • app/Actions/Component/SyncLoadBalancerBackends.php
  • app/Actions/Component/UpdateComponentCapabilities.php
  • app/Actions/Component/UpdateLoadBalancerBackends.php
  • app/Actions/Component/ValidateComponentProcess.php
  • app/Actions/Component/WriteComponentEnv.php
  • app/Actions/ComponentCapability/InstallSchedulerCapability.php
  • app/Actions/ComponentCapability/InstallWebCapability.php
  • app/Actions/ComponentCapability/ValidateCapabilityServices.php
  • app/Actions/ComponentCapability/ValidateSchedulerCapability.php
  • app/Actions/ComponentCapability/ValidateWebCapability.php
  • app/Actions/CronJob/CreateCronJob.php
  • app/Actions/CronJob/DeleteCronJob.php
  • app/Actions/CronJob/DisableCronJob.php
  • app/Actions/CronJob/EditCronJob.php
  • app/Actions/CronJob/EnableCronJob.php
  • app/Actions/CronJob/SyncCronJobs.php
  • app/Actions/Database/CreateDatabase.php
  • app/Actions/Database/CreateDatabaseUser.php
  • app/Actions/Database/DeleteDatabase.php
  • app/Actions/Database/DeleteDatabaseUser.php
  • app/Actions/Database/LinkUser.php
  • app/Actions/Database/SyncDatabaseUsers.php
  • app/Actions/Database/UpdateDatabaseUser.php
  • app/Actions/Environment/CreateEnvironment.php
  • app/Actions/Environment/DeleteEnvironment.php
  • app/Actions/Environment/GetEnvironmentOverview.php
  • app/Actions/Environment/GetEnvironmentTopology.php
  • app/Actions/Environment/MarkEnvironmentForRedeploy.php
  • app/Actions/Environment/UpdateEnvironment.php
  • app/Actions/Environment/ValidateEnvironment.php
  • app/Actions/EnvironmentAttachment/AttachDatabase.php
  • app/Actions/EnvironmentAttachment/AttachEnvironmentResource.php
  • app/Actions/EnvironmentAttachment/AttachRedis.php
  • app/Actions/EnvironmentAttachment/DetachEnvironmentResource.php
  • app/Actions/EnvironmentAttachment/GetEnvironmentResourceOptions.php
  • app/Actions/EnvironmentAttachment/SyncEnvironmentResourceAccess.php
  • app/Actions/EnvironmentAttachment/ValidateEnvironmentResource.php
  • app/Actions/EnvironmentDeployment/AdvanceEnvironmentDeployment.php
  • app/Actions/EnvironmentDeployment/AssertEnvironmentIdle.php
  • app/Actions/EnvironmentDeployment/BroadcastEnvironmentDeploymentUpdate.php
  • app/Actions/EnvironmentDeployment/CancelEnvironmentDeployment.php
  • app/Actions/EnvironmentDeployment/DeployEnvironment.php
  • app/Actions/EnvironmentDeployment/FailStalledEnvironmentDeployments.php
  • app/Actions/EnvironmentDeployment/FinishEnvironmentDeployment.php
  • app/Actions/EnvironmentDeployment/RollbackComponentRelease.php
  • app/Actions/EnvironmentDeployment/RollbackEnvironment.php
  • app/Actions/EnvironmentDeployment/RunComponentStage.php
  • app/Actions/EnvironmentDeployment/StartEnvironmentDeployment.php
  • app/Actions/EnvironmentDeployment/TriggerEnvironmentDeployFromWebhook.php
  • app/Actions/EnvironmentDeployment/UpdateEnvironmentDeploymentScript.php
  • app/Actions/EnvironmentDeployment/UpdateEnvironmentDeploymentSettings.php
  • app/Actions/EnvironmentDomain/ActivateEnvironmentDomain.php
  • app/Actions/EnvironmentDomain/BroadcastEnvironmentDomainUpdate.php
  • app/Actions/EnvironmentDomain/CheckEnvironmentDomain.php
  • app/Actions/EnvironmentDomain/CreateEnvironmentDomain.php
  • app/Actions/EnvironmentDomain/DeleteEnvironmentDomain.php
  • app/Actions/EnvironmentDomain/GetEnvironmentDomainOptions.php
  • app/Actions/EnvironmentDomain/RequestEnvironmentDomainVerification.php
  • app/Actions/EnvironmentDomain/UpdateEnvironmentDomain.php
  • app/Actions/EnvironmentDomain/ValidateEnvironmentDomain.php
  • app/Actions/EnvironmentVariable/DeleteEnvironmentVariable.php
  • app/Actions/EnvironmentVariable/GetEnvironmentVariables.php
  • app/Actions/EnvironmentVariable/ImportEnvironmentVariables.php
  • app/Actions/EnvironmentVariable/UpsertEnvironmentVariable.php
  • app/Actions/FirewallRule/ManageRule.php
  • app/Actions/GitHook/SyncRepositoryGitHook.php
  • app/Actions/GitHook/TriggerRepositoryAutoDeploy.php
  • app/Actions/GithubApp/HandlePushWebhook.php
  • app/Actions/HostedDomain/AssertHostAvailable.php
  • app/Actions/HostedDomain/CreateHostedDomain.php
  • app/Actions/HostedDomain/UpdateHostedDomain.php
  • app/Actions/HostedDomain/VerifyDomain.php
  • app/Actions/HostedDomain/VerifyHostedDomain.php
  • app/Actions/IsolatedUser/EnsureIsolatedUser.php
  • app/Actions/Network/CheckEnvironmentResourceNetwork.php
  • app/Actions/Network/CheckLoadBalancerNetwork.php
  • app/Actions/Network/DeleteNetwork.php
  • app/Actions/Network/RemoveMembershipsForAddress.php
  • app/Actions/Network/RemoveServerFromNetwork.php
  • app/Actions/Network/ResolveServerAddress.php
  • app/Actions/Network/SyncProviderNetworks.php
  • app/Actions/PHP/EnsureFpmPool.php
  • app/Actions/Projects/DeleteProject.php
  • app/Actions/SSL/CreateLetsEncryptWildcardSsl.php
  • app/Actions/SSL/DeleteSsl.php
  • app/Actions/SSL/InstallCustomServerSsl.php
  • app/Actions/SSL/RenewEnvironmentSsl.php
  • app/Actions/Server/ClearServiceLog.php
  • app/Actions/Server/DownloadServiceLog.php
  • app/Actions/Server/GetServiceLogs.php
  • app/Actions/Server/ReadServiceLog.php
  • app/Actions/Server/TransferServer.php
  • app/Actions/ServerIp/ManageServerIp.php
  • app/Actions/Service/Manage.php
  • app/Actions/Service/ManageNetworkingSecret.php
  • app/Actions/Service/ToggleNetworking.php
  • app/Actions/Service/Uninstall.php
  • app/Actions/Service/UpdateConfigFile.php
  • app/Actions/Site/CreateSite.php
  • app/Actions/Site/DeleteSite.php
  • app/Actions/Site/Deploy.php
  • app/Actions/Site/SyncSiteDeployKey.php
  • app/Actions/Site/Tooling/AssertToolingNotUsedByComponents.php
  • app/Actions/Site/Tooling/UninstallSiteTooling.php
  • app/Actions/Site/UpdatePort.php
  • app/Actions/Site/UpdateSourceControl.php
  • app/Actions/SiteStats/SyncGoAccessServer.php
  • app/Actions/SourceControl/DeleteSourceControl.php
  • app/Actions/SourceControl/SetupDeployKey.php
  • app/Actions/Webserver/GenerateCaddyConfig.php
  • app/Actions/Worker/CreateWorker.php
  • app/Actions/Worker/DeleteWorker.php
  • app/Actions/Worker/EditWorker.php
  • app/Actions/Worker/InstallWorker.php
  • app/Actions/Worker/ManageWorker.php
  • app/Actions/Worker/RestartAllWorkers.php
  • app/Actions/Worker/RestartSiteWorkers.php
  • app/Actions/Worker/RestartWorkers.php
  • app/Actions/Worker/SyncWorkerStatuses.php
  • app/Actions/Worker/UpdateWorkerEnvironment.php
  • app/ComponentCapabilities/AbstractComponentCapability.php
  • app/ComponentCapabilities/Scheduler.php
  • app/ComponentCapabilities/Web.php
  • app/ComponentCapabilities/Worker.php
  • app/Console/Commands/CheckPendingDomainsCommand.php
  • app/Console/Commands/CheckSslExpiriesCommand.php
  • app/Console/Commands/CheckStalledEnvironmentDeploymentsCommand.php
  • app/Console/Commands/RenewSslCertificatesCommand.php
  • app/Console/Commands/SyncRepositoryGitHooksCommand.php
  • app/Console/Kernel.php
  • app/DTOs/GitCloneDTO.php
  • app/DTOs/ServiceLog.php
  • app/DTOs/SocketEventDTO.php
  • app/DTOs/ToolingTargetDTO.php
  • app/Enums/ApplicationStatus.php
  • app/Enums/ComponentStatus.php
  • app/Enums/ComponentType.php
  • app/Enums/DeploymentStage.php
  • app/Enums/EnvironmentAttachmentStatus.php
  • app/Enums/EnvironmentDeploymentStatus.php
  • app/Enums/EnvironmentStatus.php
  • app/Enums/HostedDomainType.php
  • app/Enums/WebMode.php
  • app/Exceptions/Handler.php
  • app/Helpers/AttachmentVariables.php
  • app/Helpers/ComponentShell.php
  • app/Helpers/ComponentVariables.php
  • app/Helpers/EnvParser.php
  • app/Helpers/SSH.php
  • app/Helpers/SiteShellEnvironment.php
  • app/Http/Controllers/API/GitHookController.php
  • app/Http/Controllers/API/ServerSSLController.php
  • app/Http/Controllers/API/SiteController.php
  • app/Http/Controllers/Applications/ApplicationController.php
  • app/Http/Controllers/Applications/ComponentController.php
  • app/Http/Controllers/Applications/ComponentCronJobController.php
  • app/Http/Controllers/Applications/ComponentWorkerController.php
  • app/Http/Controllers/Applications/EnvironmentAttachmentController.php
  • app/Http/Controllers/Applications/EnvironmentController.php
  • app/Http/Controllers/Applications/EnvironmentDeploymentController.php
  • app/Http/Controllers/Applications/EnvironmentDomainController.php
  • app/Http/Controllers/Applications/EnvironmentVariableController.php
  • app/Http/Controllers/CronJobController.php
  • app/Http/Controllers/ServerSslController.php
  • app/Http/Controllers/SiteSettingController.php
  • app/Http/Controllers/WorkerController.php
  • app/Http/Middleware/HandleInertiaRequests.php
  • app/Http/Resources/ApplicationResource.php
  • app/Http/Resources/ComponentBackendResource.php
  • app/Http/Resources/ComponentResource.php
  • app/Http/Resources/CronJobResource.php
  • app/Http/Resources/EnvironmentAttachmentResource.php
  • app/Http/Resources/EnvironmentDeploymentResource.php
  • app/Http/Resources/EnvironmentDomainResource.php
  • app/Http/Resources/EnvironmentResource.php
  • app/Http/Resources/EnvironmentSummaryResource.php
  • app/Http/Resources/EnvironmentVariableResource.php
  • app/Http/Resources/FirewallRuleResource.php
  • app/Http/Resources/WorkerResource.php
  • app/Jobs/Application/DeleteApplicationJob.php
  • app/Jobs/Component/DeleteComponentJob.php
  • app/Jobs/Component/DeletePurgedComponentDeployKeyJob.php
  • app/Jobs/Component/InstallComponentJob.php
  • app/Jobs/Component/SyncComponentCapabilitiesJob.php
  • app/Jobs/Component/SyncComponentDeployKeysJob.php
  • app/Jobs/Component/SyncComponentRuntimeJob.php
  • app/Jobs/Component/SyncLoadBalancerServerJob.php
  • app/Jobs/Environment/DeleteEnvironmentJob.php
  • app/Jobs/EnvironmentAttachment/SyncEnvironmentResourceAccessJob.php
  • app/Jobs/EnvironmentDeployment/AdvanceEnvironmentDeploymentJob.php
  • app/Jobs/EnvironmentDeployment/DeployComponentStageJob.php
  • app/Jobs/EnvironmentDeployment/FinishEnvironmentDeploymentJob.php
  • app/Jobs/EnvironmentDeployment/StartEnvironmentDeploymentJob.php
  • app/Jobs/EnvironmentDeployment/TriggerEnvironmentDeployFromWebhookJob.php
  • app/Jobs/EnvironmentDomain/CheckEnvironmentDomainJob.php
  • app/Jobs/EnvironmentDomain/DeleteEnvironmentDomainsJob.php
  • app/Jobs/FirewallRule/ApplyRulesJob.php
  • app/Jobs/GitHook/SyncRepositoryGitHookJob.php
  • app/Jobs/SSL/CheckSslExpiryJob.php
  • app/Jobs/SSL/CreateLetsEncryptWildcardSslJob.php
  • app/Jobs/SSL/DeleteServerSslJob.php
  • app/Jobs/SSL/RenewEnvironmentSslJob.php
  • app/Jobs/ServerIp/PersistServerIpsJob.php
  • app/Jobs/Service/ManageJob.php
  • app/Jobs/Service/ToggleNetworkingJob.php
  • app/Jobs/Service/UninstallJob.php
  • app/Jobs/Service/UpdateNetworkingSecretJob.php
  • app/Jobs/Site/DeployJob.php
  • app/Jobs/Site/RollbackJob.php
  • app/Jobs/Site/Tooling/UninstallSiteToolingJob.php
  • app/Jobs/Worker/CreateJob.php
  • app/Jobs/Worker/EditJob.php
  • app/Jobs/Worker/ManageJob.php
  • app/Jobs/Worker/RestartAllJob.php
  • app/Models/Application.php
  • app/Models/Component.php
  • app/Models/ComponentBackend.php
  • app/Models/ComponentCapability.php
  • app/Models/CronJob.php
  • app/Models/DatabaseUser.php
  • app/Models/Deployment.php
  • app/Models/DeploymentScript.php
  • app/Models/Environment.php
  • app/Models/EnvironmentAttachment.php
  • app/Models/EnvironmentDeployment.php
  • app/Models/EnvironmentDomain.php
  • app/Models/EnvironmentVariable.php
  • app/Models/FirewallRule.php
  • app/Models/GitHook.php
  • app/Models/IsolatedUser.php
  • app/Models/NetworkServer.php
  • app/Models/Project.php
  • app/Models/Server.php
  • app/Models/ServerIpAddress.php
  • app/Models/ServerLog.php
  • app/Models/Site.php
  • app/Models/SourceControl.php
  • app/Models/Ssl.php
  • app/Models/Worker.php
  • app/Plugins/RegisterComponentCapability.php
  • app/Plugins/RegisterRuntimePreset.php
  • app/Policies/ApplicationPolicy.php
  • app/Policies/ComponentPolicy.php
  • app/Policies/CronJobPolicy.php
  • app/Policies/EnvironmentDeploymentPolicy.php
  • app/Policies/EnvironmentDomainPolicy.php
  • app/Policies/EnvironmentPolicy.php
  • app/Policies/FirewallRulePolicy.php
  • app/Policies/SslPolicy.php
  • app/Policies/WorkerPolicy.php
  • app/Providers/AppServiceProvider.php
  • app/Providers/ComponentServiceProvider.php
  • app/RuntimePresets/AbstractRuntimePreset.php
  • app/RuntimePresets/Bun.php
  • app/RuntimePresets/Custom.php
  • app/RuntimePresets/Laravel.php
  • app/RuntimePresets/NodeJS.php
  • app/RuntimePresets/PHP.php
  • app/RuntimePresets/StaticSite.php
  • app/SSH/Mise/Mise.php
  • app/SSH/OS/Git.php
  • app/SSH/OS/OS.php
  • app/Services/Database/AbstractDatabase.php
  • app/Services/Database/ManagesMysqlNetworking.php
  • app/Services/Database/Mysql.php
  • app/Services/Database/Postgresql.php
  • app/Services/Firewall/AbstractFirewall.php
  • app/Services/Firewall/Ufw.php
  • app/Services/LogAnalysis/GoAccess/GoAccess.php
  • app/Services/ManagesMemoryDatabaseNetworking.php
  • app/Services/NodeJS/NodeJS.php
  • app/Services/PHP/PHP.php
  • app/Services/ProcessManager/AbstractProcessManager.php
  • app/Services/ProcessManager/Supervisor.php
  • app/Services/Redis/Redis.php
  • app/Services/Valkey/Valkey.php
  • app/Services/Webserver/AbstractWebserver.php
  • app/Services/Webserver/Caddy.php
  • app/Services/Webserver/Nginx.php
  • app/SiteTypes/AbstractSiteType.php
  • app/SourceControlProviders/AbstractSourceControlProvider.php
  • app/SourceControlProviders/Bitbucket.php
  • app/SourceControlProviders/BitbucketV2.php
  • app/SourceControlProviders/Gitea.php
  • app/SourceControlProviders/Github.php
  • app/SourceControlProviders/GithubApp.php
  • app/SourceControlProviders/Gitlab.php
  • app/SourceControlProviders/SupportsApplications.php
  • app/Tables/ApplicationTable.php
  • app/Tables/Applications/ComponentCronJobTable.php
  • app/Tables/Applications/ComponentWorkerTable.php
  • app/Tables/Applications/EnvironmentDeploymentTable.php
  • app/Tables/Servers/FirewallRuleTable.php
  • app/Tooling/AbstractMiseTooling.php
  • app/Tooling/AbstractTooling.php
  • app/Tooling/ComposerTooling.php
  • app/Tooling/TargetToolingInterface.php
  • app/Traits/HandlesWorkerFailure.php
  • app/Traits/HasExclusiveOwner.php
  • app/Traits/UniqueQueue.php
  • config/app.php
  • config/component.php
  • config/database.php
  • config/horizon.php
  • config/queue.php
  • database/factories/ApplicationFactory.php
  • database/factories/ComponentCapabilityFactory.php
  • database/factories/ComponentFactory.php
  • database/factories/EnvironmentAttachmentFactory.php
  • database/factories/EnvironmentDeploymentFactory.php
  • database/factories/EnvironmentDomainFactory.php
  • database/factories/EnvironmentFactory.php
  • database/factories/EnvironmentVariableFactory.php
  • database/factories/WorkerFactory.php
  • database/migrations/2026_10_17_171647_create_applications_tables.php
  • database/migrations/2026_10_17_224408_add_component_lifecycle_fields.php
  • database/migrations/2026_10_18_083748_add_component_capability_process_ownership.php
  • database/migrations/2026_10_18_133728_create_environment_variables_table.php
  • database/migrations/2026_10_18_160459_create_environment_deployments_table.php
  • database/migrations/2026_10_18_223613_add_environment_deployment_operations.php
  • database/migrations/2026_10_19_085705_create_environment_domains.php
  • database/migrations/2026_10_19_141435_create_component_backends.php
  • database/migrations/2026_10_19_154937_create_environment_attachments.php
  • database/migrations/2026_10_23_131437_backfill_worker_log_paths.php
  • docs/4.x/README.md
  • docs/4.x/applications/components.md
  • docs/4.x/applications/concepts.md
  • docs/4.x/applications/deployments.md
  • docs/4.x/applications/domains.md
  • docs/4.x/applications/load-balancing.md
  • docs/4.x/applications/resources.md
  • docs/4.x/applications/variables.md
  • docs/4.x/plugins.md
  • public/api-docs/openapi/schemas/FirewallRule.yaml
  • public/api-docs/openapi/sites.yaml
  • resources/deployment-scripts/presets/bun/build.sh
  • resources/deployment-scripts/presets/laravel/build.sh
  • resources/deployment-scripts/presets/laravel/post-release.sh
  • resources/deployment-scripts/presets/laravel/pre-release.sh
  • resources/deployment-scripts/presets/node/build.sh
  • resources/deployment-scripts/presets/php/build.sh
  • resources/js/components/app-command.tsx
  • resources/js/components/app-header.tsx
  • resources/js/components/app-sidebar.tsx
  • resources/js/components/application-switch.tsx
  • resources/js/components/date-time.tsx
  • resources/js/components/dialogs/dialog-host.tsx
  • resources/js/components/dialogs/registry.ts
  • resources/js/components/flow-node.tsx
  • resources/js/components/heading.tsx
  • resources/js/components/ui/dynamic-field.tsx
  • resources/js/hooks/use-appearance.tsx
  • resources/js/layouts/application/layout.tsx
  • resources/js/lib/utils.ts
  • resources/js/pages/application/components/env.tsx
  • resources/js/pages/applications/components/add-component.tsx
  • resources/js/pages/applications/components/application-fields.tsx
  • resources/js/pages/applications/components/application-settings-form.tsx
  • resources/js/pages/applications/components/attach-resource.tsx
  • resources/js/pages/applications/components/backends-form.tsx
  • resources/js/pages/applications/components/canvas.tsx
  • resources/js/pages/applications/components/capabilities-form.tsx
  • resources/js/pages/applications/components/capability-fields.tsx
  • resources/js/pages/applications/components/component-domains.tsx
  • resources/js/pages/applications/components/component-panel.tsx
  • resources/js/pages/applications/components/create-application.tsx
  • resources/js/pages/applications/components/delete-component.tsx
  • resources/js/pages/applications/components/delete-dialog.tsx
  • resources/js/pages/applications/components/deploy-button.tsx
  • resources/js/pages/applications/components/deployment-panel.tsx
  • resources/js/pages/applications/components/deployment-script.tsx
  • resources/js/pages/applications/components/deployments-sheet.tsx
  • resources/js/pages/applications/components/docs-link.tsx
  • resources/js/pages/applications/components/domain-form.tsx
  • resources/js/pages/applications/components/environment-fields.tsx
  • resources/js/pages/applications/components/environment-form.tsx
  • resources/js/pages/applications/components/environment-settings-form.tsx
  • resources/js/pages/applications/components/environment-sheet.tsx
  • resources/js/pages/applications/components/import-env.tsx
  • resources/js/pages/applications/components/primary-component-picker.tsx
  • resources/js/pages/applications/components/release-settings-form.tsx
  • resources/js/pages/applications/components/resource-panel.tsx
  • resources/js/pages/applications/components/section.tsx
  • resources/js/pages/applications/components/settings-sheet.tsx
  • resources/js/pages/applications/components/side-panel.tsx
  • resources/js/pages/applications/components/stages.ts
  • resources/js/pages/applications/components/status.tsx
  • resources/js/pages/applications/components/variable-form.tsx
  • resources/js/pages/applications/components/variables-sheet.tsx
  • resources/js/pages/applications/environments/show.tsx
  • resources/js/pages/applications/index.tsx
  • resources/js/pages/applications/show.tsx
  • resources/js/pages/backups/components/restore-backup.tsx
  • resources/js/pages/commands/components/columns.tsx
  • resources/js/pages/cronjobs/components/columns.tsx
  • resources/js/pages/cronjobs/components/form.tsx
  • resources/js/pages/firewall/index.tsx
  • resources/js/pages/hosted-domains/components/create-hosted-domain.tsx
  • resources/js/pages/hosted-domains/components/edit-hosted-domain.tsx
  • resources/js/pages/hosted-domains/index.tsx
  • resources/js/pages/scripts/components/columns.tsx
  • resources/js/pages/server-features/components/feature-action.tsx
  • resources/js/pages/server-ssls/components/columns.tsx
  • resources/js/pages/site-features/components/feature-action.tsx
  • resources/js/pages/site-settings/components/vhost-preview.tsx
  • resources/js/pages/site-settings/components/vhost.tsx
  • resources/js/pages/workers/components/columns.tsx
  • resources/js/pages/workers/components/env-dialog.tsx
  • resources/js/pages/workers/components/form.tsx
  • resources/js/pages/workers/components/worker-row-actions.tsx
  • resources/js/pages/workflows/components/custom-node.tsx
  • resources/js/stores/bootstrap-store.ts
  • resources/js/types/application.d.ts
  • resources/js/types/cronjob.d.ts
  • resources/js/types/deployment-script.d.ts
  • resources/js/types/firewall.d.ts
  • resources/js/types/index.d.ts
  • resources/js/types/worker.d.ts
  • resources/views/ssh/applications/env-exec.blade.php
  • resources/views/ssh/applications/link-shared.blade.php
  • resources/views/ssh/applications/release-env.blade.php
  • resources/views/ssh/applications/rollback-release.blade.php
  • resources/views/ssh/applications/write-env.blade.php
  • resources/views/ssh/components/create-directories.blade.php
  • resources/views/ssh/components/delete-directories.blade.php
  • resources/views/ssh/components/delete-key.blade.php
  • resources/views/ssh/components/has-current.blade.php
  • resources/views/ssh/components/sync-executables.blade.php
  • resources/views/ssh/components/sync-vhost.blade.php
  • resources/views/ssh/composer/install.blade.php
  • resources/views/ssh/composer/uninstall.blade.php
  • resources/views/ssh/git/clone.blade.php
  • resources/views/ssh/mise/install-runtime.blade.php
  • resources/views/ssh/modern-deployment/release.blade.php
  • resources/views/ssh/os/clear-file.blade.php
  • resources/views/ssh/os/copy-as-user.blade.php
  • resources/views/ssh/os/delete-isolated-user.blade.php
  • resources/views/ssh/os/generate-ssh-key.blade.php
  • resources/views/ssh/os/grep.blade.php
  • resources/views/ssh/os/run-script.blade.php
  • resources/views/ssh/os/tail.blade.php
  • resources/views/ssh/services/database/mysql-family/write-networking.blade.php
  • resources/views/ssh/services/database/mysql/install.blade.php
  • resources/views/ssh/services/database/postgresql/create-user.blade.php
  • resources/views/ssh/services/database/postgresql/create.blade.php
  • resources/views/ssh/services/database/postgresql/delete-user.blade.php
  • resources/views/ssh/services/database/postgresql/delete.blade.php
  • resources/views/ssh/services/database/postgresql/reassign-user.blade.php
  • resources/views/ssh/services/database/postgresql/reconcile.blade.php
  • resources/views/ssh/services/database/postgresql/write-networking.blade.php
  • resources/views/ssh/services/firewall/ufw/apply-rules.blade.php
  • resources/views/ssh/services/memory-database/enable-networking.blade.php
  • resources/views/ssh/services/memory-database/verify-networking.blade.php
  • resources/views/ssh/services/process-manager/supervisor/create-worker.blade.php
  • resources/views/ssh/services/process-manager/supervisor/delete-worker.blade.php
  • resources/views/ssh/services/process-manager/supervisor/prepare-log.blade.php
  • resources/views/ssh/services/webserver/caddy/default-vhost.blade.php
  • resources/views/ssh/services/webserver/caddy/vhost.mustache
  • resources/views/ssh/services/webserver/nginx/default-vhost.blade.php
  • resources/views/ssh/services/webserver/nginx/vhost.mustache
  • resources/views/ssh/site/check-fpm-pool-ready.blade.php
  • resources/views/ssh/ssl/delete-environment-ssl.blade.php
  • tests/Arch/ExtensionPointsTest.php
  • tests/Arch/ModelsTest.php
  • tests/Feature/API/SitesTest.php
  • tests/Feature/API/WorkersTest.php
  • tests/Feature/ApplicationCoexistenceTest.php
  • tests/Feature/ApplicationDataModelTest.php
  • tests/Feature/ApplicationPoliciesTest.php
  • tests/Feature/ApplicationRoutesTest.php
  • tests/Feature/ApplicationTest.php
  • tests/Feature/ApplicationsCrudTest.php
  • tests/Feature/AttachmentVariablesTest.php
  • tests/Feature/ComponentCapabilityInstallTest.php
  • tests/Feature/ComponentCapabilityTest.php
  • tests/Feature/ComponentDeploymentStagesTest.php
  • tests/Feature/ComponentLifecycleTest.php
  • tests/Feature/ComponentLoadBalancerTest.php
  • tests/Feature/ComponentProcessesTest.php
  • tests/Feature/ComponentVariablesTest.php
  • tests/Feature/ComponentsTest.php
  • tests/Feature/DatabaseTest.php
  • tests/Feature/EnvironmentAttachmentsTest.php
  • tests/Feature/EnvironmentDeploymentsTest.php
  • tests/Feature/EnvironmentDomainLifecycleTest.php
  • tests/Feature/EnvironmentDomainsTest.php
  • tests/Feature/EnvironmentResourceAccessTest.php
  • tests/Feature/EnvironmentTopologyTest.php
  • tests/Feature/EnvironmentVariablesTest.php
  • tests/Feature/EnvironmentsCrudTest.php
  • tests/Feature/ExclusiveOwnerTest.php
  • tests/Feature/HostedDomainsTest.php
  • tests/Feature/LoadBalancerDeploymentTest.php
  • tests/Feature/LogsTest.php
  • tests/Feature/NetworkProviderSyncTest.php
  • tests/Feature/ProjectsTest.php
  • tests/Feature/RepositoryAutoDeployTest.php
  • tests/Feature/RestartSiteWorkersTest.php
  • tests/Feature/RuntimePresetTest.php
  • tests/Feature/ScriptTest.php
  • tests/Feature/ServerTest.php
  • tests/Feature/ServiceLogsTest.php
  • tests/Feature/ServiceNetworkingDatabaseTest.php
  • tests/Feature/ServiceNetworkingTest.php
  • tests/Feature/ServicesTest.php
  • tests/Feature/SiteGroundworkTest.php
  • tests/Feature/SiteSettingsProxiedSiteTest.php
  • tests/Feature/SiteToolingTest.php
  • tests/Feature/SitesTest.php
  • tests/Feature/SourceControlsTest.php
  • tests/Feature/UniqueQueueTest.php
  • tests/Feature/WorkersTest.php
  • tests/Unit/EnvParserTest.php
  • tests/Unit/Models/ServerModelTest.php
  • tests/Unit/SiteShellEnvironmentTest.php

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@saeedvaziry saeedvaziry changed the title Applications [Feat] Applications Oct 20, 2026
saeedvaziry and others added 3 commits October 20, 2026 15:25
- Rollback links the environment's current shared paths into the restored release
- Topology: cards grow with content (no clipped capability pills); app rows sit below
  load balancers and domains align with their target so edges no longer hide under nodes
- Heading badges slot; Beta/status badges sit beside titles; padded settings cards
- Deploy errors shown as a toast instead of shifting header buttons
- Deployments/Domains tables fit: run #id, short commit (full SHA kept as data), merged Target
- Attach database: charset Select, searchable collation, utf8mb4 preferred, kind-specific
  warning, Attach disabled until complete
- Component overview shows capability settings with their form labels; Managed Yes/No;
  "Running" stage label; no Roll back on the live run; clearer variable key error
- Server logs: messages on their own line, streamed output kept as received, locked append
- Git clone: keep hyphenated self-hosted hosts, validate host, idempotent quiet keyscan with
  a clear failure
- MySQL install refuses a mismatched apt candidate (e.g. arm64) before touching an
  existing installation

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@saeedvaziry
saeedvaziry marked this pull request as ready for review October 20, 2026 19:43
saeedvaziry and others added 7 commits October 21, 2026 20:33
Provision component-local Composer 2 and PHP CLI links while preserving shared user tooling. Block repository and source control changes during component installation or synchronization. Add regression tests and update runtime documentation.
Add application and environment switching plus component, resource, and deployment side panels. Consolidate settings and forms, remove superseded pages and tables, and update lazy data loading, project isolation, and feature tests.
…sheets

Replace the standalone variables, settings and deployments pages with sheets on the environment canvas, and update the application switcher, header, controllers and feature tests accordingly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- SQLite transactions start IMMEDIATE so read-then-write transactions wait for
  the write lock instead of failing with "database is locked" when a request
  overlaps a queued job
- Laravel preset warnings honour shared SESSION_DRIVER and FILESYSTEM_DISK
  environment variables instead of always showing with multiple web components
- Topology reads the component/attachment server directly; the relation is a
  restrict-on-delete foreign key and never null
- Policy test no longer expects the removed component viewAny ability

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sheets

- Sheet panels close locally so the slide-out animation plays before the route changes
- Sheet links, deploy and rollback carry the selected component/resource, so its side panel stays open
- Deployment components show the server name inline, only when it differs from the component name

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…vice logs

- Worker logs move to root-owned /var/log/vito/workers/<user>/ (root:<user> 750)
  so isolated users can no longer plant symlinks that root touch/chown and
  supervisord follow; the log directory is prepared on every config write
- Worker deletion removes the new log files with the glob expanded as root
- User-owned service logs (PHP FPM php_errors.log) are read, searched,
  downloaded and cleared as their owner instead of root
- Root-mode clear restores the file's own owner (stat -L) and log paths are
  shell-escaped

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
saeedvaziry and others added 2 commits October 23, 2026 00:52
- Backend vhosts survive reboots: allow non-local binds so nginx/Caddy can
  listen on WireGuard addresses before the interface is up
- Component load balancers fail over in 5s instead of hanging 60s on a
  dead backend (proxy_connect_timeout)
- Rollbacks run the post-release stage so caches are rebuilt from the
  live environment instead of the release's stale config cache
- Only app components are marked for redeploy; load balancers no longer
  stay flagged forever
- Network member resyncs (active/updating flips) no longer bump the
  environment's variables version or resync resources
- Deleting a component keeps its deployment history with a name/server
  snapshot; partial and rolled-back runs explain their outcome

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
saeedvaziry and others added 4 commits October 23, 2026 20:30
Persist and backfill log paths, migrate unsafe legacy logs, and safely read and remove worker logs. Continue site deletion when deploy-key cleanup fails and warn web users. Add regression tests and document API cleanup behavior.
- Tolerate source control API and commit lookup failures during deployment.
- Limit cron transactions to component jobs to avoid database locks during SSH.
- Ignore stale legacy aliases when checking domain availability.
- Expand home paths in scripts and support networking on older Redis versions.
- Add regression coverage for deployment, domain, script and networking fixes.
- Restore the Site-based tooling and source control plugin contracts; Applications support is opt-in via TargetToolingInterface and SupportsApplications.
- Tolerate missing runtime plugins: preserve their cron lines, return 422 on domain changes and let applications and components be deleted.
- Keep explicit firewall allow rules on attached resource ports above the resource guard so existing Sites and clients keep access.
- Preserve executable bits when cloning releases.
- Keep worker log history when editing a worker.
- Open the deployment panel after confirming a deploy and keep route-synced dialogs open across navigation.
- Skip composer install in the PHP preset when there is no composer.json.
- Promote the next app component to primary after the primary's server is deleted.
- Validate project deletion against component cleanup and verify dual-stack Redis networking.
- Add regression coverage for each fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant