Commit graph

15712 commits

Author SHA1 Message Date
Andras Bacsai
beaad0a722 Refine service resource routing 2026-05-22 13:39:26 +02:00
Andras Bacsai
a39639306b
Harden token permission handling (#10355) 2026-05-22 13:18:05 +02:00
Andras Bacsai
7f135e0f6d Harden token permission handling 2026-05-22 13:12:17 +02:00
Andras Bacsai
095a1f0db0
Fix source selection flow (#10354) 2026-05-22 13:02:11 +02:00
Andras Bacsai
e9b8320d5f Fix source selection flow 2026-05-22 13:00:53 +02:00
Andras Bacsai
783344c875
fix(environment): scope DeleteEnvironment lookups to current team (#10349) 2026-05-22 12:57:57 +02:00
Andras Bacsai
7ea1bac4ef
fix(destination): scope server and network selection to current team (#10352) 2026-05-22 12:55:56 +02:00
Andras Bacsai
59111e8cf3 fix(destination): scope server and network selection to current team
Resolve the server and network in Destination::addServer() and
::promote() through ownedByCurrentTeam() before use, authorize the
update against the resource, and pass the validated IDs into
attach()/detach()/update(). Errors are routed through handleError()
to match the sibling removeServer() method.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:53:14 +02:00
Andras Bacsai
36526928df feat(sentinel): deduplicate metrics push processing
Move Sentinel push handling into a controller and dispatch server update jobs only when container state changes or the force interval elapses. Add opt-in PostgreSQL read/write replica configuration and tune periodic proxy network and storage checks to reduce unnecessary work.

Add feature coverage for replica config, Sentinel push deduplication, deployment log scrolling, and server update job optimizations.
2026-05-22 12:48:48 +02:00
Andras Bacsai
5e0e6772d5 fix(deployments): load realtime assets without Vite
Remove unused Vue, Echo, Pusher, and ioredis npm dependencies from the frontend build. Update realtime scripts and deployment log markup to work without bundling those assets through Vite.
2026-05-22 12:48:48 +02:00
Andras Bacsai
df166ac689 fix(environment): scope DeleteEnvironment lookups to current team
Scope DeleteEnvironment::mount() and delete() lookups through
Environment::ownedByCurrentTeam() so an environment_id that belongs to
another team resolves to a 404 instead of loading the foreign record.
Mark $environment_id as #[Locked] so the public Livewire property can no
longer be reassigned from the client.

Add tests/Feature/DeleteEnvironmentTeamScopingTest.php covering mount,
delete, the #[Locked] guard, and the team-scoped helper for both the
cross-team and own-team cases.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:37:48 +02:00
Andras Bacsai
d55e3de3bc
fix(source): scope private key and source selection to current team (#10348) 2026-05-22 12:31:03 +02:00
Andras Bacsai
5dda39e588 fix(source): scope private key and source selection to current team
The Source component now resolves the supplied private key and Git
source IDs through team-scoped queries before persisting them, so a
selection can only ever reference a resource owned by the current
team. The source type is additionally restricted to the supported
GitHub/GitLab app classes.

The privateKeyId property is marked #[Locked] so it can only change
through the dedicated handler rather than a direct property update.

Adds feature tests covering team-scoped selection of private keys and
Git sources.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:30:00 +02:00
Firsak
d415f3a3d1 fix(team): prevent 500 after deleting the current team
When a user deletes their current team, the session and cache still
reference the just-deleted team. `refreshSession()` then resolves that
stale team via `currentTeam()`, calls `Team::find()` (which returns
null because the row is gone) and dereferences `$team->id`, leaving the
session without a current team. The subsequent redirect to the team
page assigns the now-null `currentTeam()` to the non-nullable
`Team $team` property in `Team\Index::mount()`, throwing a TypeError
and producing an HTTP 500.

Guard `refreshSession()` against a deleted current team: fall back to
any team the user still belongs to, and if none remain, clear the
stale session reference instead of dereferencing null.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 11:06:32 +02:00
michalzard
9b977b9e4d chore(gitea-runner): bumped version to 1.0.5 2026-05-21 19:59:14 +02:00
Andras Bacsai
b124397613 fix(schedule): prevent duplicate SSL certificate regeneration
Run RegenerateSslCertJob on one server only and add coverage to ensure scheduled production jobs use onOneServer.
2026-05-21 19:19:43 +02:00
Andras Bacsai
0c7fcffa01 version update 2026-05-21 13:08:15 +02:00
Andras Bacsai
de87624a72 chore(deps): update composer lock dependencies 2026-05-21 13:07:27 +02:00
Aditya Tripathi
7a3fcd37d5 fix(livewire): scope DatabaseProxyStopped to proxy fields, harden status trait
Clickhouse, Dragonfly, and Keydb still called syncData() inside the
DatabaseProxyStopped broadcast handler, clobbering in-progress edits to
name/description/credentials. Refresh only is_public/public_port/
public_port_timeout instead, matching the pattern used elsewhere.

Also null-guard HasDatabaseStatusInfo::getListeners() against an absent
Auth::user()/currentTeam(), add explicit return types on getListeners()
and render(), and convert inline comments in the SSL refresh test to a
PHPDoc block.
2026-05-21 10:24:49 +00:00
Aditya Tripathi
e7e65831a7 fix(livewire): preserve wire:dirty across DB status broadcasts
The earlier refreshStatus fix kept user-typed values intact but Livewire still
absorbed deferred wire:model values into the snapshot on every broadcast-
triggered roundtrip, clearing the unsaved-changes indicator and making the form
look auto-saved. Move all status-derived display (DB URLs, SSL toggle/mode,
cert expiry) out of each DB General form into a sibling StatusInfo Livewire
component, so the form never roundtrips on broadcasts.

Shared scaffolding lives in App\Traits\HasDatabaseStatusInfo plus an x-database-
status-info Blade component, leaving each per-DB StatusInfo class as a ~20-50
line declaration of label, SSL mode options, and SSL save hooks. Parents
dispatch databaseUpdated from save methods so the sibling refreshes after writes.

Tests cover the architecture (no DB form subscribes to status broadcasts) and
the sibling's refresh-on-status-change behavior.
2026-05-21 08:31:08 +00:00
Aditya Tripathi
9aee01d5a0
Merge branch 'next' into fix/form-state 2026-05-21 00:49:29 +05:30
Aditya Tripathi
b9f773c1d9 fix(livewire): stop broadcast handlers from wiping in-progress form input 2026-05-20 19:04:43 +00:00
Andras Bacsai
077c68e4c4 docs(readme): remove Context.dev sponsor 2026-05-20 16:44:18 +02:00
toanalien
9264f391cb fix(templates): address review feedback for hermes-agent template
- Remove top-level volumes block (Coolify auto-generates it)
- Remove redundant restart: unless-stopped (Coolify default)
- Rename hermes-agent.yaml to hermes-agent-with-webui.yaml
2026-05-20 12:04:26 +07:00
toanalien
597a2d806f fix(templates): correct image tags for hermes-agent and hermes-webui
Pin hermes-agent to sha-273ff5c (no semver tags on Docker Hub).
Fix hermes-webui tag from v0.51.92 to 0.51.92 (GHCR has no v prefix).
2026-05-20 01:05:14 +07:00
michalzard
d8cf488449 chore(gitea-runner): bumped patch version
fix: reverted quote autoformat
2026-05-19 19:27:41 +02:00
toanalien
70c187ea40 fix(templates): add hermes-agent logo and mount agent-src read-only
Add official Hermes Agent logo (256x256 PNG from upstream repo).
Mount hermes-agent-src volume as read-only in webui container per
upstream recommendation (since v0.51.84).
2026-05-19 19:00:41 +07:00
toanalien
b64968d503 fix(templates): pin image versions and fix magic variable for hermes-agent
Address PR review: pin Docker images to v0.14.0 and v0.51.92,
change SERVICE_FQDN to SERVICE_URL (generator auto-converts).
2026-05-19 18:55:11 +07:00
ShadowArcanist
e7853656c3
fix(service): pin image to static version for open observe 2026-05-19 16:40:18 +05:30
Andras Bacsai
65c0c92c02 fix(destinations): handle empty and server-scoped destinations
Build the global destinations list from actual destination records so empty
servers do not render duplicate empty states. Allow creating Docker destinations
for a selected team server outside the global usable list, authorize swarm
creation correctly, and store discovered swarm network names from the selected
network. Add feature coverage for empty states, selected-server mounting, and
swarm destination creation.
2026-05-19 12:50:08 +02:00
Alexandru Furculita
978d46739d
feat(service): add openobserve template
Adds OpenObserve as a one-click service template. OpenObserve is a
cloud-native observability platform for logs, metrics, traces, RUM and
session replays, positioned as a self-hosted alternative to Elasticsearch,
Splunk and Datadog.

- Uses the official open-source image (public.ecr.aws/zinclabs/openobserve)
- Wires admin password through Coolify's SERVICE_PASSWORD_* magic env
- Persists /data via a named volume
- Exposes port 5080 via SERVICE_URL_OPENOBSERVE_5080
- Opts out of telemetry by default (overridable via ZO_TELEMETRY)
- Adds /healthz healthcheck and the OpenObserve logo

Supersedes #6328, addressing the prior review feedback (drop the
deprecated version key, drop hardcoded container_name and restart
policy, switch to the magic password env, and use a named volume).
2026-05-19 12:26:09 +03:00
Andras Bacsai
49656aa1ed
v4.1.0 (#9841) 2026-05-18 10:59:37 +02:00
Andras Bacsai
a67cc1d3a9 docs(readme): fix PrivateAlps sponsor wording 2026-05-18 10:17:33 +02:00
Andras Bacsai
270e34fa71 chore(versions): bump helper and realtime images 2026-05-18 08:44:50 +02:00
Tam Nguyen
bce0c51d37
fix: cloudflare-ddns 1.16.2 2026-05-18 15:42:31 +10:00
Khiet Tam Nguyen
9e9fc01b52
Merge branch 'next' into cloudflare-ddns 2026-05-18 15:04:55 +10:00
Tam Nguyen
7dd6d2b13c
deps: bump cloudflare-ddns to v2.1.2 2026-05-18 14:52:15 +10:00
Khiet Tam Nguyen
919295e9ed
Merge branch 'coollabsio:v4.x' into cloudflare-ddns 2026-05-18 14:48:42 +10:00
Mohmmad Qunibi
5b854d700e
Merge branch 'next' into add-emqx-as-a-service-template 2026-05-17 10:25:54 +03:00
Andras Bacsai
6ceb444cf4 fix(docker): remove default nginx configs
Delete the packaged nginx config files after installing nginx so the
image uses the application-provided configuration.
2026-05-16 20:09:25 +02:00
Andras Bacsai
0917bb7b8e fix(docker): install patched nginx from official repository
Pin nginx to the official nginx.org Alpine mainline package in development and production images so patched releases can be installed consistently.
2026-05-16 19:06:39 +02:00
toanalien
8c0ecedda4 feat(templates): add Hermes Agent + WebUI one-click service
Two-container template: hermes-agent gateway plus the hermes-webui chat
UI. The WebUI is public-facing (gets the generated FQDN and password via
Coolify magic vars); the agent stays internal, sharing named volumes.
Hermes uses embedded SQLite, so no external database is needed.
2026-05-16 08:40:10 +02:00
Andras Bacsai
bba0cd76d2 docs(readme): remove CubePath sponsor entry 2026-05-15 13:41:54 +02:00
Andras Bacsai
fde500a347 fix(templates): require Docmost mail driver
Require MAIL_DRIVER to be set before Docmost starts and add a unit test to keep the compose template and generated service templates in sync.
2026-05-15 13:36:02 +02:00
Mohmmad Qunibi
3898860478
Merge branch 'next' into add-emqx-as-a-service-template 2026-05-14 16:42:03 +03:00
Andras Bacsai
52e60f1dcc Merge remote-tracking branch 'origin/next' into next 2026-05-13 10:56:44 +02:00
Andras Bacsai
7056a1cae1 chore(helper): bump railpack and mise versions 2026-05-13 10:50:50 +02:00
Andras Bacsai
4ff3e4b2be
feat(deployments): track application configuration diffs (#10183) 2026-05-13 10:49:53 +02:00
Andras Bacsai
76c8defef3
fix(api-tokens): persist expiration warning state (#10184) 2026-05-13 10:43:50 +02:00
Andras Bacsai
1522c510cf fix(api-tokens): mark expiration warning after notification
Ensure failed token expiration warning notifications do not persist the warning marker, allowing the job to retry later.
2026-05-13 10:28:32 +02:00