Commit Graph
18575 Commits
Author SHA1 Message Date
Andras Bacsai 11ece25149 chore: merge main into release/v4.5 (#12140) 2026-10-12 21:40:08 +02:00
Andras Bacsai 200af07225 Merge remote-tracking branch 'origin/release/v4.5' into automation/sync-main-to-release-v4.5 2026-10-12 21:38:45 +02:00
Andras BacsaiandClaude Opus 5.5 3863f0d257 fix(proxy): link Traefik update docs in patch update callout
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:11:05 +02:00
Andras Bacsai c30e47dc12 fix(ui): show Redeploy label for running applications 2026-10-12 21:11:05 +02:00
Andras Bacsai da426914ca Revert "fix(ui): prevent layout shifts with a stable scrollbar gutter"
This reverts commit 5756a4cda4.
2026-10-12 15:14:30 +02:00
Andras Bacsai 5756a4cda4 fix(ui): prevent layout shifts with a stable scrollbar gutter
Skip terminal scroll-lock padding when the browser reserves scrollbar space.
2026-10-12 15:07:09 +02:00
Andras Bacsai c54902f776 feat(logs): add text view, group log toolbar into menus, and use skeleton loaders
- Runtime logs: add a compact text view, move display options and log level filters into a View menu, move copy and download into an Export menu, and remove the extra top margin.
- Replace spinner loading cards with skeletons on the logs, dynamic configurations, proxy, TLS certificates, Docker images, environment variables, preview deployments, rollback, subscription, cloud provider, and new resource pages.
2026-10-12 14:55:37 +02:00
Andras Bacsai 7837a07ba2 fix(notifications): disable channels after repeated configuration failures
Count invalid keys, tokens, and deleted webhooks in a new failure_count column
on each notification settings table, like servers.unreachable_count. After 3
failures in a row the channel is disabled and the team is told by instance
email and its other channels. Rate limits and server errors are retried and
not counted; test notifications never count.
2026-10-12 14:37:58 +02:00
Andras Bacsai 12b35957eb feat(ui): add yaml syntax highlighting to dynamic proxy configs and file mounts 2026-10-12 14:31:37 +02:00
Andras BacsaiandClaude Opus 5.5 b13ecb0542 chore(seeding): seed railpack examples from new repo layout
Move all git examples into ApplicationSeeder on railpack, using the
reorganized coollabsio/coolify-examples main branch, and drop the
separate Railpack Examples project. Add DEV_SEED_IP to set the IP for
seeded sslip.io domains (e.g. a Tailscale IP).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 14:26:19 +02:00
Andras Bacsai a7e1cecfa7 fix(ui): remove "View log" text from deploying indicator 2026-10-12 14:26:09 +02:00
Andras BacsaiandClaude Opus 5.5 213a61b7ab fix(env): pass exact env values to containers, keep old escaping for existing variables (#12024)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 13:06:45 +02:00
Andras Bacsai 9893a5f503 fix(seeding): stop writing CA certificates to servers on startup
Remove the CA certificate seeder from production seeding. Add a regression
test verifying no CA certificate is created or remote task queued.
2026-10-12 10:35:20 +02:00
🏔️ Peak 856735613d feat(backups): back up the coolify database before an update (#12093) 2026-10-12 00:59:14 +02:00
🏔️ Peak 068f02e274 chore(repo): add why section and maintainer PR templates (#12091) 2026-10-12 00:12:40 +02:00
Andras Bacsai 1d7bee0b83 fix(compose): preserve long bind options and non-creating sources (#12135) 2026-10-11 21:02:29 +02:00
Andras Bacsai cdd8f82840 fix(compose): preserve environment variable semantics (#11794) 2026-10-11 21:02:11 +02:00
Andras Bacsai 1e42284db0 feat(proxy): override the Traefik certificate resolver per resource
Applications and service applications can now use the server resolver,
no resolver ("none"), or a custom resolver name. This allows servers
that mix Let's Encrypt domains with domains that use their own
certificates, such as Cloudflare Origin CA. The setting is available in
the UI and the API.

Closes #12138
2026-10-11 19:01:27 +02:00
Andras Bacsai 90c2e58e52 feat(build-packs): mark Nixpacks as deprecated and recommend Railpack 2026-10-11 18:39:45 +02:00
Andras Bacsai ebfa747e77 feat(github-runners): link to the GitHub App from not-ready callouts 2026-10-11 17:26:10 +02:00
Andras Bacsai e58e490061 fix(api): link to API settings where disabled API blocks a feature 2026-10-11 16:53:35 +02:00
Andras Bacsai ec9621370a fix(deployments): log the configured timeout when a deployment times out 2026-10-11 16:25:26 +02:00
Andras Bacsai 263630bcf2 fix(proxy): clear absent letsencrypt resolvers during migration
Set the resolver to null when saved Traefik configuration has no active letsencrypt resolver. Preserve existing settings for active or unknown configurations and log parsing failures.

Add regression coverage for missing, active, unknown, and malformed configurations.
2026-10-11 11:17:01 +02:00
Andras Bacsai af589f6da4 feat(proxy): make the Traefik certificate resolver configurable per server
Coolify always added tls.certresolver=letsencrypt to generated HTTPS
routers, so Traefik logged errors when the proxy used its own
certificates (for example Cloudflare Origin CA) without that resolver.
Add a server setting (default letsencrypt) in the proxy page and API.
An empty value omits the resolver from resource labels, the Coolify
dashboard routes, and the catch-all router.

Closes #12138
2026-10-11 10:19:40 +02:00
Andras BacsaiandClaude Opus 5.5 d4502bc514 fix(previews): avoid doubled scheme in preview URL templates
Closes #12136

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 09:51:41 +02:00
Andras Bacsai f55efc859d fix(docker): pin PHP base image to prevent startup failures
Pin development and production images to serversideup PHP v4.5.1 to
avoid the v5 user-bundle relocation that breaks startup.

Bump Coolify to 4.4.6 in the default config and version manifests.
v4.4.6
2026-10-09 20:36:48 +02:00
Andras Bacsai 5246427b03 fix(upgrade): remove disk space checks that block Coolify updates v4.4.5 2026-10-09 20:03:49 +02:00
Andras Bacsai e3d7c04be7 chore: merge main into release/v4.5 (#12131) 2026-10-09 19:30:48 +02:00
Andras Bacsai 5cece62545 feat: add Hostinger VPS, multi-destination backups and maintenance pages
- Add Hostinger server provisioning, API endpoints and lifecycle controls.
- Support multiple S3 destinations for database and volume backups.
- Add proxy error pages and application and service maintenance mode.
- Detect repository configuration and support environment imports.
- Add HTTP basic auth hash options and Redis-compatible database flushing.
- Improve Railpack builder cleanup and development instance backups.
2026-10-09 19:30:26 +02:00
Andras Bacsai 4d55a93d48 docs(readme): add NodePlus.ai to big sponsors v4.4.4 2026-10-09 19:24:50 +02:00
Andras Bacsai a963f95612 fix(railpack): match frontend version to the helper's CLI
Use the helper's RAILPACK_VERSION, falling back to the installed CLI
version, instead of a hardcoded frontend version. Add regression tests
for both version sources and application-variable isolation.
2026-10-09 16:15:49 +02:00
Andras Bacsai 0873616a7f fix(dns): retry custom DNS queries over TCP when UDP answer is truncated
Closes #12076
2026-10-09 15:34:26 +02:00
Andras Bacsai 3c5a664b95 test(database): verify runtime DNS resolution in generated proxy config 2026-10-09 14:55:44 +02:00
Andras Bacsai 8e0f4d0dfa fix(database): prevent duplicate environment variables on start and clone
- Stop the Redis username accessor from creating REDIS_USERNAME on read
- Keep source values when cloning applications (no duplicate NIXPACKS_NODE_VERSION)
- Match exact keys when adding default database environment variables
- Write content files before database containers start
- Resolve the database proxy upstream through Docker DNS on each connection
- Remove existing duplicate REDIS_USERNAME and NIXPACKS_NODE_VERSION rows
2026-10-09 14:53:05 +02:00
Andras Bacsai f87f80ae96 feat(dns): add opt-in Cloudflare proxy mode for new DNS records 2026-10-09 13:52:20 +02:00
Andras Bacsai f39c884cc7 fix(servers): support IPv6 server addresses everywhere
Store server IPs in one form (no brackets, short lower-case IPv6) and
write each address in the form its context needs:

- URLs and host:port (Sentinel, database URLs, SFTP backup download,
  DNS servers, SMTP, webhook base URLs, links, health checks) get
  brackets through formatHostForUrl().
- Traefik Host() rules use the address without brackets, so IPv6
  domains no longer return 404; saved labels are fixed at deploy.
  Caddy keeps the brackets.
- SSH keeps the plain address.
- Hetzner gives an IPv6 /64 network; IPv6-only servers now get the
  server address (prefix::1) instead of the unusable prefix::64.
- sslip labels, registry image names with an IPv6 host, the API domain
  list, allowlist matching and duplicate checks handle IPv6.

A migration normalizes stored IPv6 server addresses, repairs Hetzner
servers saved as ::64 that are not reachable, and adds brackets to
saved Sentinel URLs.
2026-10-09 13:50:28 +02:00
Andras Bacsai 17957fbb4c feat(ui): restyle sidebar footer user menu and toggle icon
Put the user menu above the toggle in the collapsed sidebar, make the
user menu a full-width 3D button with rounded corners, and use a new
sidebar toggle icon everywhere.
2026-10-09 13:50:07 +02:00
Andras Bacsai 45d165e82e fix(database): listen on IPv6 in public TCP proxy when network has IPv6
Docker publishes the proxy port on [::] too and forwards it to the
container's IPv6 address when the network has IPv6 enabled. nginx
listened only on IPv4, so every IPv6 connection was reset.

Add listen [::]:<port> when the destination network has IPv6 enabled.
Networks without IPv6 keep the IPv4-only listener.

Fixes #12133
2026-10-09 13:31:25 +02:00
Andras BacsaiandClaude Opus 5.5 376e7aab24 feat(upgrade): block upgrades when the disk is almost full
An upgrade pulls new images and recreates the Coolify containers. A full
disk during an upgrade can leave Coolify broken.

- Measure free space on the Docker root dir and /data/coolify of localhost;
  require 5 GB. An unknown value does not block.
- Manual upgrade: show the free and required space, with Run Docker cleanup,
  Check again, and a confirmed Upgrade anyway override.
- Automatic upgrade: skip it and notify the team (disk usage channels, at
  most once per 24 hours per server).
- upgrade.sh: stop before any change when the disk is low. A new 5th
  argument skips the check (used by the override).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 13:26:53 +02:00
Andras BacsaiandClaude Opus 5.5 b850a06d26 fix(cache): write config and route cache files atomically
Laravel writes bootstrap/cache/config.php in place, so the file is empty
until the write ends. app:init rebuilds the cache on every container start
while PHP-FPM already serves requests. A request could read the empty file
(TypeError in LoadConfiguration), and OPcache with validate_timestamps=0
kept it, so every request failed until a restart.

Write to a temporary file in the same directory and rename it over the
target. A failed write now keeps the old file instead of an empty one.

Fixes #12120

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 13:26:48 +02:00
Andras Bacsai 8c4aa7bb00 feat(git): allow IPv4 and IPv6 addresses in repository URLs
Accept HTTP(S), git:// and SCP-style SSH repository URLs whose host is an
IP address, including bracketed IPv6 such as git@[2a01:4f8::1]:org/repo.git.
The clone runs on the user's deployment server, so the IP block did not
protect Coolify, and SSH URLs with IPv4 already passed.

Loopback, link-local and other reserved addresses are still rejected as
internal hosts. Brackets are allowed only around a valid IPv6 host.
2026-10-09 09:31:07 +02:00
Andras Bacsai 247015e30a fix(docker): match legacy Compose containers by UUID in names
Resolve application owners from dash-separated UUIDs in Compose service or coolify.name labels, and include service-prefixed names in Docker filters.

Add regression coverage for custom Compose start commands, status updates, and UUID boundary matching.
2026-10-09 08:45:32 +02:00
Andras Bacsai ea1199bf8e fix(compose): allow required and alternative variables in network names
Accept the `?`, `:?`, `+` and `:+` interpolation operators in Compose
network names, such as `${CONTAINER_NAME?error}`. The validation added
in v4.4.0 only knew `-` and `:-`, so these valid files stopped deploying.

The text after `?` is an error message and is not used as the default of
the created environment variable. Unsafe operands are still rejected.

Fixes #12126
2026-10-09 08:45:03 +02:00
Andras Bacsai 34366a47b5 fix(infisical): expand secret references when fetching secrets
Older Infisical versions default expandSecretReferences to false, so
values like prefix-${OTHER_KEY} reached containers unexpanded. Request
expanded values explicitly on the v4 endpoint and the v3 fallback.

Fixes #12128
2026-10-09 08:30:00 +02:00
Andras Bacsai 065d4825d3 fix(backups): pin S3 endpoint DNS for mc cp uploads
mc --resolve applies per invocation and is not stored in the alias, so
mc cp resolved the S3 host again inside the helper container. On hosts
with split DNS this failed with "no such host", and the upload did not
use the IP validated by SafeWebhookUrl.

Fixes #12129
2026-10-09 08:29:53 +02:00
Andras Bacsai b39a8e647c fix(ui): center resource table names without a description
Hide the empty description line in the environment resources table so
it takes no space. Names without a description now sit level with the
other cells, and on narrow screens the domain follows the name directly.

Fixes #12127
2026-10-09 08:29:51 +02:00
Andras BacsaiandClaude Opus 5.5 6a0a4e889b fix(github): show why the GitHub App install callback fails instead of a bare 403
The install callback swallowed every verification error (clock skew, network,
missing key, GitHub API errors) and returned an opaque 403. It also compared
the state's team with the session team, so switching teams during the GitHub
install returned 403.

- Return the verification reason, log it, and redirect to the GitHub App page
  with an error toast (JSON requests still get 403 with the reason)
- Check membership of the state's team, and switch the session to it
- Show flashed errors on the GitHub App page

Fixes #12122

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 08:29:39 +02:00
Andras Bacsai d07bc9c0ff fix(docker): preserve resource containers during cleanup 2026-10-09 08:22:08 +02:00
Andras Bacsai df953bdcd1 fix(upgrade): prevent duplicate upgrades and stalled progress polling
Block new upgrades while a recent upgrade is running, allowing retries after 15 minutes without a status update.

Add request timeouts and polling guards to keep upgrade progress responsive during restarts.
2026-10-09 08:01:20 +02:00
github-actions[bot] b89cafebcb Merge remote-tracking branch 'origin/main' into release/v4.5 2026-10-08 16:25:22 +00:00