coolify/app/Jobs
Andras Bacsai d9774d2968 Fix: Prevent version downgrades and centralize CDN configuration (#7383)
## Root Cause
Between Nov 25-26, a CDN redirect was added without curl's `-L` flag,
causing version cache corruption and automatic downgrades.

## Three Critical Bugs Fixed

### Bug #1: CheckForUpdatesJob could overwrite newer cached version
- Problem: CDN serving older version would overwrite local cache
- Solution: Smart version merge - keep max Coolify version, update other components
- Location: app/Jobs/CheckForUpdatesJob.php:33-52

### Bug #2: Manual updates bypassed downgrade protection
- Problem: Downgrade guard only applied to auto-updates
- Solution: Always block downgrades for both manual and auto-updates
- Location: app/Actions/Server/UpdateCoolify.php:65-75

### Bug #3: Updates used stale local cache
- Problem: Never validated cache against CDN at update time
- Solution: Fetch fresh CDN data before executing updates
- Location: app/Actions/Server/UpdateCoolify.php:34-49

## Additional Improvement: Centralized CDN Configuration

Added three new config keys for easy CDN management:
- `cdn_url` - Base CDN URL (default: https://cdn.coollabs.io)
- `versions_url` - Full versions.json URL
- `upgrade_script_url` - Full upgrade.sh URL

All configurable via environment variables:
```bash
CDN_URL=https://cdn.coolify.io
VERSIONS_URL=https://custom-cdn.example.com/versions.json
UPGRADE_SCRIPT_URL=https://custom-cdn.example.com/upgrade.sh
```

## Files Modified
- config/constants.php - CDN configuration
- app/Jobs/CheckForUpdatesJob.php - Smart version merge + centralized URL
- app/Actions/Server/UpdateCoolify.php - Downgrade protection + fresh fetch + centralized URLs
- app/Jobs/CheckHelperImageJob.php - Centralized URL
- bootstrap/helpers/shared.php - Centralized URL

## Testing
-  All modified files pass Pint formatting
-  78 unit tests pass (2 pre-existing failures unrelated to changes)

## Impact
- No breaking changes - defaults to current CDN
- Easy CDN migration via environment variables
- Prevents all downgrade scenarios
- Maintains independent Sentinel/Helper/Traefik updates

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-28 15:20:33 +01:00
..
ApplicationDeploymentJob.php fix(docker): replace deprecated --time flag with -t for full compatibility across Docker versions (#6807) 2025-11-28 10:47:19 +01:00
ApplicationPullRequestUpdateJob.php Merge branch 'next' into feat/update-applicationpullrequestupdatejob-documentation 2025-10-15 00:59:02 +02:00
CheckAndStartSentinelJob.php fix: add timeout to sentinel process checks for improved reliability 2025-01-10 13:03:47 +01:00
CheckForUpdatesJob.php Fix: Prevent version downgrades and centralize CDN configuration (#7383) 2025-11-28 15:20:33 +01:00
CheckHelperImageJob.php Fix: Prevent version downgrades and centralize CDN configuration (#7383) 2025-11-28 15:20:33 +01:00
CheckTraefikVersionForServerJob.php refactor: send immediate Traefik version notifications instead of delayed aggregation 2025-11-18 12:30:50 +01:00
CheckTraefikVersionJob.php refactor: send immediate Traefik version notifications instead of delayed aggregation 2025-11-18 12:30:50 +01:00
CleanupHelperContainersJob.php fix(deployment): prevent base deployments from being killed when PRs close (#7113) 2025-11-09 14:41:35 +01:00
CleanupInstanceStuffsJob.php feat(email): implement email change request and verification process 2025-08-18 14:54:08 +02:00
CleanupStaleMultiplexedConnections.php format 2024-09-23 19:51:31 +02:00
CoolifyTask.php feat: streamline S3 restore with single-step flow and improved UI consistency 2025-11-17 10:05:18 +01:00
DatabaseBackupJob.php fix: enhance security by validating and escaping database names, file paths, and proxy configuration filenames to prevent command injection 2025-11-27 14:36:31 +01:00
DeleteResourceJob.php Merge branch 'next' into shadow/fix-docker-time-command 2025-11-28 10:25:42 +01:00
DockerCleanupJob.php fix(docker): volumes get delete when stopping a service if Delete Unused Volumes is activated (#6317) 2025-08-04 21:15:56 +02:00
GithubAppPermissionJob.php chore: remove more logging 2025-01-06 21:16:57 +01:00
PullChangelog.php refactor(jobs): pull github changelogs from cdn instead of github 2025-09-01 16:13:55 +02:00
PullTemplatesFromCDN.php refactor(templates): update service template file handling to use dynamic file name from constants 2025-08-12 10:06:19 +02:00
PushServerUpdateJob.php fix: comprehensive SERVICE_URL/SERVICE_FQDN handling improvements and queue reliability fixes (#7275) 2025-11-24 11:47:11 +01:00
RegenerateSslCertJob.php refactor: replace direct SslCertificate queries with server relationship methods for consistency 2025-10-09 17:00:05 +02:00
RestartProxyJob.php feat(proxy): add Traefik version tracking with notifications and dismissible UI warnings 2025-11-14 11:35:22 +01:00
ScheduledJobManager.php feat(jobs): improve scheduled tasks with retry logic and queue cleanup 2025-11-10 11:11:18 +01:00
ScheduledTaskJob.php fix(ScheduledTaskJob): make server property nullable and update logging to handle null values 2025-11-11 15:38:55 +01:00
SendMessageToDiscordJob.php fix: make sure important jobs/actions are running on high prio queue 2024-11-22 11:16:01 +01:00
SendMessageToPushoverJob.php Revert "rector: arrrrr" 2025-01-07 15:31:43 +01:00
SendMessageToSlackJob.php feat(slack): Show message title in notification previews (#5063) 2025-02-11 16:31:37 +01:00
SendMessageToTelegramJob.php chore: rename topicID to threadId like in the telegram API response 2024-12-11 23:13:13 +01:00
SendWebhookJob.php feat: implement actual webhook delivery with Ray debugging 2025-10-10 18:07:04 +02:00
ServerCheckJob.php fix(jobs): update middleware to use expireAfter for WithoutOverlapping in multiple job classes 2025-07-01 10:50:27 +02:00
ServerCleanupMux.php Revert "rector: arrrrr" 2025-01-07 15:31:43 +01:00
ServerConnectionCheckJob.php fix: improve error logging and handling in ServerConnectionCheckJob for Hetzner server status 2025-10-10 10:12:59 +02:00
ServerFilesFromServerJob.php fix: make sure important jobs/actions are running on high prio queue 2024-11-22 11:16:01 +01:00
ServerLimitCheckJob.php refactor server limit check job + email notifications view 2024-11-05 11:22:23 +01:00
ServerManagerJob.php fix(deployment): improve error logging with exception types and hidden technical details 2025-11-17 14:44:39 +01:00
ServerPatchCheckJob.php fix(jobs): update middleware to use expireAfter for WithoutOverlapping in multiple job classes 2025-07-01 10:50:27 +02:00
ServerStorageCheckJob.php fix(horizon): add silenced jobs 2025-07-12 14:44:32 +02:00
ServerStorageSaveJob.php fix: make sure important jobs/actions are running on high prio queue 2024-11-22 11:16:01 +01:00
StripeProcessJob.php feat(stripe): enhance subscription handling and verification process 2025-09-23 11:00:38 +02:00
SubscriptionInvoiceFailedJob.php refactor(stripe-jobs): comment out internal notification calls and add subscription status verification before sending failure notifications 2025-09-13 19:35:32 +02:00
UpdateCoolifyJob.php fix: make sure important jobs/actions are running on high prio queue 2024-11-22 11:16:01 +01:00
UpdateStripeCustomerEmailJob.php feat(email): implement email change request and verification process 2025-08-18 14:54:08 +02:00
ValidateAndInstallServerJob.php fix: resolve Docker validation race conditions and sudo prefix bug 2025-11-27 09:04:42 +01:00
VerifyStripeSubscriptionStatusJob.php fix(subscription-job): enhance retry logic for VerifyStripeSubscriptionStatusJob 2025-09-23 18:17:52 +02:00
VolumeCloneJob.php feat: remote server volume cloning 2025-01-13 11:13:15 +01:00