Commit graph

5050 commits

Author SHA1 Message Date
peaklabs-dev
233c79f598
fix(backup): database restores with custom db name 2026-01-08 16:29:08 +01:00
peaklabs-dev
54a834e042
fix(git): trigger deployments when watch_paths is empty 2026-01-07 19:15:16 +01:00
Andras Bacsai
162e43a7fc
fix: GitLab webhook validation (#7899) 2026-01-07 18:19:11 +01:00
Andras Bacsai
7a305fd2cd fix: prevent timing attack in GitLab webhook token validation
Replace insecure !== operator with hash_equals() for constant-time
string comparison when validating GitLab webhook tokens.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 15:23:48 +01:00
Andras Bacsai
cc53e9476e fix(docker): add fallback for Docker Swarm container labels 2026-01-07 14:57:13 +01:00
peaklabs-dev
8ba30d75ea
refactor: move all env sorting to one place 2026-01-06 16:19:38 +01:00
peaklabs-dev
3af456cd35
chore: remove raw sql from env relationship
- raw sql should not be used whenever possible
- using sql to order on the relationship environment_variables() causes custom sorting to break or be additionally complicated
2026-01-06 16:18:37 +01:00
Daniele Luisetto
e9ef331def
feat(api): allow to escape special characters in labels (#7886) 2026-01-06 15:50:55 +01:00
🏔️ Peak
caca421e2e
fix: db public port instant save and simplify if condition (#7883) 2026-01-06 13:44:46 +01:00
Yassir
aeef97f295
fix(docs): api docs for bulk env update response (#7714) 2026-01-06 12:52:32 +01:00
peaklabs-dev
51640b0e64
fix(ui): instance public ips ui validation 2026-01-05 22:14:51 +01:00
peaklabs-dev
38fefa7330
fix(docs): remove environments from projects endpoint 2026-01-05 21:52:10 +01:00
Yassir
eaa668036f
feat(service): upgrade docker registry template (#7034)
Co-authored-by: 🏔️ Peak <122374094+peaklabs-dev@users.noreply.github.com>
2026-01-05 14:13:42 +01:00
peaklabs-dev
e774921866
refactor: remove duplicated validation messages 2026-01-05 13:15:14 +01:00
peaklabs-dev
4021c8ac2f
feat: allow more characters when validating
- allow more characters in the name and description validation, while still not allowing any unsafe characters
2026-01-05 13:14:27 +01:00
Andras Bacsai
81780d652f fix(deployment): use mainServer consistently instead of redundant original_server
Remove the redundant $original_server property and use $mainServer throughout
ApplicationDeploymentJob. Both properties held the same value (the deployment
target server), causing unnecessary duplication.

Also fixes two bugs in generate_compose_file() where $this->server was used
instead of $this->mainServer for isSwarm() and isLogDrainEnabled() checks.
When using a build server, $this->server could point to the build server,
causing incorrect configuration for the deployment target.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 11:56:08 +01:00
Andras Bacsai
162eaa9f0d feat(github): implement processing for GitHub pull request webhooks and add helper functions for commit and PR file retrieval 2026-01-05 11:13:18 +01:00
Yassir
959dfa8125
fix(ui): images inside coolify changelog (#7357) 2026-01-04 21:59:34 +01:00
Andras Bacsai
fdb7f36347 refactor(server): remove unused destinationsByServer method 2026-01-04 19:37:47 +01:00
Muhammed Mustafa AKŞAM
cbf412ea35
fix: add datetime cast to finished_at column (#7418) 2026-01-04 17:23:22 +01:00
Muhammed Mustafa AKŞAM
9b6d1613ed
fix(docs): remove incorrect uuid format in openapi spec (#7419)
Co-authored-by: 🏔️ Peak <122374094+peaklabs-dev@users.noreply.github.com>
2026-01-04 16:16:19 +01:00
Andras Bacsai
e4e0618cea
perf(server): optimize destinationsByServer query (#7854) 2026-01-02 19:53:46 +01:00
Andras Bacsai
dd7962885c
fix: use original_server for log drain config in generate_compose_file (#7619) 2026-01-02 17:12:41 +01:00
Andras Bacsai
63380d27c7 fix(service): prevent public toggle from saving entire database form
The instantSave method for the 'Make it publicly available' checkbox was
calling submitDatabase(), which saved all form fields. This caused
unintended saves when only toggling the public visibility. The
syncDatabaseData() call already handles saving the public toggle state.
2026-01-02 16:59:20 +01:00
Andras Bacsai
29c62cb38f fix(service): use database UUID for ServiceDatabase proxy container name
The proxy container was incorrectly named using the service UUID instead
of the database UUID, causing proxy logs to query the wrong container.
Each ServiceDatabase should have its own uniquely named proxy container.
2026-01-02 16:49:24 +01:00
Andras Bacsai
f53229b7af
feat: add ServiceDatabase restore/import support (#7540) 2026-01-02 16:32:27 +01:00
Andras Bacsai
796bb3a19d feat: Refactor service database management and backup functionalities
- Introduced a new sidebar component for service database navigation.
- Updated routes for database import and backup functionalities.
- Refactored the database import view to improve clarity and maintainability.
- Consolidated service application and database views into a more cohesive structure.
- Removed deprecated service application view and integrated its functionalities into the service index.
- Enhanced user experience with modal confirmations for critical actions.
- Improved code readability and organization across various components.
2026-01-02 16:29:48 +01:00
luojiyin
a38717810c
perf(server): optimize destinationsByServer query
Replace in-memory filtering with database-level query in
Server::destinationsByServer(). Previously loaded all team servers
into memory before filtering by ID. Now uses findOrFail() to query
directly at the database level.
2026-01-02 22:09:38 +08:00
Andras Bacsai
7ea4191aac feat: add Sessy as one-click service
Add email observability platform Sessy to the service catalog with auto-generated HTTP Basic Auth credentials and SQLite storage.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-02 14:38:19 +01:00
Andras Bacsai
9466ad4a48 fix(service): handle missing service database and redirect to configuration 2026-01-02 13:46:53 +01:00
Andras Bacsai
360a82ec5d Merge branch 'next' into feat/servicedatabase-restore 2026-01-02 13:45:15 +01:00
Andras Bacsai
009b4e7d48
fix(settings): fix 404 on /settings for root user on cloud (#7785) 2026-01-02 13:18:07 +01:00
Andras Bacsai
b448b08058
fix: prevent metric charts from freezing on page navigation (#7848) 2026-01-02 13:13:45 +01:00
Andras Bacsai
6cdda5427a
Fix: Trim whitespace from domain input in instance settings (#7837) 2026-01-02 13:12:11 +01:00
Andras Bacsai
a8aa452475 fix: prevent metric charts from freezing when navigating with wire:navigate
Wraps inline chart initialization scripts in IIFEs to create local scope for variables. This prevents "Identifier has already been declared" errors when Livewire's SPA navigation re-executes scripts, allowing smooth navigation between metrics pages without page refresh.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-02 12:36:17 +01:00
claude[bot]
5b6074c38a Move FQDN trim before validation in submit() method
The trim operation was happening after validation, which meant
whitespace was counted toward the max:255 validation rule. Now
input is normalized before validation, matching the pattern used
in Application and Service components.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Andras Bacsai <andrasbacsai@users.noreply.github.com>
2026-01-02 11:16:52 +00:00
Andras Bacsai
006e787e2a
feat(logs): Add loading indicator to download all logs buttons (#7847) 2026-01-02 12:05:14 +01:00
Andras Bacsai
4d4254b591
claude fix test (#7825) 2026-01-02 12:04:23 +01:00
Andras Bacsai
a980fd460a feat(logs): Add loading indicator to download all logs buttons
Add visual feedback when downloading all logs in both container and deployment log views. Users now see an animated spinner and "Downloading..." text, preventing multiple concurrent downloads and improving UX during long operations.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-02 12:04:17 +01:00
Andras Bacsai
b33962bf82 chore: remove unused $server property and add missing import
- Remove unused $server property and Server import from Advanced.php
- Add proper import for UpdateStripeCustomerEmailJob in User.php

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 15:42:21 +01:00
claude[bot]
d130030ad6 Fix domain input whitespace trimming in instance settings
- Add trim() to FQDN in instantSave() method to prevent whitespace from being saved
- Add trim() to FQDN in submit() method before validation and DNS checks
- Prevents invalid HostSNI rules caused by leading/trailing whitespace
- Fixes issue where accidental whitespace from copy-paste causes deployment failures

Fixes #7797

Co-authored-by: Andras Bacsai <andrasbacsai@users.noreply.github.com>
2026-01-01 10:45:13 +00:00
Andras Bacsai
a674720c7a
fix(metrics): prevent 30-day interval page freeze with LTTB downsampling (#7787) 2025-12-31 11:51:48 +01:00
Andras Bacsai
770ce2d327 Refactor application general settings view for improved readability and maintainability
- Adjusted indentation and formatting for better code clarity.
- Simplified conditional statements and removed unnecessary null checks.
- Enhanced user interface elements for Docker Compose and Dockerfile configurations.
- Improved handling of deployment commands and network settings.
- Updated helper texts for better user guidance.
2025-12-31 11:44:08 +01:00
Andras Bacsai
3ffe05f0ce refactor: remove unused updateServiceEnvironmentVariables method 2025-12-31 11:32:02 +01:00
Claude
bbb2aa9ad4
feat(logs): Add dropdown to download displayed or all logs
Users can now choose between downloading only the currently displayed
logs or fetching and downloading all available logs from the container.

Changes:
- Add downloadAllLogs() method that fetches all logs without limit
- Replace download button with dropdown menu
- Options: "Download displayed logs" and "Download all logs"

Addresses #7803
2025-12-29 17:59:23 +00:00
Claude
b484c0cc25
fix(logs): Remove hardcoded 2000 line display limit
The log viewer was artificially limiting display to 2000 lines
regardless of user's requested amount. Users could request 10k, 40k,
or 50k lines but only 2000 were ever shown.

Changes:
- Remove the hardcoded $maxDisplayLines = 2000 limit in the view
- Add MAX_LOG_LINES constant (50,000) in GetLogs component
- Enforce maximum limit in backend to prevent extremely large requests
- Update input field with max attribute and tooltip

Fixes #7803
2025-12-29 17:52:35 +00:00
Andras Bacsai
8d212bc110 fix(team): improve team retrieval and session handling for users 2025-12-28 14:50:59 +01:00
Andras Bacsai
ddd78658e8 fix(user): improve cache key and remove redundant route check
- Include sessionTeamId in currentTeam() cache key to prevent stale
  team data when users switch teams
- Update refreshSession() to use new cache key format
- Remove redundant routeIs('settings.index') check since settings.*
  already matches it

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-28 14:02:41 +01:00
Andras Bacsai
2743229cc4 fix(user): complete User model fixes for non-web contexts
- Fix currentTeam() to return null instead of crashing when no session
- Fix role() to use $this->currentTeam() instead of global helper
- Add roleInTeam() method for explicit team context
- Remove unused otherTeams() method
- Fix InviteLink authorization bypass when role() returns null
- Fix confirmEmailChange() null safety for currentTeam()
- Fix ActivityMonitor to handle null currentTeam with fallback chain

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-28 13:55:55 +01:00
Andras Bacsai
2cf915aed8 fix(user): use $this instead of Auth::user() in User model methods
Fix isInstanceAdmin(), currentTeam(), otherTeams(), and role() methods
to operate on the actual User instance instead of always using the
authenticated user. This ensures correct behavior when these methods
are called on non-authenticated user instances (e.g., in ActivityMonitor).

Also fix settings route check to use routeIs() instead of path matching.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-28 13:55:55 +01:00
Andras Bacsai
acff543e09 fix(settings): fix 404 on /settings for root user on cloud instance
- Make Server property nullable in Settings components (Index, Advanced, Updates)
- Add conditional server loading: only load when not on cloud
- Add null checks before using server for DNS validation and proxy configuration
- Fix isInstanceAdmin() to check root team's pivot role directly instead of current team
- Make root team (id=0) bypass subscription check on cloud
- Remove isInstanceAdmin() from main middleware bypass: only settings/admin routes are exempted
- Update isSubscribed() to only check isSubscriptionActive() for navbar consistency

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-28 13:55:55 +01:00
Andras Bacsai
bd22c0e470 fix: back navigation in global search resource selection
Add smart goBack() method that skips auto-selected steps and returns to the
last step where user had a real choice. This prevents navigation loops when
previous steps only have a single option and auto-select.

Fixes #7739

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-28 13:53:26 +01:00
Andras Bacsai
0e9dbc3625 fix(metrics): address code review feedback for LTTB downsampling
- Wrap return values in collect() to maintain Collection compatibility
- Add comment explaining threshold <= 2 prevents division by zero
- Refactor tests to use actual Server model method via reflection
- Use seeded mt_rand() for reproducible test results

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-28 13:39:43 +01:00
Andras Bacsai
f199b6bfc4 fix(metrics): prevent page freeze with 30-day server metrics interval using LTTB downsampling
Implement the Largest-Triangle-Three-Buckets (LTTB) algorithm to downsample
metrics data for large time intervals (30 days generates 260K-500K+ points).
Reduces rendered points to ~1000 while preserving visual accuracy of peaks
and valleys. Fixes unresponsive page when selecting 30-day metrics interval.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-27 19:10:02 +01:00
Andras Bacsai
083d745d70
fix(restart): reset restart count when resource is manually stopped (#7784) 2025-12-27 15:22:26 +01:00
Andras Bacsai
75d8ebe803 fix(restart): reset restart count when resource is manually stopped
When a database or application was in a restart loop, the restart count
persisted even after the user manually stopped the resource. This caused
the UI to continue showing "(Xx restarts)" after user intervention.

Now resets restart_count, last_restart_at, and last_restart_type when:
- User stops a database (StopDatabase action)
- User stops an application (StopApplication action)

The existing reset in GetContainersStatus is still needed for containers
that exit on their own (crash without recovery, Docker giving up).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-27 15:21:19 +01:00
Andras Bacsai
367d7eeabc fix(proxy): defer UI refresh until Traefik version check completes
Fixes #7732 - The proxy status change listener was dispatching ProxyStatusChangedUI
before the Traefik version check job had a chance to run. This caused users to see
stale version information when they refreshed the page immediately after restarting
the proxy.

The fix defers the UI refresh when a Traefik version check is being dispatched. The
version check job already dispatches its own ProxyStatusChangedUI event when
complete, ensuring the UI refreshes with updated version data.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-27 15:16:58 +01:00
Andras Bacsai
ef1abe17b8 refactor(redirect): replace redirect calls with redirectRoute helper for consistency 2025-12-26 13:29:59 +01:00
Andras Bacsai
5d98847e49 feat(redirect): add redirectRoute helper for SPA navigation support 2025-12-26 13:29:59 +01:00
Andras Bacsai
41b3c71d02 fix(terminal): add sudo for non-root users to access Docker socket in terminal command 2025-12-26 11:49:02 +01:00
Andras Bacsai
9a1020d5be fix(database): replace temporary file handling with base64 encoding for Keydb and Redis configuration 2025-12-25 18:17:42 +01:00
Andras Bacsai
f995426fb3 fix(sentinel): Add missing instantSave method and prevent duplicate notifications
- Add public instantSave() method to handle instant saves from checkbox clicks
- Remove redundant updatedIsMetricsEnabled() and updatedIsSentinelDebugEnabled() hooks
- These hooks were causing duplicate notifications when checkboxes were toggled

The instantSave attribute on checkboxes triggers wire:click='instantSave', which was failing
because the method didn't exist. Now it saves settings and restarts Sentinel in one action,
preventing the duplicate updates from both wire:click and wire:model events.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-23 15:34:09 +01:00
Andras Bacsai
f77a2674fc
feat: Add manual Stripe subscription sync command (#7706) 2025-12-19 09:35:52 +01:00
Andras Bacsai
e6ed3130b5 feat(stripe): Add manual subscription sync command with dry-run support
Add cloud:sync-stripe-subscriptions command to manually check all
subscriptions against Stripe. By default it only reports discrepancies
without making changes. Use --fix flag to actually apply corrections.

This addresses race conditions where subscriptions can be cancelled in
Stripe but remain marked as active in Coolify's database.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-19 09:34:39 +01:00
Andras Bacsai
c6c9d5a591 fix(deployment): Skip docker rm -f for builder containers with --rm flag
Builder containers are started with the --rm flag, which automatically removes them when stopped. The explicit docker rm -f is redundant and adds unnecessary steps to deployment logs.

This change adds a skipRemove parameter to graceful_shutdown_container() and sets it to true for builder container shutdowns (uuid-based) while keeping the default behavior for application containers.

Fixes #7566

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-18 19:36:54 +01:00
Andras Bacsai
21ce75e4d4
Revert "fix(deployment): Remove redundant docker rm when using --rm flag" 2025-12-18 13:20:59 +01:00
Andras Bacsai
922c0a9e7c
Fix deployment logs flickering and HTML entity encoding (#7689) 2025-12-18 12:53:02 +01:00
Andras Bacsai
d28e7f7f8a
fix(deployment): Remove redundant docker rm when using --rm flag (#7688) 2025-12-18 12:31:21 +01:00
Andras Bacsai
6379123f93 fix(deployment): Remove redundant docker rm when using --rm flag
Helper containers are started with --rm flag which automatically removes the container when it stops. Removed redundant docker rm commands from graceful_shutdown_container in ApplicationDeploymentJob and replaced docker rm with docker stop in DatabaseBackupJob.

🤖 Generated with Claude Code

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-18 12:30:34 +01:00
Andras Bacsai
9493398b58 Fix deployment logs flickering and HTML entity encoding
- Remove per-line x-effect directives that re-evaluated for every log line during polling
- Replace with efficient applySearch() function that updates logs once after Livewire morph
- Remove unnecessary caching mechanisms (renderTrigger, decodeCache, matchCountCache)
- Remove double HTML encoding of log lines (e() + Blade escaping)
- Add decodeHtml() helper to properly decode HTML entities from data attributes
- Use morph.updated hook instead of commit hook for efficient DOM updates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-18 12:30:26 +01:00
Andras Bacsai
9675d74360 refactor: move Swarm and Sentinel to dedicated sidebar menu items
- Create new Server/Swarm.php Livewire component and view for Swarm configuration
- Create new Server/Sentinel.php Livewire component and view for Sentinel settings
- Add server.swarm and server.sentinel routes
- Move Swarm and Sentinel sections from General page to sidebar menu items
- Improve organization by separating concerns into dedicated pages

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-18 12:18:22 +01:00
Andras Bacsai
27f2e32fbf
Improve logging view performance to prevent browser freezing (#7682) 2025-12-18 08:50:04 +01:00
Andras Bacsai
acd7106f93 Refactor log view to eliminate flickering during refresh
- Use atomic update pattern in backend: collect logs into temp variable
  before replacing outputs (prevents empty state flash)
- Remove per-line x-effect directives that caused 4000+ reactive
  evaluations on every update
- Replace inline Alpine.js class bindings with CSS utility classes
- Use single $watch and morph.updated hook instead of renderTrigger
- Remove HTML entity decode cache (no longer needed)
- Fix search highlight padding that caused text shifting

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 08:46:39 +01:00
Andras Bacsai
582bdc3739 test: Add comprehensive preview deployment port and path tests
Add missing edge case test for root path (/) and expand test coverage
for preview FQDN generation. Tests verify that ports and paths are
correctly preserved in preview URLs while excluding root paths.

Fixes #2184
2025-12-17 21:35:54 +01:00
Andras Bacsai
7f29a46186
feat: Add copy logs button to deployment and runtime logs (#7676) 2025-12-17 20:57:44 +01:00
Andras Bacsai
6f2a33f859 feat: Add copy logs button to deployment and runtime logs
Add copy-to-clipboard functionality for both deployment logs and runtime container logs with success notification. Fixed event dispatch to use Livewire.dispatch() for proper toast notification handling. Reorganized copy and download buttons to appear consecutively in runtime logs toolbar.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-17 20:54:22 +01:00
Andras Bacsai
4b65b02103 Fix server resources tab 500 error with mixed model types
The Resources tab threw a "Queueing collections with multiple model types is not supported" error because the Livewire component was storing a mixed-type Eloquent collection (Applications, Databases, Services) as a public property, causing Livewire's serialization to fail.

Fixed by: storing only the unmanaged containers array in the component, and calling definedResources() directly in the Blade view for the managed tab.

Fixes #7666

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-17 18:13:55 +01:00
Andras Bacsai
1b3be5bef6
Fix database status flickering and add restart tracking (#7665) 2025-12-17 17:48:15 +01:00
Andras Bacsai
d04d0ab499 Refactor restart tracking and add missing model casts
- Consolidate duplicate restart tracking logic in GetContainersStatus
- Add last_restart_type string cast to all 8 standalone database models

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 17:45:58 +01:00
Andras Bacsai
6d47d24169 Fix standalone database "restarting" status flickering and add restart tracking
- Fix status flickering: Track databases in active/transient states (restarting, starting, created, paused) not just running
- Add isActiveOrTransient() helper to distinguish between active states and terminal states (exited, dead)
- Add safeguard: Protect updateNotFoundDatabaseStatus() from marking as exited when containers collection is empty
- Add restart_count tracking: New migration adds restart_count, last_restart_at, last_restart_type to all standalone database tables
- Update 8 database models with $casts for new restart tracking fields
- Update GetContainersStatus to extract RestartCount from Docker and update database models
- Reset restart tracking when database exits completely

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-17 16:25:41 +01:00
Andras Bacsai
96f2e81191
feat: copy resource logs with PII/secret sanitization (#7648) 2025-12-17 16:05:13 +01:00
Andras Bacsai
679833a0a6 Fix PostgreSQL version selection in global search redirect
Allow users to select PostgreSQL version instead of automatically creating postgres:16-alpine when using global search. The fix includes:

- Remove hardcoded database_image parameter from GlobalSearch
- Update Create.php to fall through to Select component when database_image is not provided
- Add type and destination to Select component query string with proper URL mapping
- Jump directly to PostgreSQL version selection step when navigating from global search

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-17 16:01:39 +01:00
Andras Bacsai
20c6f61858
Add toggleable wire:navigate SPA navigation with prefetching (#7661) 2025-12-17 14:27:19 +01:00
Andras Bacsai
e709e2c131 Add toggleable wire:navigate SPA navigation with prefetching
Implement instance-wide SPA navigation toggle that enables smooth page transitions with prefetching on hover. Excludes terminal links which require full page lifecycle for WebSocket connections. Adds defensive checks to global-search component for SPA navigation compatibility.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-17 12:09:13 +01:00
Andras Bacsai
d4a403278d
Added ClickHouse Migration Support (#7392) 2025-12-17 11:37:53 +01:00
Andras Bacsai
df0ad44500 Widen upgrade popup and add dev mode simulation
- Set modal width to consistent 48rem for both upgrade states
- Remove max-width constraint from progress stepper
- Add dev mode with Simulate button for local testing
- Simulate cycles through all upgrade steps with 2-second delays
2025-12-17 10:59:38 +01:00
Andras Bacsai
f763c3aa8b Refactor project environment and resource management UI
- Removed unnecessary SVG icons from the environment edit view for cleaner UI.
- Deleted the environment select component as it was no longer needed.
- Enhanced the project resource index view with a dropdown for environments and resources, improving navigation.
- Implemented dynamic dropdowns for environments and their associated resources, allowing for better user interaction.
- Added transitions and hover effects for a more responsive design.
- Updated the layout to ensure a consistent user experience across different project resources.
2025-12-16 12:30:53 +01:00
Andras Bacsai
2646fb81eb
Optimize PushServerUpdateJob with batch updates and async jobs (#7639) 2025-12-16 12:22:24 +01:00
Duane Adam
b0b3098abe
Merge branch 'next' into feat/copy-resource-logs-with-sanitization 2025-12-16 12:03:53 +08:00
Duane Adam
327e8181af
Add copy logs button with PII/secret sanitization
Add a copy button to individual container logs that strips sensitive
data before copying to clipboard. Includes sanitization for emails,
database URLs with passwords, JWT tokens, API keys, private key blocks,
and git access tokens.
2025-12-16 11:49:40 +08:00
Andras Bacsai
eefc97fccc
feat: prioritize main/master branch selection (#7520) 2025-12-15 15:47:57 +01:00
Andras Bacsai
0efa4af5c3 Optimize PushServerUpdateJob performance with batch updates and async jobs
- Eager load service applications and databases to eliminate N+1 queries
- Replace individual model updates with batch database updates for applications, previews, and services
- Move connectProxyToNetworks to async ConnectProxyToNetworksJob to avoid blocking status updates
- Optimize Server.databases() and applications() methods with efficient database queries
- Use flatMap for cleaner collection transformations

🤖 Generated with Claude Code

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-15 14:06:32 +01:00
Andras Bacsai
5e90fc6b8f Fix S3 credential whitespace issue with proper trimming
- Add model saving event to trim key/secret fields (encrypted casts)
- Add attribute mutators to trim endpoint, bucket, region fields
- Create migration to fix existing S3 storage records with whitespace
- Use chunking in migration to handle large datasets efficiently
- Verify re-encryption validity before committing changes

Fixes #7469 #7594

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-15 12:05:54 +01:00
Andras Bacsai
36d7844989 Fix deployment log view UX issues
- Prevent text selection from being cleared when logs are re-rendered during polling
- Preserve fullscreen state when toggling debug logs or other Livewire updates
- Fix log filtering to properly apply when debug mode is toggled

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-15 10:47:03 +01:00
Andras Bacsai
2a21b18998
Improve upgrade process UX with better progress visibility (#7609) 2025-12-13 22:37:37 +01:00
Andras Bacsai
918959b7f5 Remove unused ChangelogService import from Upgrade component 2025-12-13 22:26:31 +01:00
Andras Bacsai
20a9855c04 Address CodeRabbit review feedback
- Fix null-safe operator on currentTeam() call in Upgrade.php
- Add --rm flag to docker run in upgrade.sh for cleanup consistency
- Store beforeunload handler as named reference and clean up on success
- Add clarifying comments for upgrade method calls
- Add error state handling with close option in upgrade modal
- Add step mapping documentation comment in upgrade-progress component

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-13 21:42:19 +01:00
Andras Bacsai
dc12cbc6a0 Remove changelog loading logic from upgrade component 2025-12-13 21:14:00 +01:00
OZCAP
80d432171d fix: use original_server for log drain config in generate_compose_file
When build server is enabled, $this->server points to the build server.
The log drain configuration check was using $this->server which would
incorrectly check the build server's settings instead of the deployment
server where the container actually runs.

This fix ensures log drain configuration is correctly applied based on
the deployment server's settings by using $this->original_server.
2025-12-13 10:43:35 +04:00
Andras Bacsai
deb9a7dab0 Refactor upgrade status to use Livewire instead of API endpoint
- Remove /api/upgrade-status endpoint and route
- Add getUpgradeStatus() method to Upgrade Livewire component
- Update frontend to call Livewire method via $wire.getUpgradeStatus()
- Simpler approach: no separate API, auth handled by Livewire

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 21:37:32 +01:00