🚀 Release v0.30.0 - #4979
Merged
Merged
Conversation
Add unit tests for addDomainToCompose verifying that a disabled domain produces no traefik labels, an enabled domain does, and only the enabled one emits labels when both are attached to the same service. Mocks node:fs so loadDockerCompose runs against an in-memory compose spec. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The new non-null `enabled` column makes it a required field on the Domain type, so the existing traefik/compose test fixtures need it too. Adds `enabled: true` to each base fixture (spread-based fixtures inherit it). Fixes the apps/dokploy typecheck failure on CI. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Lines like 'failed: false, error: none' (e.g. ofelia job summaries for successful runs) were rendered red because the error patterns matched the key regardless of its value. Strip key/value pairs whose value explicitly reports a non-error before running the error keyword patterns. Fixes #4538
The indentNodeProp from @codemirror/lang-yaml computes column-based
indents that produce inconsistent and odd-numbered indentation when
pressing Enter (e.g. 9 spaces after a nested 'web:' line, 6 after a
4-space 'image:' line). Override it with a line-based indentService:
keep the current line's indent, align list-entry keys after the dash
marker, and indent one unit deeper after lines opening a block
(':', '|', '>').
Fixes #4650
Add a new settings page under Settings > Sessions that shows all active and expired login sessions with user info, IP address, device, and an option to revoke (force logout) any session. Backend: - listSessions: adminProcedure that returns sessions joined with user data, ordered by creation date - revokeSession: adminProcedure that deletes a session by ID (blocks self-revocation) Frontend: - New /dashboard/settings/sessions page with ShowSessions component - Sessions table with user, IP, device, timestamps, and revoke action - Sidebar link under Users (gated by member.read permission) Tests: - Input validation tests for revokeSession schema
… injection writeDomainsToCompose returns a shell fragment that is executed as part of the compose build script. On error it interpolated error.message (which embeds the user-controlled serviceName/host) directly into an echo, so a serviceName like $(cmd) executed as root. Escape the message with quote().
…teral check) quote() legitimately wraps the payload text inside single quotes, so the raw substring is present but inert. leaksShellSyntax (via shell-quote parse) is the correct assertion; the literal not.toContain check was wrong.
…gnore - Deleted the SQL file and snapshot related to the "network" management schema, cleaning up the database structure. - Updated the migration journal to reflect these deletions. - Added .playwright-* to .gitignore to exclude Playwright test files from version control.
- Introduced a new SQL file defining the "network" type and its associated table structure. - Added "networkIds" column to multiple application tables for network association. - Established foreign key constraints for the "network" table linking to "organization" and "server" tables. - Updated migration journal and added a new snapshot for versioning.
- Updated the ShowNetworks component to improve the layout and user experience. - Introduced a new Pencil icon for editing networks and added a Badge component for displaying network drivers. - Refactored loading and empty state handling for better visual feedback. - Modified the API query to include server details for each network, enhancing the data returned for better context.
…ogic - Replaced zodResolver with standardSchemaResolver for improved schema validation. - Added new toggle options for network settings, enhancing user interface clarity. - Refactored network creation and update logic to streamline payload handling. - Updated network form schema to remove default values, ensuring explicit user input. - Introduced SERVER_LOCAL sentinel for local Dokploy server identification.
- Simplified the network form schema by removing unnecessary fields and enforcing validation rules for IP settings. - Updated the HandleNetwork component to eliminate the edit functionality, focusing on network creation only. - Improved the ShowNetworks component by adding a delete action for network management, enhancing user experience. - Introduced a new SQL migration for the network schema, establishing necessary constraints and types. - Cleaned up the API by removing the update network functionality, reflecting the immutable nature of Docker networks.
…actions - Introduced a new ShowNetworkConfig component for displaying detailed Docker network configuration. - Integrated ShowNetworkConfig into the ShowNetworks component, allowing users to view network details directly. - Updated the layout of network actions for improved user experience and accessibility. - Enhanced the API to support network inspection functionality, providing necessary data for the new component.
…synchronization - Added server filtering capability to the dashboard, allowing users to manage networks specific to selected servers. - Introduced SyncNetworks component for synchronizing Docker networks with Dokploy, enabling import of new networks and cleanup of stale records. - Updated HandleNetwork and ShowNetworks components to support server-specific operations, improving user experience and functionality. - Enhanced API to support network synchronization and importing, ensuring accurate data handling for network management.
…e synchronization - Added a new API endpoint for recreating Docker networks that have been removed, allowing users to restore networks directly from the Dokploy interface. - Updated the ShowNetworks and SyncNetworks components to include options for recreating networks, improving user management capabilities. - Enhanced the network synchronization process to better handle stale records, providing users with clear actions for network maintenance. - Refactored network creation logic to streamline the process and ensure consistency across network management operations.
Added cursor pointer style for buttons and roles.
fix(ui): add cursor pointer style for buttons
…ting fix: prevent environment form from resetting while editing
- Added functionality for assigning Docker networks to services, allowing users to manage network associations directly from the UI. - Introduced new components for assigning networks to both individual services and compose files, improving user experience and flexibility. - Updated existing components to integrate network assignment features, ensuring seamless interaction within the dashboard. - Enhanced the database schema to support new network-related fields, including `networkIds` and `detachDokployNetwork`, for better service configuration. - Improved the layout and responsiveness of various UI elements to accommodate new features and enhance usability.
validateDomain returns isValid: true for CDN-fronted domains but reuses the `error` field to carry the provider's informational warning. Both domain tooltips branched on `error` alone, so the message rendered under a red "Error:" heading even though the badge correctly showed a green "Behind Cloudflare" state. Check the valid+message case first, matching how the badge already distinguishes the two. Applied to both the table view (columns.tsx) and the card view (show-domains.tsx), which shares the same tooltip. Fixes #4910 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Added auditing functionality for network creation, recreation, and deletion actions in the network API. - Updated the audit log schema to include "network" as a resource type. - Enhanced the network router to log actions with relevant metadata, improving traceability and accountability for network management operations.
Feat/add network management
feat: add session management page (list active sessions + revoke)
…n errors SCIM provisioning created users with emailVerified: false, so better-auth refused to link the matching SSO account (account_not_linked), and the resulting redirect landed on better-auth's bare /error page with no actionable feedback. - Mark SCIM-provisioned users as email-verified at creation time, same trust rationale already applied to admin-invited credential users. - Sync a SCIM user's membership role to the organization's configured default role instead of the hardcoded "member" the SCIM plugin creates. - Set errorCallbackURL/onAPIError.errorURL to the sign-in page so failed SSO/OAuth callbacks land back on Dokploy's UI instead of better-auth's generic error page. - Read the error query param on the sign-in page and show it through the existing AlertBlock instead of failing silently. Fixes #4973
fix(auth): link SCIM-provisioned users through SSO and surface sign-in errors
Server diagnostics tab (Docker dashboard) with:
- Per-network IP usage: subnet capacity vs. containers in use, including
reserved networks like dokploy-network which are excluded from the
managed Networks tab. Surfaces read errors instead of silently showing
zeroes when the Docker API call fails.
- Broadened daemon-error detection and failure classification for Swarm
network failures: IP pool exhaustion on an existing network
("could not find an available IP", "task allocation failure") and
network attach timeouts ("attaching to network failed", "context
deadline exceeded") — both previously fell through as Unclassified.
Verified end-to-end against a real systemd-managed dockerd.
- Failed-deployment rows now carry the raw log tail used for
classification, shown on hover and linked to their service/project,
so a guess (or lack of one) can be verified against the actual error
and followed straight to the app.
- Daemon-error panel is a read-only code editor, always visible (not
hidden when empty), prefixed with the actual "Logs from X to Y"
window passed to journalctl so the --since window can be verified.
- "Download report" exports everything on screen (metrics + raw logs)
as Markdown, so a customer can send one file instead of a screen-share.
- Health check now IS_CLOUD-gated the same way network sync already is:
a cloud org can no longer omit serverId and have the check silently
run against the shared platform host instead of their own server.
Includes an inotify diagnostics card (current vs. max_user_instances/
watches/queued_events) and a failed-deployments log with automatic
cause classification based on daemon/log error patterns.
Tightens a handful of two-line comments left over from earlier iterations (Health tab / failed-deployment classification) down to one line each, no behavior change.
Reverts the mount-only auto-refetch — it still ran host shell, Docker,
DB, and SSH log-tail work before the user asked for it, just once
instead of on every filter change. Back to fully manual: nothing runs
until Check/Re-check is clicked, matching the panel's own copy
("Nothing runs automatically — click to check").
fix: open deployments tab when opening a service from the deployments list
- Log tail for failed-deployment classification now checks the app's current buildServer before falling back to its server, matching the buildServerId-then-serverId precedence used everywhere else in the codebase (application.ts, drop.ts, directory.ts, patch-repo.ts). - Removes a stale !isCloud gate on the Networks tab that this branch had reintroduced from before Mauricio removed it in daba2d7 (Networks is intentionally shown in cloud now) — unrelated to this PR's scope, docker.tsx's Networks tab/content now matches canary.
fix(ui): prevent layout shift in log counter using tabular-nums
Some self-hosted GitLab instances (e.g. older versions without expires_in configured in doorkeeper) omit expires_in from the OAuth token response. Computing Date.now()/1000 + undefined produced NaN, which Postgres rejected on the expires_at integer column, crashing both the initial OAuth callback and the token refresh flow with a 500. Falls back to null when expires_in is absent, matching the existing Gitea callback behavior. Closes #4362
…s-in fix(gitlab): handle missing expires_in in OAuth token response
feat: add Docker Health diagnostics tab
…ackups and domains
feat: add Overview dashboard (Services, Backups & Domains tabs)
Resolve conflicts in docker.ts and domain.ts: canary already contains a superset of main's hotfix cherry-picks (isDockerDesktop, isolated network label pinning), just refactored/reformatted, so both sides kept canary's version. Also fix hotfix-cherry-pick.yml to sync each cherry-pick back into canary immediately, so canary and main share history for that change and the next canary->main release PR doesn't re-conflict on it.
Mounts the existing cloud-gated Analytics component (GTM + HubSpot script loader) in _app.tsx. It was already implemented behind api.settings.isCloud but never wired into the app, so it never loaded on cloud or self-hosted instances.
feat: enable Google Tag Manager on cloud version only
Fires the sign_up dataLayer event already read by GTM for the three signup paths on the cloud version: email/password (register.tsx), GitHub/Google OAuth (via better-auth's newUserCallbackURL, distinct from callbackURL so returning-user logins aren't counted), and invitation acceptance. All gated behind isCloud, same as the rest of the analytics wiring.
Replaces the static quote in the onboarding layout's left panel with an auto-rotating carousel of product highlights (Deploy / Manage / Scale, 3 slides x 4 items), shown on the cloud signup page only. - OnboardingLayout gets an optional leftPanel override, default quote untouched everywhere else (login, invitation, password reset). - Auto-advances every 6s, pauses on hover/focus, respects prefers-reduced-motion, manual dot + arrow navigation. - Copy pulled from the website's existing first-features.tsx section to stay consistent with approved marketing copy.
feat: track cloud sign_up event in dataLayer
feat: interactive feature showcase on the signup panel
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR promotes changes from
canarytomainfor version v0.30.0.🔍 Changes Include:
✅ Pre-merge Checklist: