Commit graph

12779 commits

Author SHA1 Message Date
Andras Bacsai
cdfc991e2b
Merge pull request #6735 from Blaumaus/swetrix-analytics-service
feat(service): add Swetrix template
2025-10-13 13:01:45 +02:00
Andras Bacsai
f8f4c046a7
Merge pull request #6753 from seefs001/next
feat(template): NewAPI template
2025-10-13 12:53:24 +02:00
Andras Bacsai
42e39081f8
Merge pull request #6778 from mario-neuhold/patch-1
feat (template): use new homarr image
2025-10-13 12:52:58 +02:00
Andras Bacsai
6098a58c9f
Merge pull request #6793 from YaRissi/service/gotify
feat(template): Adding Gotify service
2025-10-13 12:52:05 +02:00
Andras Bacsai
3e5fb4ae63
Merge pull request #6806 from ShadowArcanist/patch-3
chore(service): Added healthcheck to moodle
2025-10-13 12:50:48 +02:00
Andras Bacsai
a1916c965a
Merge pull request #6831 from ShadowArcanist/patch-4
fix(service): added missing resend env for documenso
2025-10-13 12:50:19 +02:00
Andras Bacsai
bb9ddd089a
Merge pull request #6859 from coollabsio/andrasbacsai/fix-livewire-field-reset
refactor: migrate database components from legacy model binding to explicit properties
2025-10-13 10:51:04 +02:00
Andras Bacsai
df77a99fa3
Merge branch 'next' into andrasbacsai/fix-livewire-field-reset 2025-10-13 10:50:56 +02:00
Andras Bacsai
174c212617
Merge pull request #6860 from coollabsio/fix-api-env-vars-fields
fix: allow all environment variable fields in API endpoints
2025-10-13 10:45:35 +02:00
Andras Bacsai
78031b991a fix: allow all environment variable fields in API endpoints
Fixes #6847

The API endpoints for environment variables were rejecting valid fields
like is_buildtime, is_runtime, is_multiline, and is_shown_once with
422 errors, even though the code was using these fields internally.

Changes:
- Added missing fields to $allowedFields in create_env()
- Added missing fields to $allowedFields in update_env_by_uuid()
- Updated allowed fields in create_bulk_envs()
- Added validation rules for is_runtime and is_buildtime

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 10:44:06 +02:00
Andras Bacsai
400746f72a
Merge pull request #6852 from YaRissi/fix/openapi
fix(openapi): missing 422 error code in openapi spec
2025-10-13 10:42:14 +02:00
Andras Bacsai
6879ba87df
Merge branch 'next' into fix/openapi 2025-10-13 10:42:05 +02:00
Andras Bacsai
acc5dbe105
Merge branch 'next' into andrasbacsai/fix-livewire-field-reset 2025-10-13 10:38:02 +02:00
Andras Bacsai
3dfef0b53a
Merge pull request #6858 from coollabsio/andrasbacsai/fix-db-port-mapping-conflict
fix: prevent container name conflict when updating database port mappings
2025-10-13 10:36:15 +02:00
Andras Bacsai
8d280b4aac fix: prevent container name conflict when updating database port mappings
When port mappings are changed in the UI and the database is restarted,
the system now gracefully stops and removes the existing container before
recreating it with the new configuration.

This prevents the "container name already in use" error that occurred when
Docker Compose tried to create a container with the same name but different
port configuration.

Changes:
- Add graceful container stop (10s timeout) before docker compose up
- Remove old container to avoid name conflicts
- Use --timeout flag (modern Docker CLI) instead of deprecated --time
- Apply fix to all database types: MariaDB, MySQL, PostgreSQL, MongoDB,
  Redis, KeyDB, Dragonfly, and ClickHouse
- Update StopDatabase.php for consistency

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 10:01:54 +02:00
Andras Bacsai
a15ab54495 refactor: migrate database components from legacy model binding to explicit properties
- Remove global 'refresh' event listeners from all database General components
- Migrate Redis, MySQL, MariaDB, MongoDB, PostgreSQL, and KeyDB components to use explicit public properties instead of wire:model="database.field"
- Implement syncData() method in each component for manual data synchronization between properties and Eloquent models
- Update all validation rules, messages, and attributes to reference new property names
- Update Blade views to bind inputs to explicit properties (e.g., id="name" instead of id="database.name")
- Prepare codebase for disabling Livewire's legacy_model_binding configuration option

This refactoring resolves form field reset issues caused by global refresh events
and follows Livewire 3 best practices for component property management.
2025-10-13 10:01:17 +02:00
Andras Bacsai
ecdeed7787
Merge pull request #6855 from coollabsio/andrasbacsai/onboarding-redesign
feat(onboarding): redesign user onboarding flow with modern UI/UX
2025-10-12 18:56:55 +02:00
Andras Bacsai
de24489aa7 fix(onboarding): auto-select first SSH key for better UX
- Auto-select first SSH key when available instead of requiring explicit selection
- Remove disabled placeholder option from dropdown
- Prevents confusing error when user clicks "Use Selected Key" without changing dropdown
- Improves onboarding flow by having a sensible default selection

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 18:54:12 +02:00
Andras Bacsai
04625591ea feat(onboarding): add Hetzner integration and fix navigation issues
- Add Hetzner Cloud server creation option to onboarding flow
- Change grid from 2 to 3 columns to accommodate all server options
- Mark both Hetzner and Remote Server as "Recommended"
- Fix Hetzner card height to match other cards
- Remove "select existing server" phase - onboarding always creates new servers
- Fix project loading on page refresh in Project Setup phase
- Fix browser back button navigation - remove aggressive restartBoarding() call
- Fix SSH key dropdown to not auto-select first key - require explicit selection
- Make checkpoint titles more prominent across all phases

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 18:52:45 +02:00
Andras Bacsai
1902ef886d
Merge branch 'next' into andrasbacsai/onboarding-redesign 2025-10-12 18:02:37 +02:00
Andras Bacsai
7a008c859a feat(onboarding): redesign user onboarding flow with modern UI/UX
- Add centered, card-based layout with clean design
- Implement 3-step progress indicator component
- Add proper dark/light mode support following Coolify design system
- Implement Livewire URL state persistence for browser navigation
- Separate private key textareas for "Generate" vs "Add your own" modes
- Consistent checkpoint styling across all onboarding phases
- Enhanced typography with prominent titles (semibold, white in dark mode)
- Fixed state restoration on page refresh and browser back/forward navigation

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 17:59:37 +02:00
Andras Bacsai
b7af8cea5a
Merge pull request #6854 from coollabsio/andrasbacsai/terminal-datalist-dropdown
feat: replace terminal dropdown with searchable datalist component
2025-10-12 15:15:49 +02:00
Andras Bacsai
6297ac6c88 feat: replace terminal dropdown with searchable datalist component
Enhanced the terminal server/container selection with a new searchable datalist component:

**Terminal View Changes:**
- Replaced `x-forms.select` with `x-forms.datalist` for server/container selection
- Added search functionality for filtering servers and containers
- Fixed form validation by adding hidden input for proper HTML5 validation
- Prevented error messages when clearing selection (sets to 'default')

**Datalist Component (Single Selection):**
- Implemented Alpine.js-powered dropdown with search functionality
- Added visual dropdown arrow that rotates when opened
- Proper entangle binding for wire:model support
- Keyboard support (Escape to close)
- Click outside to close behavior
- Disabled options filtering (skips disabled options)
- Consistent styling with input/textarea components

**Styling Improvements:**
- Explicit background colors: `bg-white` (light) and `dark:bg-coolgray-100` (dark)
- Proper ring border: `ring-1 ring-inset ring-neutral-200 dark:ring-coolgray-300`
- Focus states: `focus-within:ring-2 focus-within:ring-coollabs dark:focus-within:ring-warning`
- Text colors: `text-black dark:text-white`
- Added custom scrollbar styling for dropdown lists
- Wire:dirty state support for visual feedback
- Proper padding and spacing (`py-1.5`, `px-1`, `px-2`)

**Multiple Selection Mode:**
- Also updated for consistent styling and scrollbar support
- Added proper background colors and focus states

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 14:57:45 +02:00
elmariss
737ec521b6 fix: missing 422 error code in openapi spec 2025-10-12 14:20:45 +02:00
Andras Bacsai
635af44539
Merge pull request #6837 from coollabsio/andrasbacsai/custom-webhooks
feat: add custom webhook notification support
2025-10-12 10:57:47 +02:00
Blue Mouse
ccdbf95a16 Bump version to v4.0.5 2025-10-11 21:48:53 +01:00
Andras Bacsai
95fe04c484
Merge pull request #6817 from coollabsio/hetzner-do
Hetzner integration
2025-10-11 19:23:19 +02:00
Andras Bacsai
052ef19a2d
Merge pull request #6849 from coollabsio/add-new-sponsors
Update sponsors list in README
2025-10-11 19:21:07 +02:00
Andras Bacsai
6e08af6016 Update sponsors list in README
Add new sponsors:
- 23M - High-availability hosting solutions
- Brand.dev - API for product personalization
- ByteBase - Database CI/CD and Security
- Formbricks - Open source feedback platform
- Mobb - AI-generated code security
- Ramnode - High Performance Cloud VPS Hosting

Remove inactive sponsors (commented out in website):
- Cloudify.ro
- GlueOps
- MassiveGrid
- QuantCDN
- Trieve
- WZ-IT

Reorganize sponsors in alphabetical order for easier maintenance.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 19:17:09 +02:00
Andras Bacsai
fc9f59b767
Merge pull request #6843 from coollabsio/andrasbacsai/hetzner-cloud-init
feat: add cloud-init script support for Hetzner server creation + CI workflow fix
2025-10-11 19:10:17 +02:00
Andras Bacsai
821aa6a531 dev container name 2025-10-11 18:57:58 +02:00
Andras Bacsai
a7b9e78215 refactor: reduce cloud-init label width for better layout
Reduce label width from w-64 to w-32 to prevent layout issues
when the clear button is added next to the dropdown.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 18:55:43 +02:00
Andras Bacsai
7ad7247284 feat: add clear button for cloud-init script dropdown
Add a 'Clear' button next to the cloud-init script dropdown that:
- Resets the dropdown to default (placeholder option)
- Clears the cloud-init script textarea
- Clears the script name input
- Unchecks the 'save script' checkbox

Improves UX by allowing users to quickly reset cloud-init fields
without manually clearing each field.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 18:51:29 +02:00
Andras Bacsai
9c21304ddb docs: clarify cloud-init script compatibility
Add note that cloud-init scripts currently work only with Hetzner
integration to set user expectations.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 14:06:16 +02:00
Andras Bacsai
d93a13eeee feat: add YAML validation for cloud-init scripts
Add ValidCloudInitYaml validation rule to ensure cloud-init scripts
are properly formatted before saving. The validator supports:
- Cloud-config YAML (with or without #cloud-config header)
- Bash scripts (starting with #!)
- Empty/null values (optional field)

Uses Symfony YAML parser to validate YAML syntax and provides
detailed error messages when validation fails.

Added comprehensive unit tests covering:
- Valid cloud-config with/without header
- Valid bash scripts
- Invalid YAML syntax detection
- Complex multi-section cloud-config

Applied validation to:
- ByHetzner component (server creation)
- CloudInitScriptForm component (script management)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 13:56:55 +02:00
Andras Bacsai
4b34a7d8b2
Merge pull request #6841 from coollabsio/fix-activity-log-index-transaction
fix(migration): disable transaction for concurrent index creation
2025-10-11 13:51:22 +02:00
Andras Bacsai
88bbf14b92
Merge pull request #6846 from coollabsio/andrasbacsai/backup-log-lazy-init
refactor(backup): make backup_log_uuid initialization lazy
2025-10-11 13:49:27 +02:00
Andras Bacsai
a3cecff97b refactor: remove debug sleep from global search modal
Remove debug sleep(4) statement from openSearchModal method.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 13:49:19 +02:00
Andras Bacsai
a17b105a92 fix: hide 'No results found' message while data is loading
Prevent showing 'No results found' when user types during initial
data loading phase. The message now only appears after data has
fully loaded and the search still returns no results.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 13:48:12 +02:00
Andras Bacsai
ff889e658d refactor: improve cloud-init script management UI and cache control
- Add manual cache clearing command (search:clear) for testing
- Integrate cloud-init scripts into global search navigation
- Improve form UX by preventing field reset during edit operations

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 13:47:26 +02:00
Andras Bacsai
2ce3052378 fix: allow typing in global search while data loads
Remove disabled attribute from search input and defer search execution
until data is loaded. Users can now start typing immediately when
opening global search (Cmd+K), improving perceived responsiveness.

Search results are only computed once isLoadingInitialData is false.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 13:43:14 +02:00
Andras Bacsai
f50201152f refactor(backup): make backup_log_uuid initialization lazy
Changed backup_log_uuid property to nullable and removed eager initialization in constructor. This allows the ID to be generated when actually needed rather than upfront.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 13:42:50 +02:00
Andras Bacsai
64c4ce210e feat: add artisan command to clear global search cache
Add a new artisan command for manually clearing the global search cache
during development and testing. This is useful when testing new navigation
entries or updates to searchable resources without waiting for the 5-minute
cache TTL.

Command: php artisan search:clear

Usage options:
- search:clear              - Clear cache for current user's team
- search:clear --team=1     - Clear cache for specific team ID
- search:clear --all        - Clear cache for all teams

This helps developers test global search changes immediately, especially
when adding new navigation routes like cloud-init scripts.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 13:36:14 +02:00
Andras Bacsai
ff69bf17cd feat: add cloud-init scripts to global search
Add cloud-init scripts to the global search navigation routes, making
them discoverable via the quick search (Cmd+K / Ctrl+K).

Changes:
- Added dedicated "Cloud-Init Scripts" navigation entry
- Searchable via: cloud-init, scripts, cloud init, cloudinit,
  initialization, startup, server setup
- Updated Security entry to include cloud-init in search terms
- Links to /security/cloud-init-scripts route

Users can now quickly navigate to cloud-init script management by
typing "cloud-init" or related terms in global search.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 13:33:55 +02:00
Andras Bacsai
6c5adce633 fix: improve cloud-init scripts UI styling and behavior
Fix multiple UI/UX issues with cloud-init scripts management:

1. Fix card styling - Remove purple box background, use simple border
   - Changed from .box class to inline flex/border styling
   - Matches cloud provider tokens styling pattern

2. Remove script preview section
   - Preview was taking too much space and looked cluttered
   - Users can edit to see full script content

3. Make edit modal full width
   - Added fullWidth attribute to x-modal-input component
   - Provides better editing experience for long scripts

4. Fix fields clearing after update
   - Fields were being reset even in edit mode
   - Now only reset fields when creating new script
   - Edit mode preserves values after save

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 13:30:44 +02:00
Andras Bacsai
5463f4d496 feat: add cloud-init scripts management UI in Security section
Add comprehensive cloud-init script management interface in the Security
section, allowing users to create, edit, delete, and reuse cloud-init
scripts across their team.

New Components:
- CloudInitScripts: Main listing page with grid view of scripts
- CloudInitScriptForm: Modal form for create/edit operations

Features:
- Create new cloud-init scripts with name and content
- Edit existing scripts
- Delete scripts with confirmation (requires typing script name)
- View script preview (first 200 characters)
- Scripts are encrypted in database
- Full authorization using CloudInitScriptPolicy
- Real-time updates via Livewire events

UI Location:
- Added to Security section nav: /security/cloud-init-scripts
- Positioned between Cloud Tokens and API Tokens
- Follows existing security UI patterns

Files Created:
- app/Livewire/Security/CloudInitScripts.php
- app/Livewire/Security/CloudInitScriptForm.php
- resources/views/livewire/security/cloud-init-scripts.blade.php
- resources/views/livewire/security/cloud-init-script-form.blade.php

Files Modified:
- routes/web.php - Added route
- resources/views/components/security/navbar.blade.php - Added nav link

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 12:42:09 +02:00
Andras Bacsai
b31b080799 fix: reset cloud-init fields when closing server creation modal
Add cloud-init script fields to the resetSelection() method that's
called when the modal is closed. This ensures a clean slate when
reopening the "Connect a Hetzner Server" view.

Fields reset:
- cloud_init_script
- save_cloud_init_script
- cloud_init_script_name
- selected_cloud_init_script_id

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 12:37:12 +02:00
Andras Bacsai
ad7479b167 fix: set cloud-init script dropdown to empty by default
Remove 'selected' and 'disabled' attributes from the placeholder option
to ensure the dropdown shows "Load saved script..." by default instead
of appearing to select the first script.

When selected_cloud_init_script_id is null, the empty option will be
shown. The updatedSelectedCloudInitScriptId() method already handles
empty string values correctly by checking if ($value).

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 11:25:42 +02:00
Andras Bacsai
e055c3b101 debug: add ray logging for Hetzner createServer API request/response
Add detailed ray logging to track exactly what is being sent to Hetzner's
API and what response is received. This will help debug cloud-init script
integration and verify that user_data is properly included in the request.

Logs include:
- Request endpoint and full params object
- Complete API response

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 11:17:44 +02:00
Andras Bacsai
6c0840d4e0 refactor: improve cloud-init script UX and remove description field
Changes:
1. Remove description field from cloud-init scripts
   - Updated migration to remove description column
   - Updated model to remove description from fillable array

2. Redesign script name input layout
   - Move script name input next to checkbox (always visible)
   - Remove conditional rendering - input always shown
   - Use placeholder instead of label for cleaner look

3. Fix dropdown type error
   - Replace wire:change event with wire:model.live
   - Use updatedSelectedCloudInitScriptId() lifecycle hook
   - Add "disabled" attribute to placeholder option
   - Properly handle empty string vs null in type casting

4. Improve validation
   - Require both script content AND name for saving
   - Remove description validation rule
   - Add selected_cloud_init_script_id validation

5. Auto-populate name when loading saved script
   - When user selects saved script, auto-fill the name field

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 11:16:28 +02:00