Deployment types

Deploys.app runs five kinds of workloads. The type you pick decides whether the platform gives you a public URL, opens a TCP port, runs you on a cron schedule, or just keeps you running quietly in the background.

At a glance#

TypeAPI stringInboundSchedulingUse it for
Web serviceWebServiceHTTPS on a managed hostnameAutoscales between replica boundsInternet-facing apps and APIs
WorkerWorkerNoneAutoscales between replica boundsBackground processors, queue consumers
Cron jobCronJobNoneCron schedule, exits when donePeriodic tasks (cleanup, sync, snapshot)
TCP serviceTCPServiceRaw TCP on an external portAutoscales between replica boundsNon-HTTP protocols you need exposed
Internal TCP serviceInternalTCPServiceTCP inside the cluster onlyAutoscales between replica boundsDatabases, caches, and other in-cluster traffic

Web service#

The default. The platform terminates TLS, gives you a managed hostname (<name>.<project>.<location-suffix>), and routes traffic to your container’s port on the protocol you pick (http, https, or h2c).

Set internal: true to keep a Web Service inside the cluster — same HTTP routing, no public hostname.

deploys deployment deploy \
  --project acme --location gke.cluster-rcf2 \
  --name web --image nginx:1.27 \
  --type WebService --port 80 \
  --minReplicas 1 --maxReplicas 5

Worker#

No inbound traffic, no port. The container runs continuously and is restarted if it exits. Use it for queue consumers, background processors, or anything that pulls work from somewhere else.

deploys deployment deploy \
  --project acme --location gke.cluster-rcf2 \
  --name worker --image registry.deploys.app/acme/worker:v1.8.0 \
  --type Worker --minReplicas 1 --maxReplicas 2

Cron job#

Runs on a schedule, exits, waits for the next firing. The schedule is a standard 5-field cron expression in UTC.

deploys deployment deploy \
  --project acme --location gke.cluster-rcf2 \
  --name nightly-cleanup --image acme/cleanup:v1 \
  --type CronJob
# then set the schedule with the deployment.deploy API or the deploy form

In the deploy form, the Schedule field is enabled when Type = CronJob. The form accepts the same cron expression — e.g. 0 3 * * * for “every day at 03:00 UTC.”

TipNeed a job that runs once and exits — not on a schedule? Use a Worker with a ttl so the platform auto-deletes it after the duration you set.

TCP service#

Use for protocols that aren’t HTTP — game servers, custom binary protocols. You pick the port; the platform exposes it on an external load balancer. Routes don’t apply (those are HTTP-only); clients connect directly to the service’s address.

Internal TCP service#

Same as TCP service, but reachable only from inside your project’s cluster (other deployments in the same location). Useful for self-hosting datastores that should never be exposed publicly.

deploys deployment deploy \
  --project acme --location gke.cluster-rcf2 \
  --name postgres --image postgres:16 \
  --type InternalTCPService --port 5432

Inside other deployments in the same location, reach it at postgres.acme.svc.cluster.local:5432.