Commit Graph
17434 Commits
Author SHA1 Message Date
Andras Bacsai 1f4006ac49 test: remove tests that do not exercise app code
Remove tests that copy app logic into the test, grep PHP source as
text, only check literals, constants, class_exists or PHP built-ins,
duplicate other tests, or are always skipped. Keep source checks that
guard security and authorization rules.

Rename a duplicate Pest helper so the full suite loads, drop the
missing v5/Browser path, and remove the CLAUDE.md symlink in favor of
AGENTS.md. Correct AGENTS.md: Dusk is not installed and the upgrade
script is scripts/upgrade.sh.
2026-09-28 11:55:56 +02:00
Andras BacsaiandClaude Opus 5.5 59788c59f0 fix(storage): refresh storage form values consistently
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:51:53 +02:00
Andras BacsaiandClaude Opus 5.5 dd7ad91ba2 fix(cleanup): delete old rows in batches and report the real count
cleanup:database used orderBy()->skip(10)->delete(). Laravel drops the offset
in a DELETE, so it deleted all old rows anyway, and the count query with the
offset printed 0 on PostgreSQL. Count without the offset, delete in batches of
1000 rows so a large table is not locked by one long DELETE, and write the
output through the command so it is captured.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:50:32 +02:00
Andras BacsaiandClaude Opus 5.5 4145261b6e fix(api): validate delete_from_provider before deleting a server
Reject delete_from_provider values that are not booleans, and reject the
request when the team has no token for a linked cloud provider. Before,
both cases removed the server from Coolify but kept the cloud VM running.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:42:48 +02:00
Andras BacsaiandClaude Opus 5.5 f885e1eeeb fix(deployments): do not print build-time values in development debug lines
With APP_ENV=local the deployment log showed every build-time value (raw,
stripped and escaped) and the old and new value of overrides. Print only the
key, the type and the value length.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:42:03 +02:00
Andras BacsaiandClaude Opus 5.5 f540c49f68 fix(security): encrypt stored remote commands and remove them after the final attempt
remote_process() stored the full shell command as plain text in
activity_log and kept it for 60 days. Database starts store the compose file
with the database passwords, imports store S3 keys, and the Cloudflare
tunnel setup stores its token.

- Store the command encrypted. The queue worker decrypts it right before the
  SSH call and still reads plain commands of tasks queued before the upgrade.
- Remove the command when the task is finished: after a successful run, in
  failed() when no attempt is left, and for a stopped import. A failed attempt
  that the queue retries keeps it.
- Do not write a command preview into the error log.
- Migration: remove stored commands from activities that no longer run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:41:56 +02:00
Andras Bacsai aa61214233 feat(api): add delete_from_provider option to server delete endpoint (#12026) 2026-09-28 11:38:31 +02:00
Andras BacsaiandClaude Opus 5.5 f8b320ab40 fix(servers): validate the selected private key when adding a server
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:35:46 +02:00
Andras BacsaiandClaude Opus 5.5 6c3249d324 fix(logs): track the All lines state locally and show loading in the lines control
The All button read $wire.numberOfLines, which does not update while the user
types or pastes a new number, so All stayed highlighted. Keep the state in
Alpine instead: All loads set it, and any input in the number field clears it
unless the value is -1.

Show a spinner in the All button while all logs load, and in place of the
Lines label while a new line count loads. Both keep their width.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:18:57 +02:00
Andras BacsaiandClaude Opus 5.5 eed50d6781 fix(github): check the private key before generating app tokens
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:18:29 +02:00
Andras BacsaiandClaude Opus 5.5 af19bd0a50 fix(sources): validate the selected private key on source settings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:12:48 +02:00
Andras BacsaiandClaude Opus 5.5 1f7a011767 docs(ai): add lessons for browser test output and shared storage
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:09:13 +02:00
Andras BacsaiandClaude Opus 5.5 986e93445e test: remove production seeder test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:09:13 +02:00
Andras BacsaiandClaude Opus 5.5 e778d99e9d feat(logs): render runtime logs in a virtualized list
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:09:13 +02:00
Andras BacsaiandClaude Opus 5.5 d59bcf5ae3 fix(logs): show container lookup errors and reload containers after status checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:09:13 +02:00
Andras BacsaiandClaude Opus 5.5 e62658467f feat(ui): add app icons and web manifest
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:09:13 +02:00
Andras BacsaiandClaude Opus 5.5 1712fb393a fix(transfer): reuse or create the private key in the target team only
The import looked up the key in all teams and stopped with "already exists
on another team", which also told the user that another team has the key.
Keys are unique per team, so reuse a key of the target team or create one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:02:19 +02:00
Andras BacsaiandClaude Opus 5.5 df9f1555b3 fix(auth): keep the current team only in the session
Login, registration and OAuth set a currentTeam attribute on the user model
that is not a database column, so a save of the user in the same request
would fail. Keep the team in the session and read it with currentTeam().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 11:02:19 +02:00
Andras BacsaiandClaude Opus 5.5 f09de9c359 feat(ui): link healthcheck status row to the healthcheck page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 10:47:01 +02:00
Andras Bacsai e2f75393e5 test: clarify onboarding coverage 2026-09-28 10:46:44 +02:00
Andras BacsaiandClaude Opus 5.5 16ccc929b6 chore(deps): update league/commonmark to 2.10.3
Fixes the denial of service advisory GHSA-8rr7-cvq3-gmfh (affected
versions >=1.5.0,<2.10.0). nette/schema moves to 1.3.6 with it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 10:36:25 +02:00
Andras BacsaiandClaude Opus 5.5 a70f882f7b fix(dev): show the Lima VM start command on the localhost server page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 10:29:01 +02:00
Andras BacsaiandClaude Opus 5.5 714b09fa24 fix(ssh): never disable the SSH command timeout
SSH_COMMAND_TIMEOUT=0 (or an invalid value) removed the time limit of every
remote command, and imports could then be marked stale while still running.
Use the default of 3600 seconds for values that are not positive.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 10:29:01 +02:00
Andras BacsaiandClaude Opus 5.5 575a97b6b7 chore(deps): update resend-laravel to 1.5 (resend-php 1.16)
resend-php 1.x reads the statusCode of Resend errors and knows more error
names. Coolify only uses emails->send and the exception classes, which did
not change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 10:29:01 +02:00
Andras Bacsai 6656ab5ea6 fix: keep existing SSH keys out of onboarding state 2026-09-28 10:22:44 +02:00
Andras BacsaiandClaude Opus 5.5 7e4fbc3499 fix(service): show the selected resource status in the service heading
A merge (9ef1ab764) lost the resource-aware status from #11566.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 10:13:20 +02:00
Andras BacsaiandClaude Opus 5.5 9c6a8e4767 fix(profile): close the email change modal after verification
A merge (253e59e73) lost the close-email-change-modal dispatch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 10:13:20 +02:00
Andras BacsaiandClaude Opus 5.5 75976d9882 fix(keys): check duplicate private keys in the key's own team
The duplicate check used the signed-in user's current team, or all teams
when there was none. Check the team the key belongs to.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 10:13:20 +02:00
Andras BacsaiandClaude Opus 5.5 e755f4c9e0 fix(webhooks): always verify manual webhook signatures
GitHub, Gitea and Bitbucket manual webhooks accepted any signature when
APP_ENV=local. GitLab and the GitHub App webhook already did not.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 10:13:20 +02:00
Andras BacsaiandClaude Opus 5.5 9c7f2dc412 fix(templates): keep local service templates when the CDN bundle is unusable
A 200 response with an empty body or an error page replaced the local
templates and the shared cache, so the service list became empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 10:13:20 +02:00
Andras BacsaiandClaude Opus 5.5 d404de87d7 fix(email): show Resend errors instead of failing in the error handler
resend-php 0.18 reads a "code" key that the Resend API does not send
(it sends statusCode), so every Resend error failed with Undefined array
key "code". Errors with names that the SDK does not know were returned as
a normal response and counted as a sent email. Read statusCode and name from
the error, and treat a response without an email id as an error.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 10:13:20 +02:00
Andras Bacsai 5f6fb5dcc2 feat(dev): run localhost dev server in a Lima VM on macOS
Add a Lima backend to scripts/dev. Auto mode picks it on macOS when
limactl (Lima >= 2.0) is installed, and COOLIFY_DEV_SERVER_BACKEND=lima
forces it. Lima VMs are named coolify-dev-<slot>-<profile>. Coolify
connects to them through Lima's forwarded SSH port on
host.docker.internal, and only guest ports 80/443 are forwarded to
the host.

dev:qemu:seed now takes --ip and --port options, so the seeded server
can use a forwarded SSH address instead of the profile IP.

Add tests for the Lima start flow and for seeding with an overridden
address, and document the macOS setup in AGENTS.md.
2026-09-28 09:45:29 +02:00
Andras Bacsai 2bb1757aab Merge remote-tracking branch 'origin/main' 2026-09-28 09:41:37 +02:00
Andras BacsaiandClaude Opus 5.5 7c60ccda0d fix: restore config diff, error text, delete handler, webhook id and danger zone fixes
- Configuration diff: report all settings when an app has no earlier
  snapshot, so older apps show "configuration changed" again (#11430).
- DigitalOcean/Vultr: do not repeat the "API error:" prefix.
- HasSecretManager: the deleting listener returns nothing, so later
  deleting listeners still run.
- GitLab webhook: use new_public_id() like the other webhooks.
- Team danger zone: show the link and open the page only for the team owner.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 09:35:32 +02:00
Andras Bacsai 5b61467e73 fix(proxy): flag Traefik restart after TLS certificate deletion (#12015) 2026-09-28 09:35:27 +02:00
Andras BacsaiandClaude Opus 5.5 178e6665f8 fix: restore security and broken-feature fixes lost in the revert
Security:
- Settings email: authorize the SMTP and Resend toggles.
- Server navbar: show Sentinel status only to users who can view Sentinel.
- GitHub source: permission gates on Sync name and Delete.

Broken features:
- Profile: avatar upload (missing import and file uploads trait).
- API tokens: keep the "Never" expiry choice.
- Environment variables: show validation errors instead of a generic error.
- Servers API: read the server uuid from the route in domains_by_server,
  so ?uuid=<application> filters instead of returning 404.
- Cloud servers: Power On for stopped Hetzner, DigitalOcean and Vultr servers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 08:40:01 +02:00
Andras Bacsai 1c3de6a4cd fix(sentinel): surface remote fetch errors instead of a TypeError
Let instant_remote_process throw on failed SSH/docker commands so the
real error (e.g. a missing coolify-sentinel container or an unreadable
SSH key) is reported. A null result, such as a literal "null" body, is
turned into an empty string, which guard() rejects as an invalid response.

Run curl with -sS so progress output stays out of the output while
errors are still reported.

Add tests for a failed docker exec and a literal null body.
2026-09-28 08:27:47 +02:00
Andras BacsaiandClaude Opus 5.5 8dee2f4cb5 fix(github): restore the Test connection button on GitHub sources
The redesign removed the only way to call testConnection on GitHub sources;
GitLab sources still have the button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 08:08:38 +02:00
Andras BacsaiandClaude Opus 5.5 a6a3b1d26b revert: undo the app changes from the test clean-up
Revert the app code changes of d666a0a95, 69eeb2f62, 1e66c9f9b and
a32082b03, so login, registration, OAuth, team danger zone, service
templates, and the other touched files are back to their earlier state.
Keep the removal of unused components and markup-only tests (d666a0a95
also contained those deletions by mistake).

StartupExecutionCleanupTest now fakes the template CDN with the current
file content, so app:init in the test no longer empties
templates/service-templates-latest.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 08:06:34 +02:00
peaklabs-dev aef0f29b84 feat(services): update service template json 2026-09-28 01:18:01 +02:00
🏔️ Peak fe5bddfefb feat(services): update and add new service templates (#11217) 2026-09-28 00:56:55 +02:00
Victor Gonçalves de Andradeandpeaklabs-dev db847be620 feat(service): add OpenWA templates (#11448)
Co-authored-by: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com>
2026-09-28 00:20:58 +02:00
Andras BacsaiandClaude Opus 5.5 a79ee909c6 chore: remove unused components and markup-only tests
- Delete Blade components, component classes, Livewire components and
  views that nothing uses after the redesign.
- Delete tests that only compare Blade/CSS source text; keep the source
  checks for authorization gates, stable wire:key values and escaping.
- Update stale tests to the current UI and behaviour.
- Update DESIGN.md to the current navigation and layout.
- Add a lesson: test behaviour, not source markup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 00:18:16 +02:00
Andras BacsaiandClaude Opus 5.5 a32082b03f fix: regressions found by the test suite
- TrustHosts: validate the Host header also when the FQDN cache is cold.
- Settings email: authorize the SMTP and Resend toggles.
- Server navbar: show Sentinel status only to users who can view Sentinel.
- GitHub source: restore permission gates on Sync name and Delete, and the
  Test connection button.
- Profile: make avatar upload work (missing import and file uploads trait).
- API tokens: keep the "Never" expiry choice.
- Environment variables: show validation errors instead of a generic error.
- Servers API: read the server uuid from the route in domains_by_server.
- Configuration diff: report all settings when no earlier snapshot exists.
- Cloud servers: restore Power On for stopped servers; do not repeat the
  provider error prefix.
- HasSecretManager: do not stop later deleting listeners.
- GitLab webhook: use new_public_id() like the other webhooks.
- Dev: show the Lima VM start command on the localhost server page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 00:18:09 +02:00
Andras BacsaiandClaude Opus 5.5 1e66c9f9bd fix(templates): keep local service templates when the CDN bundle is unusable
A 200 response with an empty body or an error page replaced the local
templates and the shared cache, so the service list became empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 00:18:09 +02:00
Andras BacsaiandClaude Opus 5.5 69eeb2f628 fix(team): show the team danger zone only to the team owner
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 00:18:09 +02:00
Andras BacsaiandClaude Opus 5.5 d666a0a956 fix(auth): stop storing the current team as a user attribute
Login, registration and OAuth set a fake currentTeam attribute on the user.
When refreshSession() saved the user in the same request, the query wrote
a currentTeam column that does not exist. Keep the team only in the session
and read it through currentTeam().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 00:18:09 +02:00
Joshua Anderson 109fbdec81 fix(service): chibisafe uploads volume (#11804) 2026-09-27 23:59:10 +02:00
liveeeeee 51117d62c9 fix(service): allow desktop app origins in Buzz template (#11741) 2026-09-27 23:52:14 +02:00
Vitaliy Kukharik 729266e345 feat(service): update autobase to v2.11 (#11749) 2026-09-27 23:49:51 +02:00