Commit Graph

13934 Commits

Author SHA1 Message Date
Andras Bacsai 171732dbcf refactor: simplify environment variable deletion logic in booted method 2025-11-18 10:07:08 +01:00
Andras Bacsai 3cc3b4162c fix: remove unused variable in updatedBuildPack method 2025-11-18 10:05:06 +01:00
Andras Bacsai 2f3f0889c7 Merge branch 'v4.x' into cleanup-dockerfile-buildpack-switch 2025-11-18 09:47:11 +01:00
Andras Bacsai 36f8a58c28 refactor: move buildpack cleanup logic to model lifecycle hooks
Move buildpack switching cleanup from Livewire component to Application model's boot lifecycle. This improves separation of concerns and ensures cleanup happens consistently regardless of how the buildpack change is triggered. Also clears Dockerfile-specific data when switching away from dockerfile buildpack.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 09:46:04 +01:00
Andras Bacsai 4f096c4a87 fix: replace inline styles with Tailwind classes in modal-input (#7267) 2025-11-18 08:58:32 +01:00
Andras Bacsai 2eb4d091ea fix: replace inline styles with Tailwind classes in modal-input component
The modal-input component was using inline <style> blocks with ID selectors
to apply width constraints, which had inconsistent specificity and only
applied on lg+ breakpoints. This caused modals to appear full-width instead
of being properly constrained.

Replaced the inline style approach with Tailwind utility classes following
the pattern used in modal-confirmation component:
- Removed inline <style> block with media queries
- Added min-w-full and lg:min-w-[{minWidth}] for responsive minimum width
- Added max-w-[{maxWidth}] and max-h-[calc(100vh-2rem)] for size constraints

This ensures consistent modal sizing across all breakpoints and fixes the
full-width modal issue reported when adding shared environment variables.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 08:56:29 +01:00
🏔️ Peak 145074d5a2 Merge branch 'v4.x' into next 2025-11-17 18:08:42 +01:00
Andras Bacsai 680b9a2c10 Merge branch 'next' into s3-restore 2025-11-17 15:39:22 +01:00
Andras Bacsai f8dd44410a refactor(proxy): simplify getNewerBranchInfo method parameters and streamline version checks 2025-11-17 15:03:30 +01:00
Andras Bacsai 29bf4d29f0 fix(proxy): remove debugging ray call from Traefik version retrieval 2025-11-17 15:03:20 +01:00
Andras Bacsai 1270136da9 merge: merge next branch into feat-traefik-version-checker
Merged latest changes from the next branch to keep the feature branch
up to date. No conflicts were encountered during the merge.

Changes from next branch:
- Updated application deployment job error logging
- Updated server manager job and instance settings
- Removed PullHelperImageJob in favor of updated approach
- Database migration refinements
- Updated versions.json with latest component versions

All automatic merges were successful and no manual conflict resolution
was required.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 14:56:24 +01:00
Andras Bacsai 5d73b76a44 refactor(proxy): implement centralized caching for versions.json and improve UX
This commit introduces several improvements to the Traefik version tracking
feature and proxy configuration UI:

## Caching Improvements

1. **New centralized helper functions** (bootstrap/helpers/versions.php):
   - `get_versions_data()`: Redis-cached access to versions.json (1 hour TTL)
   - `get_traefik_versions()`: Extract Traefik versions from cached data
   - `invalidate_versions_cache()`: Clear cache when file is updated

2. **Performance optimization**:
   - Single Redis cache key: `coolify:versions:all`
   - Eliminates 2-4 file reads per page load
   - 95-97.5% reduction in disk I/O time
   - Shared cache across all servers in distributed setup

3. **Updated all consumers to use cached helpers**:
   - CheckTraefikVersionJob: Use get_traefik_versions()
   - Server/Proxy: Two-level caching (Redis + in-memory per-request)
   - CheckForUpdatesJob: Auto-invalidate cache after updating file
   - bootstrap/helpers/shared.php: Use cached data for Coolify version

## UI/UX Improvements

1. **Navbar warning indicator**:
   - Added yellow warning triangle icon next to "Proxy" menu item
   - Appears when server has outdated Traefik version
   - Uses existing traefik_outdated_info data for instant checks
   - Provides at-a-glance visibility of version issues

2. **Proxy sidebar persistence**:
   - Fixed sidebar disappearing when clicking "Switch Proxy"
   - Configuration link now always visible (needed for proxy selection)
   - Dynamic Configurations and Logs only show when proxy is configured
   - Better navigation context during proxy switching workflow

## Code Quality

- Added comprehensive PHPDoc for Server::$traefik_outdated_info property
- Improved code organization with centralized helper approach
- All changes formatted with Laravel Pint
- Maintains backward compatibility

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 14:53:28 +01:00
Andras Bacsai fb19364a55 fix: eliminate duplicate error logging in deployment methods (#7248) 2025-11-17 14:51:11 +01:00
Andras Bacsai c3c7dd2543 Merge branch 'next' into deploy-error-logging 2025-11-17 14:44:54 +01:00
Andras Bacsai b602fef4db fix(deployment): improve error logging with exception types and hidden technical details
- Add exception class names to error messages for better debugging
- Mark technical details (error type, code, location, stack trace) as hidden in logs
- Preserve original exception types when wrapping in DeploymentException
- Update ServerManagerJob to include exception class in log messages
- Enhance unit tests to verify hidden log entry behavior

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 14:44:39 +01:00
Andras Bacsai 9930e1bc50 fix(security): mitigate path traversal vulnerability in S3RestoreJobFinished 2025-11-17 14:37:19 +01:00
Andras Bacsai 648e111f10 Merge remote-tracking branch 'origin/next' into s3-restore
# Conflicts:
#	app/Models/InstanceSettings.php
2025-11-17 14:30:00 +01:00
Andras Bacsai 41d8f46999 fix: resolve duplicate migration timestamps (#7254) 2025-11-17 14:28:45 +01:00
Andras Bacsai 028e7cb35e fix: remove unnecessary table existence checks in migration files 2025-11-17 14:28:28 +01:00
Andras Bacsai 8f7ae2670c fix(versions): update coolify version to 4.0.0-beta.445 and nightly to 4.0.0-beta.446 2025-11-17 14:27:13 +01:00
Andras Bacsai 60ef63de54 fix: resolve duplicate migration timestamps and add idempotency guards
Two migrations had identical timestamps (2025_10_10_120000), causing non-deterministic execution order and "table already exists" errors during instance startup. Renamed webhook_notification_settings migration to 120002 and added Schema::hasTable() guards to both migrations for idempotency.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 14:26:42 +01:00
Andras Bacsai a9f42b9440 perf: optimize S3 restore flow with immediate cleanup and progress tracking
Optimizations:
- Add immediate cleanup of helper container and server temp files after copying to database
- Add pre-cleanup to handle interrupted restores
- Combine restore + cleanup commands to remove DB temp files immediately after restore
- Reduce temp file lifetime from minutes to seconds (70-80% reduction)
- Add progress tracking via MinIO client (shows by default)
- Update user message to mention progress visibility

Benefits:
- Temp files exist only as long as needed (not until end of process)
- Real-time S3 download progress shown in activity monitor
- Better disk space management through aggressive cleanup
- Improved error recovery with pre-cleanup

Compatibility:
- Works with all database types (PostgreSQL, MySQL, MariaDB, MongoDB)
- All existing tests passing
- Event-based cleanup acts as safety net for edge cases

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 14:23:50 +01:00
Andras Bacsai fbdd8e5f03 fix: improve robustness and security in database restore flows
- Add null checks for server instances in restore events to prevent errors
- Escape S3 credentials to prevent command injection vulnerabilities
- Fix file upload clearing custom location to prevent UI confusion
- Optimize isSafeTmpPath helper by avoiding redundant dirname calls
- Remove unnecessary --rm flag from long-running S3 restore container
- Prioritize uploaded files over custom location in import logic
- Add comprehensive unit tests for restore event null server handling

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 14:13:10 +01:00
Andras Bacsai 97550f4066 fix(deployment): eliminate duplicate error logging in deployment methods
Wraps rolling_update(), health_check(), stop_running_container(), and
start_by_compose_file() with try-catch to ensure comprehensive error logging
happens in one place. Removes duplicate logging from intermediate catch blocks
since the failed() method already provides full error details including stack trace
and chained exception information.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 10:52:09 +01:00
Andras Bacsai 94560ea6c7 feat: streamline S3 restore with single-step flow and improved UI consistency
Major architectural improvements:
- Merged download and restore into single atomic operation
- Eliminated separate S3DownloadFinished event (redundant)
- Files now transfer directly: S3 → helper container → server → database container
- Removed download progress tracking in favor of unified restore progress

UI/UX improvements:
- Unified restore method selection with visual cards
- Consistent "File Information" display between local and S3 restore
- Single slide-over for all restore operations (removed separate S3 download monitor)
- Better visual feedback with loading states

Security enhancements:
- Added isSafeTmpPath() helper for path traversal protection
- URL decode validation to catch encoded attacks
- Canonical path resolution to prevent symlink attacks
- Comprehensive path validation in all cleanup events

Cleanup improvements:
- S3RestoreJobFinished now handles all cleanup (helper container + all temp files)
- RestoreJobFinished uses new isSafeTmpPath() validation
- CoolifyTask dispatches cleanup events even on job failure
- All cleanup uses non-throwing commands (2>/dev/null || true)

Other improvements:
- S3 storage policy authorization on Show component
- Storage Form properly syncs is_usable state after test
- Removed debug code and improved error handling
- Better command organization and documentation

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 10:05:18 +01:00
Andras Bacsai 6593b2a553 feat(proxy): enhance Traefik version notifications to show patch and minor upgrades
- Store both patch update and newer minor version information simultaneously
- Display patch update availability alongside minor version upgrades in notifications
- Add newer_branch_target and newer_branch_latest fields to traefik_outdated_info
- Update all notification channels (Discord, Telegram, Slack, Pushover, Email, Webhook)
- Show minor version in format (e.g., v3.6) for upgrade targets instead of patch version
- Enhance UI callouts with clearer messaging about available upgrades
- Remove verbose logging in favor of cleaner code structure
- Handle edge case where SSH command returns empty response

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 09:59:17 +01:00
ShadowArcanist f5beb3a848 fix(service): plausible compose parsing error 2025-11-17 00:20:47 +05:30
ShadowArcanist 8a0749fddf Set network_mode to host for netbird client one click service 2025-11-16 10:33:10 +05:30
Robin 92286a85b8 Update templates/compose/palworld.yaml
remove unwanted character from compse file

Co-authored-by: ShadowArcanist <162910371+ShadowArcanist@users.noreply.github.com>
2025-11-15 21:55:50 +01:00
Robin266 c4dc8e1811 update palworld docker-compose 2025-11-15 19:34:18 +01:00
hugoduar 12bd26af82 Merge branch 'next' into hugoduar-bump-n8n-1.119.2 2025-11-15 02:30:35 -06:00
hugoduar b345fc4468 chore(n8n): upgrade n8n image version to 1.119.2 in compose templates 2025-11-15 02:19:22 -06:00
majcek210 9a5967b77d Rename tailscale.yaml > tailscale-client.yaml 2025-11-14 21:14:13 +01:00
majcek210 2237707263 Update templates/compose/tailscale.yaml
Co-authored-by: ShadowArcanist <162910371+ShadowArcanist@users.noreply.github.com>
2025-11-14 21:13:18 +01:00
majcek210 ce5f40afd8 Update templates/compose/tailscale.yaml
Co-authored-by: ShadowArcanist <162910371+ShadowArcanist@users.noreply.github.com>
2025-11-14 21:13:12 +01:00
majcek210 6e24ef247a Update templates/compose/tailscale.yaml
Co-authored-by: ShadowArcanist <162910371+ShadowArcanist@users.noreply.github.com>
2025-11-14 20:24:08 +01:00
majcek210 28b44bad8e Update templates/compose/tailscale.yaml
Co-authored-by: ShadowArcanist <162910371+ShadowArcanist@users.noreply.github.com>
2025-11-14 20:24:01 +01:00
majcek210 d9eb0ab00b Update templates/compose/tailscale.yaml
Co-authored-by: ShadowArcanist <162910371+ShadowArcanist@users.noreply.github.com>
2025-11-14 20:23:51 +01:00
majcek210 ba6d540653 Update templates/compose/tailscale.yaml
Co-authored-by: ShadowArcanist <162910371+ShadowArcanist@users.noreply.github.com>
2025-11-14 20:23:45 +01:00
majcek210 84800ba7f2 Update templates/compose/tailscale.yaml
Co-authored-by: ShadowArcanist <162910371+ShadowArcanist@users.noreply.github.com>
2025-11-14 20:23:26 +01:00
majcek210 4d77d06ac0 Update templates/compose/tailscale.yaml
Co-authored-by: ShadowArcanist <162910371+ShadowArcanist@users.noreply.github.com>
2025-11-14 20:23:20 +01:00
majcek210 8b916ca228 Update templates/compose/tailscale.yaml
Co-authored-by: ShadowArcanist <162910371+ShadowArcanist@users.noreply.github.com>
2025-11-14 20:23:12 +01:00
ShadowArcanist 0bfee3ad33 fix(service): Ghost using invalid base url 2025-11-14 23:33:47 +05:30
Julien Nahum adc82dc7a9 feat(opnform): add SERVICE_URL_NGINX environment variable to nginx service 2025-11-14 14:47:24 +00:00
Julien Nahum 0cb7881f37 Merge branch 'next' into add-opnform-template 2025-11-14 11:26:21 +00:00
Julien Nahum 1126385c1b fix(opnform): update APP_URL environment variable and remove unused nginx environment variable 2025-11-14 11:24:39 +00:00
Andras Bacsai cc6a538fca refactor(proxy): implement parallel processing for Traefik version checks
Addresses critical performance issues identified in code review by refactoring the monolithic CheckTraefikVersionJob into a distributed architecture with parallel processing.

Changes:
- Split version checking into CheckTraefikVersionForServerJob for parallel execution
- Extract notification logic into NotifyOutdatedTraefikServersJob
- Dispatch individual server checks concurrently to handle thousands of servers
- Add comprehensive unit tests for the new job architecture
- Update feature tests to cover the refactored workflow

Performance improvements:
- Sequential SSH calls replaced with parallel queue jobs
- Scales efficiently for large installations with thousands of servers
- Reduces job execution time from hours to minutes

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 11:42:58 +01:00
Andras Bacsai 262a960df1 fix: remove PullHelperImageJob mass scheduling (#7229) 2025-11-14 11:37:11 +01:00
Andras Bacsai 7a16938f0c fix(proxy): prevent "container name already in use" error during proxy restart
Add wait loops to ensure containers are fully removed before restarting.
This fixes race conditions where docker compose would fail because an
existing container was still being cleaned up.

Changes:
- StartProxy: Add explicit stop, wait loop before docker compose up
- StopProxy: Add wait loop after container removal
- Both actions now poll up to 10 seconds for complete removal
- Add error suppression to handle non-existent containers gracefully

Tests:
- Add StartProxyTest.php with 3 tests for cleanup logic
- Add StopProxyTest.php with 4 tests for stop behavior

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 11:35:22 +01:00
Andras Bacsai 11a7f4c8a7 fix(performance): eliminate N+1 query in CheckTraefikVersionJob
This commit fixes a critical N+1 query issue in CheckTraefikVersionJob
that was loading ALL proxy servers into memory then filtering in PHP,
causing potential OOM errors with thousands of servers.

Changes:
- Added scopeWhereProxyType() query scope to Server model for
  database-level filtering using JSON column arrow notation
- Updated CheckTraefikVersionJob to use new scope instead of
  collection filter, moving proxy type filtering into the SQL query
- Added comprehensive unit tests for the new query scope

Performance impact:
- Before: SELECT * FROM servers WHERE proxy IS NOT NULL (all servers)
- After: SELECT * FROM servers WHERE proxy->>'type' = 'TRAEFIK' (filtered)
- Eliminates memory overhead of loading non-Traefik servers
- Critical for cloud instances with thousands of connected servers

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 11:35:22 +01:00