1062 Commits
Author SHA1 Message Date
peaklabs-dev 32574d76b1 Merge remote-tracking branch 'origin/main' into next 2026-11-02 16:12:51 +01:00
Andras BacsaiandClaude Opus 5.5 1af7de8a85 fix(backups): pin a reachable IP for S3 uploads on IPv6-only servers
mc keeps one --resolve IP per host, and Coolify always pinned the IPv4
address of a dual-stack endpoint. On servers without IPv4, uploads failed
with "network is unreachable". A helper container on the upload network
now connects to each validated IP, IPv4 first, and the first IP that
connects is pinned. S3 restores are now pinned in the same way.

Closes #12397

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:38:49 +01:00
peaklabs-dev 0e30950793 feat(release): streamline versions.json on the CDN
- Every channel has a block of its own, every version after this one reads only these blocks
- Every stable sync also fills the coolify and traefik keys older instances read
- An instance keeps a copy of versions.json and reads upstream.json of the image until it has one
2026-11-02 00:07:20 +01:00
peaklabs-dev a608a37d8b feat: add update settings to the instance settings
- Adds the channels stable, preview, nightly and custom
- Preview and nightly read /coolify/release.json on the CDN and take the newest version of their channel and the more stable ones, nightly gets a new build of next or the release branch twice a day
- Custom installs any image tag of ghcr.io by hand, such as pr-1234 for the build of pull request 1234
- After a switch to a more stable channel, the instance keeps the updates of the channel it left until the stable release of its version is out
- The local versions.json moves to storage/app and is replaced in one step, a channel change replaces it without the version of the old channel
2026-11-02 00:04:26 +01:00
Andras Bacsai 6f1905b7b0 fix(access): enforce member grants on more actions
- Require write access on the target environment to clone or move a resource
- Check read access on shared variables before a reference is added or resolved
- Limit team credentials, git sources, and imports of other backups to team-wide writers
- Require the delete level for backup, volume, storage, and task deletes
- Require create access for previews, new projects, and git sources
- Use the token team for the access scope, and check team-wide access on Livewire updates
- Require instance admin to toggle the API and MCP server
- Hide server pickers and broadcast details from members without access
2026-10-30 16:11:10 +01:00
Andras BacsaiandClaude Opus 5.5 5116a93f42 feat(api): add DNS, integration token and secret manager management (#12374)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 13:37:32 +01:00
github-actions[bot] 82764c6d79 Merge remote-tracking branch 'origin/main' into next 2026-10-29 22:37:14 +00:00
Andras Bacsai 72c8209285 feat(subscription): email checkout reminders for expired sessions
Enable Stripe checkout recovery links and send rate-limited reminders to the
admin who started an unfinished subscription checkout.
2026-10-29 23:35:34 +01:00
b85a9197a1 chore: merge main into next (#12382)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 21:10:39 +01:00
Andras Bacsai 96ed09f0cc fix(auth): clear forced password reset after a password reset
An invited user who set a password with Forgot password kept the forced
reset flag. A re-invite then replaced the password, and a revoked or
expired invitation deleted the account.
2026-10-29 18:16:00 +01:00
github-actions[bot] d22f75ae0b Merge remote-tracking branch 'origin/main' into next 2026-10-28 14:08:14 +00:00
Andras Bacsai bc61f4860f fix(railpack): serialize builder bootstrap before builds 2026-10-28 15:00:59 +01:00
github-actions[bot] 9d0b6a5054 Merge remote-tracking branch 'origin/main' into next 2026-10-28 13:28:51 +00:00
Andras BacsaiandClaude Opus 5.5 597a878d80 fix(hetzner): validate over SSH when the Hetzner API call fails
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 14:16:22 +01:00
github-actions[bot] 71f1c33bf1 Merge remote-tracking branch 'origin/main' into next 2026-10-28 11:27:20 +00:00
Andras Bacsai ef57eea320 fix(backups): sign mc requests with S3v4 and retry failed S3 uploads 2026-10-28 10:35:46 +01:00
Andras BacsaiandClaude Opus 5.5 eaabed5c4b fix: scope finish events of background tasks to their team (#12355)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 22:36:25 +01:00
62b2a99a70 chore: merge main into next (#12351)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Aditya Tripathi <aditya@climactic.co>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 22:25:43 +01:00
fe6c73726d chore: merge main into next (#12344)
Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com>
Co-authored-by: Aditya Tripathi <aditya@climactic.co>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 20:25:53 +01:00
Andras BacsaiandClaude Opus 5.5 56d0cf0e27 fix(servers): validate new cloud servers automatically when they are running
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 17:58:34 +01:00
Andras Bacsai 101444b8ca fix(log-drains): support Axiom edge domains and update Fluent Bit to 5.1
- Add an Axiom edge domain setting (default us-east-1) and use the /v1/ingest endpoint, so EU datasets work
- Remove the Highlight drain (service ended) and stop its running containers
- Update Fluent Bit from 2.0 to 5.1 and use the warn log level
- Restart running drains when the generated files change, with the new image pulled before the old container stops
- Show log drain validation errors under their fields

Closes #9898
2026-10-27 17:41:50 +01:00
Andras BacsaiandClaude Opus 5.5 ba58884565 fix(dev): stop GPU VM start while host processes use the GPU
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 16:38:21 +01:00
Andras BacsaiandClaude Opus 5.5 a2c048c999 fix(database): recreate TCP proxies that run an outdated configuration
Proxies started before v4.4.4 kept the old nginx config after an upgrade:
the upstream IP was resolved only once and IPv6 connections were reset.

- Label new proxies with a configuration version
- Status checks (Sentinel and SSH) recreate a running proxy with an
  older or missing version once, at most every 10 minutes
- Remove the old proxy only after the image pull, so a failed pull
  keeps it running

Closes #10198

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 16:24:55 +01:00
Andras Bacsai 1039368491 fix(s3): support virtual-hosted-style URLs for S3 storages
Add a "Use path-style URLs" setting to S3 storages. It is detected from
the endpoint (Alibaba OSS, Tencent COS, Volcengine/BytePlus TOS), and the
connection test switches to virtual-hosted style when the provider
rejects path-style requests. Backups pass `--path off` to mc.

Closes #10347
2026-10-27 15:53:16 +01:00
Andras Bacsai 5a08c35e7d fix(applications): stop again while a container restarts past its limit
- The restart limit claim sent only one stop. If that stop failed or came
  too late, the container kept restarting past the max restart count.
- Sentinel pushes and status checks now dispatch the stop again while a
  container still runs; the notification is still sent once.

Closes #10761
2026-10-27 14:40:48 +01:00
Andras BacsaiandClaude Opus 5.5 25761e29c4 fix(team): keep member API tokens on promotion
Only revoke a member's team tokens when the role goes down. Promotions
and ownership transfers on account deletion keep the tokens.

Closes #12342

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 14:37:38 +01:00
Andras Bacsai 8d083deffb fix(storage): stop syncing file storages on every compose parse
The compose parser queued ServerFilesFromServerJob for every volume on
each parse, and pages that only show data parse the Compose file. Each
sync also sent two SSH commands for each file.

- Queue the sync only for a compose deployment, and for each service
  resource with file storages when the service starts or deploys.
- Read the compose service names without a parse on the Domains and
  scheduled task pages.
- Check all file storages with one remote command, and stop when a
  symbolic link, a special file, or an unknown state is at a file path.
- Keep the application path in a file storage when a pull request
  preview is parsed. Preview deployments of the current parser write
  their `-pr-<id>` copies through LocalFileVolume::forPullRequest().
- Remove the unreachable file sync from the service resource page.
2026-10-27 12:04:37 +01:00
Andras BacsaiandClaude Opus 5.5 4edf987279 revert(ssh): send remote command batches in argv again
Sending SSH command batches on stdin changes how every remote command
reaches a server, which is too risky for a patch release. Move it to
next and restore the heredoc transport from before 1a2a5362a. The
shared test helpers stay because they work with both transports.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 11:11:09 +01:00
Andras Bacsai 1a2a5362ad fix(security): secure remote command secrets and clone volume data 2026-10-27 09:47:18 +01:00
Andras Bacsai 1017a5b307 fix(deploy): use SSH user registry credentials for host image pulls (#12216) 2026-10-26 13:00:06 +01:00
Andras Bacsai 5d66fb719e fix(registration): time-limit first root account creation
Open root registration for ten minutes after startup, then require a Coolify restart to reopen it. Update installer credential handling and explain the setup window in the registration UI.
2026-10-26 10:49:19 +01:00
Andras BacsaiandClaude Opus 5.5 80ce0efe7e fix(api): use the Cloudflare client IP for allowed IPs and audit logs
Closes #12301

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 23:47:39 +01:00
Andras BacsaiandClaude Opus 5.5 5ed8565edf fix(patches): show held back package updates apart from the updates
Phased Ubuntu updates, apt-mark holds, and apk version pins showed as
available updates that no update could install.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 12:53:20 +01:00
Andras BacsaiandClaude Opus 5.5 7e612422b6 fix(proxy): keep proxy status current and stop auto-start during restarts
- Refresh the navbar proxy status on the 30 s poll
- Skip Sentinel and server check auto-start while a proxy start or restart runs
- Use the StartProxy commands in RestartProxyJob, so Caddy restarts keep the
  maintenance blocks and remove the Traefik logrotate sidecar

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 18:02:17 +02:00
Andras Bacsai 8aed790a78 fix(migration): block server migration when the target proxy is not running 2026-10-24 17:55:11 +02:00
Andras BacsaiandClaude Opus 5.5 0eb78dcf9b feat(dev): pass the host NVIDIA GPU through to the KVM dev VM
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 11:16:47 +02:00
Andras BacsaiandClaude Opus 5.5 e49e540ec0 fix(applications): report a failed stop instead of failing silently
- Do not ignore errors of the docker stop and rm commands, so a failed SSH call
  does not mark a running application as exited.
- Log the failure and broadcast ApplicationStopFailed; the application page
  shows an error toast.

Closes #11063

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:45:13 +02:00
Andras BacsaiandClaude Opus 5.5 d542f13b9c fix(docker-cleanup): keep new images of deploying and Docker Compose applications
Each Docker Compose service image now has its own retention, images used by
any container count as in use, and applications with an active deployment
keep all their images.

Closes #11069

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:44:43 +02:00
Andras Bacsai e0b6ac1121 fix(api): accept settings that the UI can change but the API rejected
- Applications: is_container_label_readonly_enabled (turning it back on
  regenerates labels), include_coolify_default_variables, and
  dockerfile_target_build on create.
- Databases: save is_log_drain_enabled on update instead of dropping it,
  include_coolify_default_variables, and disable_local_backup on backups
  (only with save_s3).
- Services: include_coolify_default_variables, and redirect on service
  applications (www/non-www needs both hosts).
- Servers: wildcard_domain, server_timezone,
  backup_compression_cpu_percentage, and the proxy error page.

Closes #11092
2026-10-24 00:40:19 +02:00
Andras BacsaiandClaude Opus 5.5 2ea1afb811 fix(server): explain why the Docker Engine version check failed
When "docker version --format json" did not return clean JSON (for
example, text from a shell startup file), validation stored 0.0.0 and
said that Docker was older than version 24. Validation now stores no
version and tells the user to run the command on the server. When the
version is too old, the message shows the detected version.

Closes #11089

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:32:14 +02:00
Andras BacsaiandClaude Opus 5.5 3d4df5e06f fix(rollback): find the current image of containers with any name
The rollback image list inspected a container named after the bare
application UUID, so `current` was null for timestamped, prefixed, and
custom-named containers. Find the running production containers by their
owner labels instead.

Closes #12296

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:51:24 +02:00
Andras BacsaiandClaude Opus 5.5 2a7faa1210 fix(docker-cleanup): skip scheduled cleanups while a deployment is running
Closes #12183

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:59:22 +02:00
Andras BacsaiandClaude Opus 5.5 1e71561239 fix(backups): sign S3 uploads with the storage region
Closes #12264

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:28:48 +02:00
Andras Bacsai c454f84545 fix(server-transfer): keep imported data exact and guard archived servers
- Skip TrimStrings and ConvertEmptyStringsToNull on the import route; an empty shared variable failed the whole import
- Keep compose parser versions, static ports, legacy variable keys, and only the bundle's variables and destinations
- Give the transfer back token the deploy permission that the import needs
- Move the Cloudflare tunnel DNS record with the server and park it on the source
- Refuse cloud server deletes, power on, tunnel and DNS changes, and scp for archives; skip their backup alerts and provider polling
- Add a column-level round-trip test, archive guard tests, and a live full-coverage transfer test
- Advance the GitLab App sequence in the dev seeder
2026-10-22 15:52:20 +02:00
Andras BacsaiandClaude Opus 5.5 dbc3fb91bf fix(cdn): fetch versions.json once per hour, spread evenly across instances
- Retry CDN requests only for transient errors and honor Retry-After
  (Cloudflare error 1200 sends 60 s), with jitter.
- Read helper and Sentinel versions from the local versions.json, which
  the hourly update check refreshes, instead of fetching per job/server.
- Replace the random 0-600 s delay with a stable per-instance offset
  inside the cron interval (max 1 h).
- Manual update checks and upgrades make one CDN attempt only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 18:10:48 +02:00
Andras BacsaiandClaude Opus 5.5 65a7bd5c05 chore: merge main into release/v4.5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 13:37:20 +02:00
Andras Bacsai 5925c8403a fix(log-drain): replace server name whitespace with hyphens (#12239) 2026-10-20 11:29:11 +02:00
Andras Bacsai 62be8674bc feat(proxy): add optional permanent redirects for apps and services (#12233) 2026-10-19 21:46:12 +02:00
Andras Bacsai 6d36605176 fix(proxy): require coolify-proxy container name outside Swarm (#12225) 2026-10-19 21:23:12 +02:00
Andras Bacsai d043c10c11 fix(postgresql): set PGPASSWORD for healthchecks and backups (#12224) 2026-10-19 21:20:17 +02:00