Skip to content

feat: prebuilt images + pull-only hosted compose + unattended cloud-init first boot — the gate for every one-click / marketplace channel #2280

Description

@vybe

Summary

Publish prebuilt Trinity images (platform services and the agent base image) to a public registry on every release, ship a pull-only hosted compose file, and make first boot fully unattended from cloud-init — so a fresh VM comes up serving Trinity in ~2 minutes with no on-box builds. This is the prerequisite for every one-click / marketplace channel (DigitalOcean, Vultr, Hostinger, Elestio, Dokploy, and the #835 Packer image).

Context

Today scripts/deploy/start.sh builds the agent base image on the host (scripts/deploy/build-base-image.sh → docker/base-image/Dockerfile, 5–10 minutes) and docker-compose.prod.yml uses build: blocks — no workflow pushes images to a registry. A marketplace 1-click that spends ten minutes compiling on first boot fails the "one click" bar, and managed hosts (Elestio) and template catalogs (Dokploy/Coolify/Hostinger Docker Manager) only accept pull-only compose files.

Findings from the 2026-08-18 hosting-channels research: every VM marketplace already ships Docker-socket-mounting apps (Coolify, CapRover, Dokku, OpenClaw), so Trinity's shape is accepted; the only blocker is packaging. #835 (Packer image for GCP + Hetzner) becomes thin once images are prebuilt — its "clone to /opt/trinity and build" acceptance criteria should be revisited to depend on this issue.

Acceptance Criteria

  • A release workflow publishes versioned + latest images for backend, frontend, mcp-server, scheduler and the agent base image to a public registry (e.g. GHCR); multi-arch (amd64 required, arm64 desirable — Hetzner CAX / Umbrel).
  • A docker-compose.hosted.yml (name TBD) pulls those images only — no build: blocks — and works with the same .env contract as docker-compose.prod.yml.
  • start.sh --unattended (or the hosted compose) never asks for input: SECRET_KEY/INTERNAL_API_SECRET/ADMIN_PASSWORD auto-generated when absent and printed once; the setup form is never reachable unauthenticated on a public IP (either the admin exists at boot or the form is bound to a one-time token).
  • A cloud-init user-data example (extend trinity-ops-public/provision/cloud-init.sh) takes admin password / domain / optional Cloudflare Tunnel token and results in a serving instance; documented in docs/DEPLOYMENT.md.
  • TLS story for a bare VM without a tunnel is decided and documented (Caddy sidecar or documented tunnel-only) — no HTTP-only default on a public IP without a stated warning.
  • Minimum size stated wherever the hosted compose is documented: 8 GB RAM.
  • docs/AGENT_INSTALL_GUIDE.md and docs/DEPLOYMENT.md reference the pull-only path as the default for servers.

Technical Notes

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions