Commit graph

14110 commits

Author SHA1 Message Date
Andras Bacsai
16b720bb16
Merge branch 'next' into v4.x 2025-12-15 15:50:14 +01:00
Andras Bacsai
40ba8d5124
feat:(service) Add Penpot with s3 (#7407) 2025-12-15 15:49:48 +01:00
Andras Bacsai
28fd7775e2
feat:(service) Bump Beszel version to 0.16.1 (#7409) 2025-12-15 15:49:35 +01:00
Andras Bacsai
b84e5949f4
feat:(service) Add Beszel Agent as standalone template (#7412) 2025-12-15 15:49:22 +01:00
Andras Bacsai
e456e57ed9
fix:(service) Remov depreciated env and services on Penpot (#7415) 2025-12-15 15:49:11 +01:00
Andras Bacsai
ed64761caf
Add STORE_MODEL_IN_DB to LiteLLM environment variables (#7440) 2025-12-15 15:48:32 +01:00
Andras Bacsai
729697db13
Fix CSRF Login issues, adjust PAPERLESS_URL environment variable refe… (#7450) 2025-12-15 15:48:17 +01:00
Andras Bacsai
eefc97fccc
feat: prioritize main/master branch selection (#7520) 2025-12-15 15:47:57 +01:00
Andras Bacsai
75bf4c3133
fix(service): postiz showing no available server (#7595) 2025-12-15 15:47:26 +01:00
Andras Bacsai
986c003ac2
Feat: escape key fullscreen exit for logs view (#7632) 2025-12-15 15:47:10 +01:00
Andras Bacsai
b36f59fe58 Merge branch 'next' into feat/escape-key-fullscreen-exit
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 15:43:39 +01:00
Andras Bacsai
383572edac
Fix S3 credential whitespace issue with proper trimming (#7638) 2025-12-15 12:23:20 +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
9a61a35985
Update Umami image tag to latest version (#7459) 2025-12-15 11:28:27 +01:00
Andras Bacsai
c127a09364
fix: add idempotency guards to 18 migrations (#7637) 2025-12-15 11:24:48 +01:00
Andras Bacsai
07cd389eb9 fix: add idempotency guards to 18 migrations to prevent upgrade failures
When any migration fails due to table/column already existing, PostgreSQL rolls back
the entire batch and blocks all subsequent migrations. Add Schema::hasTable() and
Schema::hasColumn() guards to all problem migrations for safe re-execution.

Fixes #7606 #7625

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-15 11:23:04 +01:00
Andras Bacsai
e0b2424b76
Fix deployment log view UX issues (#7636) 2025-12-15 11:01:34 +01:00
Andras Bacsai
987252a179 Move polling button next to refresh button in runtime logs
Reorder toolbar buttons so that Refresh and Stream Logs (polling)
are adjacent, making the related actions easier to find.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 10:57:07 +01:00
Andras Bacsai
6b9c633fe7 Prevent Livewire from morphing logs when text is selected
Use Livewire's morph.updating hook to skip DOM morphing of the logs
container when user has text selected. This prevents the selection from
being lost when polling or manual refresh occurs.

The previous fix only prevented the JavaScript-based re-render, but
Livewire's morphing was still replacing the DOM elements entirely.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 10:53:02 +01:00
Andras Bacsai
5cc822c996 Fix text selection issue in runtime logs view
Apply the same selection preservation fix to the runtime logs component
(get-logs.blade.php) that was applied to deployment logs:
- Add hasActiveLogSelection() helper to detect active text selection
- Skip re-render when user has text selected (preserves copy ability)
- Add renderTrigger mechanism to ensure filtering works after refresh
- Use x-effect for hidden state to properly react to Livewire updates

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 10:52:00 +01:00
Andras Bacsai
d40c2caca2 Fix text disappearing during selection in deployment logs
Ensure initial render happens even when selection is active by checking
if element already has content before skipping re-render.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-15 10:49:26 +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
Lukas
f0dc00f207 Add STORE_MODEL_IN_DB to env variables 2025-12-14 21:08:27 +01:00
Kyle Essenmacher
8d20d50937 feat: add Escape key support to exit fullscreen logs view 2025-12-14 14:17:37 -05:00
Andras Bacsai
6fe4ebeb7e Refactor docker run commands in upgrade script to remove project name specification 2025-12-14 10:22:11 +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
c6945c86ea Parse Docker images dynamically from docker-compose files
Replace hardcoded image pulls (postgres:15-alpine, redis:7-alpine,
coolify-realtime:1.0.10) with dynamic extraction using
`docker compose config --images`. This ensures the upgrade script
automatically handles new services and version changes without
manual updates.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-13 22:12:33 +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
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
Andras Bacsai
d111f448f5 Consolidate upgrade-status routes into single group
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 21:35:02 +01:00
Andras Bacsai
43ede6c523 Fix upgrade-status auth to use web session instead of sanctum
The endpoint is called from browser with session cookies, not API tokens.
Use 'web' and 'auth' middleware for proper session-based authentication.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 21:33:54 +01:00
Andras Bacsai
abbfd60f1c Add debug info to upgrade-status endpoint for troubleshooting
Temporary debug fields added to identify why status returns 'none'

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 21:30:41 +01:00
Andras Bacsai
f0d6ae289c Read upgrade status file via SSH from localhost server
The status file is on the host filesystem, not inside the container.
Use instant_remote_process() to read the file via SSH to Server::find(0).

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 21:20:35 +01:00
Andras Bacsai
3cc416a806 Restrict upgrade-status endpoint to authenticated root team members
- Add auth:sanctum middleware to /api/upgrade-status route
- Check user belongs to root team (id 0) before returning status
- Return 403 if user is not authorized
- Update frontend to send credentials with fetch request
- Update OpenAPI docs with 401/403 responses

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 21:16:36 +01:00
Andras Bacsai
dc9f612df4 Clean up status file after upgrade and reduce data exposure
- Delete status file 10 seconds after upgrade completes
- Reduce stale timeout from 30 to 10 minutes
- Remove timestamp from API response (internal detail)
- Treat timestamp parse failures as stale for security

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 21:14:31 +01:00
Andras Bacsai
b8cfc3f7c9 Add real-time upgrade progress tracking via status file
- upgrade.sh now writes status to /data/coolify/source/.upgrade-status
- New /api/upgrade-status endpoint reads status file for real progress
- Frontend polls status API instead of simulating progress
- Falls back to health check when service goes down during restart

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 21:11:32 +01:00
Andras Bacsai
0aa7e376b2 Simplify upgrade modal and improve help text
- Remove changelog preview section to streamline the UI
- Simplify warning message
- Add reference to upgrade logs location on server
- Minor formatting improvements

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-12 17:41:14 +01:00
Andras Bacsai
a3bc59dae2
Fix Docker container race condition during upgrades (#7603) 2025-12-12 17:38:30 +01:00
Andras Bacsai
92326c09ea Improve upgrade process UX with better progress visibility
- Add step-by-step progress indicator (Preparing → Helper → Image → Restart)
- Display elapsed time during upgrade (MM:SS format)
- Show version transition in header (v4.0.0-beta.454 → v4.0.0-beta.456)
- Add expandable changelog preview before upgrading
- Reduce reload delay from 5s to 3s with countdown timer
- Add "Reload Now" button to skip countdown
- Improve status messages with step-specific descriptions
- Add success state with clear indication when upgrade completes
- Create new upgrade-progress component for visual step tracking

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-12 17:26:08 +01:00
Andras Bacsai
30ac4e079c Fix variable expansion in upgrade log message
Use double quotes for LATEST_IMAGE variable in log output so it
expands correctly inside the nohup subshell.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 17:22:01 +01:00
Andras Bacsai
1f7888f515 Use nohup for container restart to survive SSH disconnect
When upgrade is triggered from Coolify UI, the SSH connection is lost when
the coolify container stops. Using nohup ensures the container stop/start
sequence continues in the background even after the connection drops.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 15:41:09 +01:00
Andras Bacsai
f4dbae1805 Revert container stop order to original
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 15:39:08 +01:00
Andras Bacsai
f3ccacb2da Stop coolify container last during upgrade
Reorder container stop sequence to stop dependencies first (db, redis,
realtime) before stopping the main coolify container. This prevents the
upgrade process from being interrupted when triggered from Coolify UI.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 15:36:01 +01:00
Andras Bacsai
7dc93001e3 Improve log file format with timestamps and sections
- Add log() helper for timestamped entries
- Add log_section() for clear section headers
- Include upgrade metadata at start (version, registry, etc.)
- Log each step with clear descriptions
- Add completion timestamp at end
- Track container operations individually

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 15:32:49 +01:00
Andras Bacsai
6a9027dcbf Add human-friendly output to upgrade script
- Show clear progress with numbered steps (1/6 through 6/6)
- Display header and footer banners
- Show individual image pull progress
- Show which containers are being stopped
- Display final success message with version and log location
- Keep detailed logging to file for debugging

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 15:18:57 +01:00
Andras Bacsai
c45cbc04c8 Pull images before stopping containers during upgrade
Ensures images are available before taking down the system. If pull fails
(rate limits, network issues, expired tokens), upgrade aborts safely
without leaving Coolify in a broken state.

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 14:54:24 +01:00
Andras Bacsai
ad013ca7da
Skip password confirmation for OAuth users (#7608) 2025-12-12 14:51:33 +01:00
Andras Bacsai
b0d50669b1 fix: skip password confirmation for OAuth users
OAuth users don't have passwords set, so they should not be prompted for password confirmation when performing destructive actions. This fix:
- Detects OAuth users via the hasPassword() method
- Skips password confirmation in modal for OAuth users
- Keeps text name confirmation as the final step
- Centralizes logic in helper functions for maintainability
- Changes button text to "Confirm" when password step is skipped

Fixes #4457

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-12 14:12:02 +01:00