Commit graph

445 commits

Author SHA1 Message Date
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
033433f553 fix(ServiceParser): prioritize manually migrated services over image detection for database identification 2025-11-11 23:24:53 +01:00
Andras Bacsai
f315e4bd9c feat: add dev_helper_version to instance settings and update related functionality 2025-11-03 08:38:43 +01:00
Andras Bacsai
53cd2a6e86 refactor: harden and deduplicate validateShellSafePath
Changes:
- Added tab character ("\t") to dangerous characters list as token separator
- Removed redundant regex-based preg_match block (lines 147-152)
- Characters $(, ${, and backticks were already covered in $dangerousChars array
- Simplified function to rely solely on $dangerousChars loop

Security improvement:
- Tab characters can act as token separators in shell contexts
- Now explicitly blocked with descriptive error message

Tests:
- Added test for tab character blocking
- All 78 security tests pass (213 assertions)
- No regression in existing functionality

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-16 09:51:37 +02:00
Andras Bacsai
cb1f571eb4 fix: prevent command injection in Docker Compose parsing - add pre-save validation
This commit addresses a critical security issue where malicious Docker Compose
data was being saved to the database before validation occurred.

Problem:
- Service models were saved to database first
- Validation ran afterwards during parse()
- Malicious data persisted even when validation failed
- User saw error but damage was already done

Solution:
1. Created validateDockerComposeForInjection() to validate YAML before save
2. Added pre-save validation to all Service creation/update points:
   - Livewire: DockerCompose.php, StackForm.php
   - API: ServicesController.php (create, update, one-click)
3. Validates service names and volume paths (string + array formats)
4. Blocks shell metacharacters: backticks, $(), |, ;, &, >, <, newlines

Security fixes:
- Volume source paths (string format) - validated before save
- Volume source paths (array format) - validated before save
- Service names - validated before save
- Environment variable patterns - safe ${VAR} allowed, ${VAR:-$(cmd)} blocked

Testing:
- 60 security tests pass (176 assertions)
- PreSaveValidationTest.php: 15 tests for pre-save validation
- ValidateShellSafePathTest.php: 15 tests for core validation
- VolumeSecurityTest.php: 15 tests for volume parsing
- ServiceNameSecurityTest.php: 15 tests for service names

Related commits:
- Previous: Added validation during parse() phase
- This commit: Moves validation before database save

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-16 09:51:37 +02:00
Andras Bacsai
70f152f0ba Changes auto-committed by Conductor 2025-10-16 08:51:15 +02:00
Andras Bacsai
ce12c94709 fix: prevent duplicate services on image change and enable real-time UI refresh
This commit addresses two critical issues with Docker Compose service management:

## Issue 1: Duplicate Services Created on Image Change
When changing the image in a docker-compose file, the parser was creating new
ServiceApplication/ServiceDatabase records instead of updating existing ones.

**Root Cause**: The parsers used `firstOrCreate()` with `['name', 'image', 'service_id']`,
meaning any image change would create a new record.

**Fix**: Remove `image` from `firstOrCreate()` queries and update it separately after
finding or creating the service record.

**Changes**:
- `bootstrap/helpers/parsers.php` (serviceParser v3): Fixed in presave loop (lines 1188-1203)
  and main parsing loop (lines 1519-1539)
- `bootstrap/helpers/shared.php` (parseDockerComposeFile v2): Fixed null check logic
  (lines 1308-1348)

## Issue 2: UI Not Refreshing After Changes
When compose file or domain was modified, the Configuration component wasn't receiving
events to refresh its data, requiring manual page refresh to see updates.

**Root Cause**: The Configuration component wasn't listening for refresh events dispatched
by child components (StackForm, EditDomain).

**Fix**: Add event listeners and dispatchers to enable real-time UI updates.

**Changes**:
- `app/Livewire/Project/Service/Configuration.php`: Added listeners for `refreshServices`
  and `refresh` events (lines 36-37)
- `app/Livewire/Project/Service/EditDomain.php`: Added `refreshServices` dispatch (line 76)
- Note: `app/Livewire/Project/Service/StackForm.php` already had the dispatch

## Tests Added
- `tests/Unit/ServiceParserImageUpdateTest.php`: 4 tests verifying no duplicates created
- `tests/Unit/ServiceConfigurationRefreshTest.php`: 4 tests verifying event dispatching

All 8 new tests pass, and all existing unit tests continue to pass.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 10:12:36 +02:00
Andras Bacsai
bb0cdefa35
Merge branch 'next' into feat/improve-network-mode-check 2025-09-22 12:31:36 +02:00
Andras Bacsai
77c7da39e2 feat(deployment): enhance deployment status reporting with detailed information on active deployments and team members 2025-09-15 14:10:20 +02:00
Andras Bacsai
5b3b4bbc43 refactor(environment): remove 'is_build_time' attribute from environment variable handling across the application to simplify configuration 2025-09-11 16:51:56 +02:00
Andras Bacsai
501e6a2650 refactor(environment): standardize service name formatting by replacing '-' and '.' with '_' in environment variable keys 2025-09-11 13:59:02 +02:00
Andras Bacsai
5e0b86f322
Merge pull request #6170 from mindedtech/Add-SERVICE_NAME-variable-for-docker-compose-services
Add SERVICE_NAME variable for docker compose services
2025-09-11 13:06:10 +02:00
Andras Bacsai
a7671ed379 refactor(dns-validation): rename DNS validation functions for consistency and clarity, and remove unused code 2025-09-09 09:00:35 +02:00
Arnaud B
e23ab1e621
feat(deployment): add SERVICE_NAME variables for service discovery
This change introduces automatically generated `SERVICE_NAME_<SERVICE>`
environment variables for each service within a Docker Compose deployment.
This allows services to reliably reference each other by name, which is particularly
useful in pull request environments where container names are dynamically suffixed.

- The application parser now generates and injects these `SERVICE_NAME` variables
   into the environment of all services in the compose file.
- `ApplicationDeploymentJob` is updated to correctly handle and filter these
  new variables during deployment.
- UI components and the `EnvironmentVariableProtection` trait have been updated
to make these generated variables read-only, preventing accidental modification.

This commit introduces two new helper functions to standardize resource naming
for pull request deployments:

-  `addPreviewDeploymentSuffix()`: Generates a consistent suffix format (-pr-{id})
   for resource names in preview deployments
-  `generateDockerComposeServiceName()`: Creates SERVICE_NAME environment variables
   for Docker Compose services
2025-09-08 15:22:44 +02:00
Andras Bacsai
852b2688d9 refactor(error-handling): remove ray debugging statements from CheckUpdates and shared helper functions to clean up error reporting 2025-09-08 14:03:27 +02:00
Andras Bacsai
75b61a6b00 feat(domains): add force_domain_override option and enhance domain conflict detection responses 2025-08-28 11:21:30 +02:00
Andras Bacsai
e0aa28ba31 refactor(domains): rename check_domain_usage to checkDomainUsage and update references across the application 2025-08-28 10:00:19 +02:00
Andras Bacsai
21fc1ba254 fix(docker): update parser version in FQDN generation for service-specific URLs 2025-08-27 17:02:38 +02:00
Andras Bacsai
74ebaef17b feat(api): enhance IP access control in middleware and settings; support CIDR notation and special case for 0.0.0.0 to allow all IPs 2025-08-26 10:27:38 +02:00
Andras Bacsai
1675c85d4d refactor(shared helpers): remove unused parseServiceVolumes function to clean up codebase 2025-08-17 18:09:59 +02:00
Andras Bacsai
9b98891269
Merge branch 'next' into fix-volume-variable-with-default 2025-08-17 18:03:38 +02:00
Andras Bacsai
42bdc2a5fd refactor(docker compose): remove deprecated newParser function and associated test file to streamline codebase 2025-08-17 18:03:00 +02:00
Andras Bacsai
39f25573bf refactor(templates): update service template file handling to use dynamic file name from constants 2025-08-12 10:06:19 +02:00
Andras Bacsai
e8892b3d29 feat(core): finally fqdn is fqdn and url is url. haha 2025-08-12 10:06:19 +02:00
Andras Bacsai
a0bc4dac55 fix(application): streamline environment variable updates for Docker Compose services and enhance FQDN generation logic 2025-08-12 10:06:19 +02:00
Trung-DV
4f77bd4347 Fix volume target, use the last part
Signed-off-by: Trung-DV <TrungDV.PMB@gmail.com>
2025-08-06 10:21:54 +07:00
jvdboog
7a110880c1 feat: Improve detection of special network modes 2025-07-20 22:15:42 +02:00
Andras Bacsai
9651e3a7ec revert(parser): enhance FQDN generation logic for services and applications 2025-07-18 23:10:08 +02:00
Andras Bacsai
9ed77e5eef fix(services): update environment variable naming convention to use underscores instead of dashes for SERVICE_FQDN and SERVICE_URL 2025-07-18 20:48:56 +02:00
Andras Bacsai
94f9c54256 fix(deployment): refactor domain parsing and environment variable generation using Spatie URL library 2025-07-08 10:42:34 +02:00
Andras Bacsai
95da765a9e fix(deployment): improve docker-compose domain handling and environment variable generation 2025-07-07 16:07:08 +02:00
Andras Bacsai
085529dc63 fix(deployment): enhance COOLIFY_URL and COOLIFY_FQDN variable generation for better compatibility 2025-07-07 12:55:35 +02:00
Andras Bacsai
6a90bdf9fa fix(env): Generate literal env variables better 2025-07-07 12:30:44 +02:00
Andras Bacsai
f732220b8f refactor(shared): improve error handling in getTopLevelNetworks function to return network name on invalid docker-compose.yml 2025-07-07 10:20:54 +02:00
Andras Bacsai
2f68f965a7 refactor(shared): enhance FQDN generation logic for services in newParser function 2025-07-03 21:29:57 +02:00
Andras Bacsai
485e45bbb8 fix(shared): refactor gzip handling for Pocketbase in newParser function for improved clarity 2025-06-26 21:59:53 +02:00
Andras Bacsai
34135f2b4a fix(parser): enable gzip compression conditionally for Pocketbase images and streamline service creation logic 2025-06-25 13:12:11 +02:00
Andras Bacsai
e42c5baedd fix(parser): improve FQDN generation and update environment variable handling 2025-06-24 13:28:52 +02:00
Andras Bacsai
842f22340e refactor(database-detection): enhance isDatabaseImage function to utilize service configuration for improved detection accuracy 2025-06-04 11:44:37 +02:00
Andras Bacsai
2361c34a53 refactor(error-handling): replace generic Exception with RuntimeException for improved error specificity 2025-05-29 10:49:55 +02:00
Andras Bacsai
2189c44ba5 fix(shared): remove unused relation from queryDatabaseByUuidWithinTeam function 2025-05-20 15:08:20 +02:00
Andras Bacsai
24b7b53973 Revert "fix(dev): mount points?!"
This reverts commit 365bf3cbf0.
2025-05-05 08:55:44 +02:00
Andras Bacsai
365bf3cbf0 fix(dev): mount points?! 2025-05-03 09:59:42 +02:00
Andras Bacsai
d8c3418e72 feat(Service): Add functionality to convert between applications and databases in docker-compose based applications
fix(ui): Fix service layout refresh on compose change
2025-04-29 14:27:17 +02:00
Andras Bacsai
02b6aaaaf0 refactor(shared): remove unused ray debugging statement from newParser function 2025-04-21 09:58:56 +02:00
Andras Bacsai
618e546966 feat(core): Enable magic env variables for compose based applications 2025-04-16 15:26:40 +02:00
Andras Bacsai
3894023a2e fix(parser): transform associative array labels into key=value format for better compatibility 2025-04-15 18:41:21 +02:00
elmariss
11c1babc85 fix check if image changed 2025-04-10 01:06:01 +02:00
Andras Bacsai
b366b45914
Merge branch 'next' into fix_service_app_log_drain 2025-03-31 17:45:06 +02:00
Andras Bacsai
fcfd00eebe feat(application): add SPA configuration and update Nginx generation logic 2025-03-31 15:10:50 +02:00