Commit Graph
17261 Commits
Author SHA1 Message Date
Andras Bacsai 554b79e8dd feat: add Traefik ACME cert UI and shared managed DNS record ownership
- Proxy: list and delete Traefik ACME certificates from the server proxy
  page via new TraefikAcmeService and Get/DeleteTraefikCertificate actions
- DNS: track ownership and cross-resource references for managed DNS
  records so records are only deleted when no longer referenced; release
  records asynchronously on resource deletion via ReleaseManagedDnsRecordsJob
  and ManagedDnsRecordCleanup; harden Cloudflare provider deletion results
- Databases: fail closed on start when prerequisites or the CA certificate
  are missing (DatabaseStartException, Server::ensureCaCertificate) and
  clean up stale start activities via ResourceStartActivity
- Webhooks: throttle repeated manual webhook signature failures for
  GitHub, GitLab, Gitea and Bitbucket
- Deployments: improve compose build-context handling and compose file
  load error reporting
- Install scripts: rework terminal UI output in install.sh (stable and
  nightly)
- Misc: settings sidebar accordion fixes, log drain toggle rollback,
  add Serverside to README sponsors
- Add migrations and tests covering the above
2026-09-25 19:00:00 +02:00
Andras Bacsai 84b596f7ca fix(proxy): only emit Caddy log_append on caddy-docker-proxy 2.9+
Caddy 2.7.6, shipped in the caddy-docker-proxy 2.8 image, rejects the
whole Caddyfile when it contains log_append. Add
Server::caddySupportsLogAppend(), which reads the image from the applied
proxy configuration. Traffic analytics labels now add log_append only
when the server runs 2.9 or newer and has no pending proxy change.

- Change the default Caddy proxy image from 2.8-alpine to 2.13-alpine
- ProxyPortParser now validates Docker Compose port ranges and random
  host ports. It returns only fixed host ports for the availability
  check and has a clearer validation message
- After mkdir, chown only root-owned files and remove other-user access
  from the top directory only. Files owned by container users and the
  modes of mounted files no longer change
- Add tests for log_append support and the new parser/sudo behaviour
- Note in the lessons file that tests must flush the Server identity map
  between dataset cases
2026-09-25 13:59:30 +02:00
Andras Bacsai 82bb574760 fix(servers): stop double sudo on chown/chmod after mkdir
The mkdir ownership rule prepended `sudo` to chown/chmod, and the &&
rule then added another, producing `sudo sudo`. That fails on hosts
like Alpine, where root is not in sudoers. Both parseCommandsByLineForSudo
and parseLineForSudo now leave the prefix to the && rule.

Also:
- Fix the `App\Helpers\SSLHelper` reference in RegenerateSslCertJob to
  `SslHelper`, so it autoloads on case-sensitive filesystems.
- Stop StartPostgresql and StartMongodb from overriding the configuration
  dir with a hardcoded Docker volume path in development.
- Add tests for nested sudo behaviour, the class reference letter case
  and database configuration dirs in development.
2026-09-25 13:15:57 +02:00
Andras Bacsai 3879d82b08 fix(storage): confine remote paths on BusyBox and non-root servers
Replace the `realpath -m` confinement check with a POSIX sh script that
uses `readlink -f`, which BusyBox (Alpine) also provides. The script
walks up to the deepest existing path, resolves it, and appends the
missing rest. It fails closed on dangling symlinks and on `.`/`..` in
the missing part.

Send the script as a single `sh -c '<script>' sh <base> <path>` line so
the non-root sudo parser only adds sudo in front of it and does not
rewrite `$(...)`, `&&` or case statements.

Add unit tests that run the command with GNU and BusyBox tools, as root
and through the sudo parser, against a real symlink tree. Update the
feature test fakes to match the new command.
2026-09-25 12:50:08 +02:00
Andras BacsaiandClaude Opus 5.5 338f1f837f feat(dev): run one isolated dev instance per git branch
Merge scripts/dev-instances into scripts/dev. Each branch gets its own
Compose project, container, volumes, port block, libvirt network, and
KVM VMs, so stop and start reuse the same data and worktrees do not
collide.

- Name instances after the branch; keep slots and APP_KEYs in the main
  checkout's .dev-instances/ so they survive worktree removal
- Reuse existing QEMU VMs instead of recreating them; add dev:qemu --fresh
- Give each instance an isolated libvirt network (10.221.<slot>.0/24)
  and VM names coolify-dev-<branch>--<profile>
- Publish per-instance browser ports and publish them with tailscale
  serve when APP_URL is a tailnet host
- Add urls, exec, logs, container, destroy, and teardown commands; run
  teardown from jean.json before Jean deletes a worktree
- Fix Reverb/terminal browser ports and the testing-host alias in the
  instance compose file
- Keep fresh worktree instances working: pre-create laravel.log, log the
  host dev:qemu call to stderr, and stop Vite from watching vendor/

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 11:55:49 +02:00
Andras BacsaiandClaude Opus 5.5 60bac941ea fix(servers): build only on dedicated build servers
The server role migration gives every normal server the combined role, and
the build server queries counted combined servers as build servers.
"Use a build server" then built on a random production server, the resource
picker listed each server twice, and "Deployments only" did not stop builds.

- Build server selection and the picker use only "Builds only" servers.
  A null role falls back to the legacy is_build_server flag.
- Without a dedicated build server, builds fall back to the deployment
  server, never to another combined server.
- A "Deployments only" server always builds on a build server and needs a
  Docker image name. It never builds itself, except for restarts. Docker
  image and Compose applications are not affected.
- Setting "Deployments only" requires a dedicated build server.
- The API keeps is_build_server in sync with the role for downgrades.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 11:54:00 +02:00
Andras BacsaiandClaude Opus 5.5 9e999a2782 fix(database): restore every supported backup format safely
- Detect the backup format before any database is changed. "All databases"
  imports no longer drop everything when the file cannot be restored.
- PostgreSQL: restore custom and tar archives with pg_restore and SQL with
  psql in both modes, including gzip; restore the #11481 custom-archive fix.
  Replacing existing data recreates the database for SQL backups.
- MySQL/MariaDB: accept a tar with one dump; reject dumps with more than one
  database in single mode instead of restoring them partially.
- MongoDB: restore plain and gzip archives and dump directories packed as
  tar; "Replace collections" maps to --drop.
- Prepare bz2, xz, and zip backups in the helper image, because database
  images do not ship those tools; stream S3 backups from the S3 helper.
- Show the exact restore script in the import form.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 11:32:04 +02:00
Andras Bacsai df692e6278 fix(auth): honor instance registration for non-OIDC OAuth providers 2026-09-25 09:11:55 +02:00
Andras Bacsai 0f41b8e6d9 fix(realtime): preserve proxy routing and browser port settings
Keep the coolify-realtime network alias for existing proxy upstreams, stop overriding PUSHER_PORT, and bind the terminal to port 6002 across production and Windows Compose files. Add regression coverage for these settings.
2026-09-25 08:24:35 +02:00
Andras Bacsai a86188f391 fix(deployment): skip missing Compose Dockerfiles with portable realpath 2026-09-25 08:00:19 +02:00
Andras Bacsai 65365752d7 fix(deployment): skip secret lookup for plain build variables 2026-09-25 07:53:04 +02:00
Andras Bacsai 19744f9c26 fix(env): prevent copying unauthorized and shown-once values
Lock compose variable lookup fields against client changes, check resource update permission before resolving references, and exclude shown-once variables from reference lookup.
2026-09-25 07:30:17 +02:00
Andras Bacsai 9b59acdb55 feat(dev): reuse prepared QEMU images for faster VM startup
Provision Docker once in a prepared image and use a seed ISO for new VMs. Switch development examples to the main branch and refresh service template timestamps.
2026-09-25 07:05:03 +02:00
Andras Bacsai 0935bf141e Improve volume path handling (#11993) 2026-09-24 23:22:35 +02:00
Andras Bacsai 50f49f093e Maintenance updates for 4.4 (#11989) 2026-09-24 23:06:03 +02:00
Andras Bacsai 5721266010 fix(server-transfer): allow local peer targets in development
Route localhost targets through host.docker.internal in containers while continuing to reject other private targets.
2026-09-24 21:28:52 +02:00
Andras Bacsai 24123c0ceb fix(mcp): decouple access from REST API settings 2026-09-24 21:18:31 +02:00
Andras Bacsai f7a05da446 fix(auth): remove email verification notice route 2026-09-24 21:07:47 +02:00
Andras Bacsai d93d90e3b0 Merge remote-tracking branch 'origin/main' into maintenance/control-plane-updates 2026-09-24 19:05:07 +02:00
Andras Bacsai c8dea4badc chore: align account lifecycle 2026-09-24 16:56:38 +02:00
Andras Bacsai 70631d2a11 fix(storage): preserve and display legacy bind mount source paths
Show existing source paths as read-only fields and label bind mounts in deployment configuration. Remove the action that could convert them to named volumes.
2026-09-24 16:49:04 +02:00
Andras Bacsai 2e928d86d8 fix: show Traefik version warnings before detection completes 2026-09-24 16:37:28 +02:00
Andras Bacsai 87685d1e09 chore: align control-plane behavior 2026-09-24 15:46:04 +02:00
Andras Bacsai 2fb8c411e9 fix(analytics): keep setup prompt dismissed after refresh
Give the traffic analytics prompt a stable Livewire key and label the server link “Set up on”. Add a browser test for the link and persistent dismissal.
2026-09-24 15:26:08 +02:00
Andras Bacsai 33eb1dab79 fix(deployments): prevent deployment queue admission races (#11987) 2026-09-24 14:07:21 +02:00
Andras Bacsai c7838c7800 ci(testing-host): publish image only to Docker Hub 2026-09-24 13:48:32 +02:00
Andras Bacsai 3f47bae0b6 fix(service): save switches without saving pending Compose edits (#11985) 2026-09-24 13:43:37 +02:00
Andras Bacsai 803cea718b fix(proxy): name Traefik logrotate sidecar container 2026-09-24 13:15:09 +02:00
Andras Bacsai f35de6b3b2 feat(dev): support KVM-backed localhost development servers 2026-09-24 13:04:44 +02:00
Andras Bacsai c390f72ecf fix(storage): dispatch file saves after commit 2026-09-24 12:51:29 +02:00
Andras Bacsai abab823898 Improve file storage metadata handling (#11983) 2026-09-24 12:31:26 +02:00
Andras Bacsai 4b8c50a546 Improve file storage metadata handling 2026-09-24 12:28:12 +02:00
Andras Bacsai 7165df5123 fix(api): align token permission handling (#11981) 2026-09-24 12:26:53 +02:00
Andras Bacsai 2880a73684 fix(api): align token permission handling 2026-09-24 12:25:46 +02:00
Andras Bacsai 016759f8ab fix(backups): improve backup command handling (#11979) 2026-09-24 12:05:11 +02:00
Andras Bacsai 26248ca161 fix(backups): improve backup command handling 2026-09-24 11:44:53 +02:00
Andras Bacsai 5561247669 Improve deployment log handling (#11974) 2026-09-24 09:41:31 +02:00
Andras Bacsai 50643a44f8 Keep deployment logging available on formatting errors 2026-09-24 09:36:59 +02:00
Andras Bacsai b37d24d258 Improve deployment log value handling 2026-09-24 09:29:23 +02:00
Andras Bacsai ad38f799c1 fix(tags): pass only the tag id when quick adding a tag (#11971) 2026-09-24 08:29:56 +02:00
Andras BacsaiandClaude Opus 5.5 d1b30ce704 fix(tags): pass only the tag id when quick adding a tag
The available tags list now sends only the tag id to the Livewire
action. The component resolves the tag from the current team, so
tag names with special characters, such as apostrophes, work.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 08:26:45 +02:00
Andras Bacsai 0e40632fff Improve database startup progress output (#11970) 2026-09-24 08:25:43 +02:00
Andras Bacsai 25f74da0c9 Improve database startup progress output 2026-09-24 08:24:33 +02:00
Andras Bacsai 74cc617a4c Keep API deployment behavior consistent (#11969) 2026-09-24 08:22:51 +02:00
Andras Bacsai 40b31b4a57 Align API deployment permissions 2026-09-24 08:19:02 +02:00
Andras Bacsai fa9812ed29 Keep server creation consistent across entry points (#11968) 2026-09-24 08:11:10 +02:00
Andras Bacsai 2a3061adf5 Keep server creation consistent across entry points 2026-09-24 08:06:25 +02:00
Andras Bacsai 3549848476 Improve URL address validation (#11967) 2026-09-24 07:13:55 +02:00
Andras Bacsai fa65e4267a Improve team invitation handling (#11966) 2026-09-24 07:12:45 +02:00
Andras Bacsai c158957e18 Improve URL address validation 2026-09-24 07:11:06 +02:00