Providers
shipped 1.0.0A provider is how an environment’s host answers four questions: how files
move, how a command runs remotely, how a shell opens and what a restore point
is. Four ship: cloudron, ssh, ftps/sftp and local.
Choose your host is the practical version: what
each one needs in cwp.yml and what changes between them. This page is about
the seam itself.
The rule the seam enforces
Anything that differs per host lives behind the provider, and nowhere else.
An if (provider === "cloudron") inside an operation fails a structural test.
What that buys is visible from outside: no command asks for a host you are not
using. cwp init on an ssh project needs no Cloudron CLI, and cwp doctor
checks the host this project names and no other. A tool that gated work behind a
login it never needed would read as “this does not support my host”, and would be
right about the wrong thing.
Where it pays
An abstraction that only generalises is a cost. Two behaviours make this one worth having, and both are visible in the commands rather than in the source:
backup: nonemakes cwp refuse an upward write, not silently skip it. The provider declares the capability, and a host that cannot take a restore point does not quietly get a shorter guard ladder. The operator decides, in the open. Onlylocalsaysnone: the two hosts that have no backup command of their own answersynthetic, and cwp assembles a dump and an archive where there is nothing to ask.cwp push --dry-runonsshgives a real file-level diff, because rsync has one. Same command, sharper plan, and no branch anywhere in the operation that produces it. The operation asks the provider whether it can dry-run a transfer, and prints what comes back.- A host that runs no commands answers through the capability, not through a
failure.
commandsisshell,agentornone, and an operation that needs WordPress asks before it starts. On shared hosting the answer isagent: cwp installs a signed PHP file for the length of the run, calls it over HTTPS, and removes it at the end.cwp shell,cwp logsandcwp wprefuse there and say why; everything cwp wraps keeps working.
The Cloudron dry run therefore says, in as many words, that a file-level diff is not knowable rather than printing an empty one:
? file-level diff — the cloudron provider has no transfer dry run, so what
differs is only knowable by sending it
What is not extensible
There are no third-party providers. All four come compiled in, chosen by configuration; there is no registration, no discovery and no plugin API. A fourth host means a change to this repository. A provider has production in its hands, and there is no way to grant that to something loaded at run time.