Commit graph

15458 commits

Author SHA1 Message Date
Andras Bacsai
ac6f05c003 chore: remove conductor.json configuration file 2026-05-07 12:25:17 +02:00
Andras Bacsai
635b9732b6 chore: remove DESIGN.md design specification file 2026-05-07 12:22:59 +02:00
Andras Bacsai
84b0f9ba7a
feat(ui): add collapsible sidebar with tooltip and team menu (#9945) 2026-05-06 15:31:12 +02:00
Andras Bacsai
b623c9e5be fix(ui): move top padding to collapsed/expanded states in navbar
Padding `lg:pt-6` moved from static class to expanded-state Alpine binding,
and `lg:pt-8` added for collapsed state, so top spacing responds correctly
to sidebar collapse toggle.
2026-05-06 15:01:12 +02:00
Andras Bacsai
02dd8093a3 feat(ui): add collapsible sidebar with tooltip and team menu
Sidebar collapses to icon-only mode on lg breakpoint. State persists
in localStorage. Collapsed state shows logo icon, team initial button
with flyout menu, and hover tooltips for nav items.
2026-05-06 14:56:13 +02:00
Andras Bacsai
be6604913b
fix(scheduled-task): guard against undefined relationships in server() method (#9922) 2026-05-06 14:32:36 +02:00
Andras Bacsai
29d41ba041 Merge remote-tracking branch 'origin/next' into 9916-investigate-undefined-relationship 2026-05-06 14:32:16 +02:00
Andras Bacsai
7e5e046563
feat(mcp): add instance-level MCP server toggle via API and UI (#9862) 2026-05-05 22:09:17 +02:00
Andras Bacsai
45f65481e6 fix(mcp): change enable/disable endpoints from GET to POST and fix service/app listing
- `/mcp/enable` and `/mcp/disable` now use POST (state-mutating ops)
- `ListServices` queries DB directly instead of loading all projects into memory
- `ListApplications` validates tag arg rejects empty string (not just falsy)
2026-05-05 22:07:58 +02:00
Andras Bacsai
d5e34c2249 Merge remote-tracking branch 'origin/next' into mcp-server-instance-toggle 2026-05-05 22:04:13 +02:00
Andras Bacsai
14359490f0 Merge remote-tracking branch 'origin/next' into 9916-investigate-undefined-relationship 2026-05-05 21:59:25 +02:00
Andras Bacsai
2cbb449a06 docs(sponsors): add Capture.page as big sponsor 2026-05-05 21:04:25 +02:00
Andras Bacsai
d1a416f256 docs(sponsors): add LumaDock as big sponsor 2026-05-05 20:52:17 +02:00
Andras Bacsai
e89820b465 refactor(deployment): move copyLogs to client-side and hide refund when ineligible
Move copyLogs from PHP Livewire method to Alpine.js to avoid
unnecessary server round-trips. Extract collectVisibleLogs()
helper shared by both copy and download actions.

Hide refund section entirely when not eligible instead of
rendering a permanently disabled button.
2026-05-05 15:30:32 +02:00
Andras Bacsai
1849b5903e refactor(scheduled-task): simplify server() with nullsafe operators and add return type
Replace nested null checks with nullsafe operator chains, add ?Server
return type, drop unreachable database branch, and cover all paths with
feature tests.
2026-05-04 12:26:15 +02:00
Andras Bacsai
8e22ce4ba7 fix(vite): restrict CORS to known origins instead of wildcard
Add explicit CORS allowlist covering localhost variants, APP_URL env
var, and the configured vite host/port pair. Replaces implicit open
CORS with regex-based origin matching.
2026-04-30 18:23:07 +02:00
peaklabs-dev
1f1fe1f184
fix(dev): disable IP seeding in dev as it does not work 2026-04-30 17:37:46 +02:00
Andras Bacsai
a51f114a70 fix(standalone-docker): include keydb, dragonfly, clickhouse in databases()
Add missing DB types to StandaloneDocker::databases() concat chain and
cover all 8 standalone database types with feature tests.
2026-04-30 15:01:48 +02:00
Andras Bacsai
79174b749d refactor(helpers): extract STANDALONE_DATABASE_MODELS registry, add tests
Replace 8× repeated per-type if-blocks in `queryDatabaseByUuidWithinTeam`
and `queryResourcesByUuid` with a single loop over the new
`STANDALONE_DATABASE_MODELS` constant.

Add unit tests to guard the registry against drift (keys mirror
`DATABASE_TYPES`, every entry is a valid Eloquent model with `team()`),
and feature tests covering team-ownership, wrong-team, and unknown-UUID
cases for `queryDatabaseByUuidWithinTeam`.
2026-04-30 14:48:48 +02:00
Andras Bacsai
0f830b31f3 Merge remote-tracking branch 'origin/next' into mcp-server-instance-toggle 2026-04-30 14:48:35 +02:00
Andras Bacsai
1fbc1a5540
feat(horizon): suppress failed job entries for deployment/timeout errors on cloud (#9871) 2026-04-30 11:45:52 +02:00
Andras Bacsai
f9b3f89757 Merge remote-tracking branch 'origin/next' into suppress-horizon-job-failures 2026-04-30 11:42:52 +02:00
Andras Bacsai
d057ce5172 Merge remote-tracking branch 'origin/next' into mcp-server-instance-toggle 2026-04-30 11:30:45 +02:00
Andras Bacsai
ed4f0df4fd
fix(sentinel): auto-regenerate invalid or undecryptable tokens (#9874) 2026-04-30 08:38:25 +02:00
Andras Bacsai
4575106f53 feat(sentinel): embed server UUID in encrypted sentinel token
Replace random string with encrypted JSON payload containing
server_uuid, binding token to its server for validation.
Remove double-encrypt test no longer relevant to new token format.
2026-04-30 08:21:30 +02:00
Andras Bacsai
3a42ceb67d Merge remote-tracking branch 'origin/next' into sentinel-token-recovery 2026-04-30 07:09:14 +02:00
Andras Bacsai
22569da738 Merge remote-tracking branch 'origin/v4.x' into next 2026-04-30 07:06:38 +02:00
Andras Bacsai
922950de59
chore(templates): sync service-templates from next (#9884) 2026-04-30 07:05:35 +02:00
Andras Bacsai
51d6795eeb chore(templates): sync service-templates from next
Pulls latest service-templates JSON files from `next` so cloud's hourly
PullTemplatesFromCDN job picks up queued template fixes (Jitsi, Plane,
Cap, Beszel, Langfuse, Twenty, Cal.com, etc.).

`templates/**` is in `paths-ignore` of coolify-production-build.yml so
no image rebuild triggered.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-30 07:04:12 +02:00
ShadowArcanist
13a1f86b5b
fix(notifications): set default SMTP encryption value to prevent false validation error (#9543) 2026-04-29 19:05:14 +02:00
Emmanuel Odinfono
e77e0761db
fix(backup): add .dmp to allowed extensions for database import (#9869) 2026-04-29 18:57:50 +02:00
Andras Bacsai
00d6e83e7f fix(sentinel): auto-regenerate invalid or undecryptable tokens
Replace hard validation error with self-healing token logic. Tokens that
are null, empty, or fail decryption are now regenerated automatically
rather than crashing sentinel startup or metrics reads.

Token format changed from encrypted JSON payload to a plain 64-char
random string (Str::random), eliminating double-encryption issues and
simplifying the validation regex to cover the new character set.

New `ensureValidSentinelToken()` method on ServerSetting centralises
the get-or-regenerate contract; both StartSentinel and HasMetrics now
delegate to it. HasMetrics logs a warning when regeneration occurs so
operators know a sentinel container restart is required.

`isValidSentinelToken()` now accepts `?string` (null → false).

Adds feature tests covering: null/empty/undecryptable stored values,
idempotent return of valid tokens, RuntimeException only when
regeneration itself produces an invalid token, no double-encryption of
newly generated tokens, and cast round-trip consistency.
2026-04-29 16:44:12 +02:00
Andras Bacsai
fc3ce85f88 feat(horizon): suppress failed job entries for deployment/timeout errors on cloud
On cloud, DeploymentException and TimeoutExceededException are expected
failure modes that pollute the Horizon failed jobs UI. Listen to JobFailed
events and scrub the entry via JobRepository::deleteFailed so operators
are not alerted for noise failures. Self-hosted instances are unaffected.
2026-04-29 15:40:01 +02:00
Andras Bacsai
3e76390194
fix(deployments): use app git_commit_sha when commit not explicitly set (#9865) 2026-04-29 11:02:50 +02:00
Andras Bacsai
6d1d699595 fix(deployments): resolve commit from app git_commit_sha when not explicitly set
Change `commit` param from `string 'HEAD'` default to `?string null`, then
resolve priority: explicit param > app `git_commit_sha` > `'HEAD'` fallback.

Add feature tests covering all four resolution paths.
2026-04-29 10:59:32 +02:00
Andras Bacsai
cdec8c14d6 Merge remote-tracking branch 'origin/next' into mcp-server-instance-toggle 2026-04-29 10:55:59 +02:00
Andras Bacsai
5f89f120a8
docs(design): migrate design system from .ai/ to DESIGN.md (#9863) 2026-04-29 10:43:57 +02:00
Andras Bacsai
ec6407a71f docs(design): migrate design system from .ai/ to DESIGN.md
Condense verbose 1666-line AI reference into 752-line structured
YAML/Markdown spec. Move from .ai/design-system.md to repo-root
DESIGN.md for broader visibility.
2026-04-29 10:43:19 +02:00
Andras Bacsai
7ab16ad7b5 feat(mcp): add MCP server with read-only tools for Coolify resources
Add Model Context Protocol server exposing Coolify infrastructure data
to AI assistants. Includes tools for listing/fetching servers, projects,
applications, databases, and services, scoped to authenticated team tokens.

- Add CoolifyServer with 10 read-only tools (list/get for all resource types)
- Add BuildsResponse and ResolvesTeam traits for shared tool logic
- Add EnsureMcpEnabled middleware guarding /mcp routes
- Add enable/disable MCP API endpoints (root-only)
- Add is_mcp_server_enabled toggle in instance settings and advanced UI
- Add migration for is_mcp_server_enabled column
- Add feature tests for MCP endpoints and toggle API
- Scrub sensitive keys (passwords, tokens, raw IDs) from all responses
2026-04-29 10:30:43 +02:00
Andras Bacsai
f8755261ba
feat(webhook): skip deployment on [skip ci]/[skip cd] commit markers (#9861) 2026-04-29 09:16:12 +02:00
Andras Bacsai
46180dbbf9 feat(webhook): skip deployment on [skip ci]/[skip cd] commit markers
Add DetectsSkipDeployCommits trait with two strategies: shouldSkipDeploy
(all commits must contain the marker) for push events, and
shouldSkipDeployAny (any single marker triggers skip) for PR/MR titles
and latest-commit signals.

Apply trait to Bitbucket, Gitea, GitHub, GitLab webhook controllers and
ProcessGithubPullRequestWebhook job. PRs pass pullRequestTitle through
to the job constructor for evaluation.
2026-04-29 09:12:24 +02:00
Andras Bacsai
33f5cbb7d7 chore(version): bump version to 4.1.0 2026-04-29 08:58:45 +02:00
Andras Bacsai
9af0351144
fix(storages): block UI editing of file volumes exceeding 5 MiB (#9851) 2026-04-28 22:41:37 +02:00
Andras Bacsai
eaaf258f25 fix(service): block UI editing of file volumes exceeding 5 MiB
Large host files mounted via Docker volumes caused the storages page to
become unusable — full file content was stored in the encrypted mediumText
column and serialised into the Livewire payload, crashing the browser.

- Add MAX_CONTENT_SIZE (5 MiB), BINARY_PLACEHOLDER, and TOO_LARGE_PLACEHOLDER
  constants to LocalFileVolume
- Check remote file size via stat/wc before cat in loadStorageOnServer and
  saveStorageOnServer; store placeholder instead of content when limit exceeded
- Expose is_too_large computed attribute (appended for Livewire serialisation)
- Guard submit, instantSave, and syncData in FileStorage Livewire component
- Truncate oversized content in Storage::refreshStorages to prevent payload bloat
- Show distinct warning banner in file-storage blade; mark textarea readonly and
  hide Save/Convert buttons for too-large files
- Add unit tests covering constants, computed flags, and toArray serialisation

Fixes #4701
2026-04-28 22:36:56 +02:00
Andras Bacsai
6c54f33167 Merge remote-tracking branch 'origin/next' into next 2026-04-28 22:25:49 +02:00
Andras Bacsai
092ea3bb7f
feat(server): add configurable SSH connection timeout per server (#9844) 2026-04-28 22:25:36 +02:00
Andras Bacsai
19994a0a13 test(api): add feature tests for server connection_timeout API
Tests cover PATCH update success, out-of-range, above-max, and
non-integer validation for the connection_timeout field.
2026-04-28 22:20:15 +02:00
Andras Bacsai
e8dc48e058 fix(vite): make dev server host/port configurable via env vars
Replace hardcoded HMR host with VITE_HOST/VITE_PORT env vars.
Set allowedHosts to true and derive origin/HMR config from env,
falling back to defaults when vars are absent.
2026-04-28 22:06:20 +02:00
Andras Bacsai
9bb819c33e feat(api): expose connection_timeout in servers API
Add connection_timeout to create_server docs, update_server allowed
fields, validation (integer 1-300), and advanced settings update path.
2026-04-28 15:43:58 +02:00
Andras Bacsai
4a2e37e87f chore(dev): replace minio image with maxio:latest in docker-compose.dev 2026-04-28 15:41:04 +02:00