feat(projects): install services from Coolify templates - #855
Conversation
📓 Changelog previewThis is what your commits will add to the generated ## [Unreleased]
### Added
- **projects:** Install services from Coolify templates
- **service-templates:** Mark catalog beta and classify host access
- **service-templates:** Track anonymous install outcomes
- **compose:** Show retained container logs inline
- **deployments:** Prioritize concise failure diagnostics
- **deployments:** Retain failed app containers for logs
### Fixed
- **projects:** Harden service template installs
- **deployments:** Harden compose service lifecycle
- **deployments:** Harden compose revisions and monitoring
- **deployments:** Serialize compose lifecycle transitions
- **service-templates:** Improve compose install compatibility
- **compose:** Retain failed containers for debugging
- **compose:** Label inline retained logs
- **compose:** Preserve image-owned init processes
- **compose:** Detect runtime compatibility generically
- **service-templates:** Use responsive catalog pagination
### Refactor
- **web:** Use generated compose source client
### Testing
- **migrations:** Verify compose source rollback
- **migrations:** Assert compose source ordering
- **migrations:** Preserve creator rollback coverage |
Greptile SummaryThe latest head completes the service-catalog pagination migration and strengthens install-plan snapshot binding across preflight, project creation, and the first Compose save.
Confidence Score: 5/5The PR appears safe to merge because no blocking failure remains. No blocking failure remains.
|
| Filename | Overview |
|---|---|
| web/src/components/service-templates/ServiceTemplateCatalog.tsx | Integrates shared pagination and digest-bound install retries; no blocking failure remains. |
| web/src/components/service-templates/ServiceCatalogPagination.tsx | Wraps ResponsivePagination with the fixed catalog page size and required mobile and desktop controls. |
| crates/temps-projects/src/handlers/service_templates.rs | Enforces the expected install-plan digest during service-template preflight. |
Reviews (15): Last reviewed commit: "fix(service-templates): use responsive c..." | Re-trigger Greptile
41d6060 to
38e26a1
Compare
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
ad9ecef to
2c4256e
Compare
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Follow-up evidence: failed Compose container retentionCommit Runtime behavior
Slot-12 browser + database QAControlled Compose deployment The retained candidate has no public route. The QA screenshots were captured locally as:
VerificationSecurity re-review: APPROVED, no findings. The auditor verified exact ownership re-checks, independent cleanup of unsafe candidates, transactional route invalidation, and the deployment-scoped authenticated log path. |
Signed-off-by: David Viejo <dviejo@kfs.es>
Evidence — inline retained-container logsBrowser/runtime: expanded Screenshot: Regression test: Full frontend suite:
|
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Evidence — Budge/LinuxServer PID 1 compatibilityCatalog + deployer regressions: new LinuxServer installs persist cargo test -p temps-deployer test_explicit_init_false_keeps_sandbox_but_does_not_wrap_image_init --lib -- --nocapture
cargo test -p temps-projects linuxserver_templates_keep_s6_as_pid_one --lib -- --nocapture
cargo test -p temps-projects recognizes_supported_linuxserver_image_repositories --lib -- --nocaptureActivepieces regression: its one-click plan still requests the known startup capability profile and uses the application health endpoint. cargo test -p temps-projects activepieces_uses_application_healthcheck_and_startup_permissions --lib -- --nocaptureRuntime proof: launched the exact The disposable container, network, and volume were removed afterward. The existing failed Budge project was not modified. Affected crate suites and static gates Security review: no findings. Evidence — concise failure diagnosticsThe deployment failure banner now omits embedded container logs by default, offers “Show full error,” and keeps retained live container logs directly below the banner. Screenshot: |
Signed-off-by: David Viejo <dviejo@kfs.es>
Signed-off-by: David Viejo <dviejo@kfs.es>
Keep failed application containers ownership-scoped and unrouted so their runtime logs remain available from the deployment page and CLI. Clean them after the next successful deploy with bounded, fair retries, including remote-node failures. Signed-off-by: David Viejo <dviejo@kfs.es>
4febbcd to
93cc494
Compare
Reuse the shared pagination contract so mobile users retain labeled navigation and stable page context. Document that revision-preflight rejection stops slug-conflict retries before a stale install plan can create another project. Signed-off-by: David Viejo <dviejo@kfs.es>
|
@greptile-apps please review the latest head. The remaining pagination finding is fixed in |
Summary
Current tested catalog snapshot: 342 total / 23 standard / 247 elevated / 48 host access / 24 other blocked. That leaves 270 currently installable templates. Host-access entries remain blocked pending a separately reviewed administrator-controlled integration.
Product behavior
${VAR?}or${VAR:?}.redis-service:6379remain endpoints and are not converted into random passwords. Generated usernames use service-aware defaults:postgres, Redisdefault, otherwiseadmin./apprise-api/config:/configare converted to project-owned named volumes. Docker sockets, system paths, host namespaces, devices, privileged mode, external resources, and guarded interpolation remain blocked.utm_source.Architecture and safety
docker compose config --quietwith final values before project creation in an environment-cleared, concurrency-limited subprocess. A SHA-256 digest binds preflight to the complete install plan.privileged=false,cap_drop=ALL,no-new-privileges, and a PID limit.CHOWN,DAC_OVERRIDE,FOWNER,SETUID, andSETGIDfor explicitly confirmed services.See
docs/adr/040-runtime-service-template-catalog.mdfor the architecture anddocs/release-testing.md#12-service-template-catalog-betafor the Beta/stable QA gate.Activepieces failure: root cause and fix
Activepieces logged missing
pieces-frameworkandpieces-commondirectories, but its own log classified both errors as non-fatal. The Node API then listened on port 3000 and its worker connected.The real failure was the bundled nginx process. Temps correctly applies
cap_drop=ALL; Activepieces' nginx starts as root and needs tochownruntime paths and switch user before serving port 80. Reproduction under the Temps sandbox failed with:The catalog now recognizes only the exact official
activepieces/activepiecesandghcr.io/activepieces/activepiecesrepositories (after conservative tag/digest removal), requests the existing limited profile after explicit confirmation, and rewrites the upstream static/probe to Activepieces' application endpoint/api/v1/health.Negative tests prove lookalike repositories, custom registries,
docker.ioprefixes, and whole-image interpolation do not inherit this exception.Real slot-12 deployment evidence:
Anonymous install telemetry
The deployment funnel carries safe template provenance:
deploy_attempteddeploy_succeededdeploy_failedwith fixedfailure_stage,failure_code, and classifier versiondeploy_cancelledwith a fixed triggerAttribution is server-controlled and source-bound. Project creation stores a temporary marker only after validating the provider, canonical catalog URL, and complete install-plan digest against the live catalog. The first immutable Compose save must exactly match the server-prepared bytes before provenance is promoted; a mismatch clears it permanently.
Telemetry never includes Compose YAML, project IDs/names, repositories, domains, environment variable names/values, raw errors, or private/operator-defined slugs. It remains globally opt-out and never affects deployment behavior.
Runtime issues resolved
Security review
Security auditor: APPROVED, no findings.
The review verified exact Activepieces image matching, explicit confirmation, the fixed capability allowlist, continued rejection of host access, and structured loopback-only healthcheck generation. No shell/YAML injection, SSRF, host-access broadening, or interpolation bypass was found.
Verification
Browser QA against
http://localhost:3012verified the Beta entry point, catalog counts, debounced search focus, category/tags, host-access blocking, one required permission checkbox, editable generated inputs, Compose inspection, Activepieces installation, deployment logs, container health, public routing, and monitor convergence.Release position
This should ship as Beta, not Stable. Stable graduation requires continuous catalog qualification, multi-architecture cold-install coverage, a seven-day staging soak, lifecycle/security E2E coverage, and at least 95% of installable entries completing three clean installs with working routes, logs, health, monitor convergence, redeploy, and cleanup.
Attribution
The catalog is attributed to Coolify and links to its Apache-2.0 repository plus each service's documentation. Installed projects are independent, editable Temps Compose projects; origin metadata is informational and does not create runtime coupling.
Failed application container diagnostics
Failed single-container application deployments now receive the same diagnostics behavior as failed Compose stacks:
Runtime and regression evidence:
Security auditor: APPROVED. It specifically verified unrouted ownership scoping, private-only remote bindings, node-aware deletion, and fair bounded cleanup retries.