Deplo

Object types

Every object a query, mutation or subscription can return, with its fields.

Every object type in the schema, A to Z. Pick fields from these tables when you write a selection set. A field that takes arguments lists them in its description.

AccessNodeGrant

A capability set attached to one project, folder or app. It REPLACES the team role's set inside that node, and may grant more than the role does.

FieldTypeDescription
capabilities[Capability!]
kindAccessNodeKind
nameString
nodeIdID

Activity

A single audit-log event in the active team's timeline.

FieldTypeDescription
actorString
actorProviderStringThe git host actor is a login on, when a webhook push wrote this row (github, gitlab, bitbucket, gitea). Null for a person on this instance and for an actor with no host, like system.
actorUserVarAuthor
actorUserIdID
appIdID
createdAtString
cursorString
databaseIdID
idID
messageString
teamIdID
typeActivityType

AddServerPayload

A newly registered server + its one-time agent install command.

FieldTypeDescription
installCommandStringPaste-on-the-server command to provision the agent. Shown once; embeds a single-use token.
serverServer

ApiToken

A PERSONAL API token: it belongs to the person who minted it, and nobody else can list, edit or revoke it. Only the prefix is ever exposed - the raw token is shown once at creation and only its hash is persisted.

FieldTypeDescription
appIds[String!]Individually-named apps in the scope.
capabilities[String!]What this token itself may do. Its effective power is this set intersected with what its creator can still do in the team, so a token can never outlive the access of the member who minted it.
createdAtString
expiredBooleanWhether the expiry above has passed. Answered by the server, so a client with a wrong clock cannot disagree about whether a credential still works.
expiresAtStringWhen this token stops working. Null means never, which is what a token minted before expiries existed still is. An expired token resolves to nothing everywhere - the API, MCP and deploy hooks alike.
folderIds[String!]Whole folders in the scope: every app in them and in the folders nested under them. Most apps live in a folder, so this is usually the level a scope is drawn at.
idID
instanceAdminBooleanThe token may administer the whole instance (users, servers and the global environment), not just its team. Mutually exclusive with a project scope.
lastUsedAtString
mcpBooleanWhether this credential drives Deplo over MCP: minted by approving an OAuth consent, or a bearer token that has already called the MCP server. The question a company asks is which of its tokens an AI agent holds, and either shape answers yes.
nameString
oauthClientNameStringSet when this token was minted by connecting an AI client over OAuth rather than from the tokens page. updateToken re-authors it like any other: the client sees the new permissions on its next call.
prefixString
projectIds[String!]Whole projects in the scope: every app in them, now and later. Naming one narrows the token inside that team, so the team-wide permissions it holds (managing members, roles, databases) stop applying there.
scopedBooleanWhether this token is limited at all. False means every team its owner may use API tokens in, and everything in it.
teamIds[String!]Whole teams in the scope: every project and every app in them.

App

A deployable application owned by a team.

FieldTypeDescription
autoDeployBoolean
buildFallbackBooleanBuild somewhere else when this app's build server cannot be reached, saying so in the deploy log: the servers marked as a build fallback (the Deplo host by default), then the app's own server. True by default. False fails the deploy instead, for whoever chose a small deploy server on purpose.
buildServerIdIDThe server that BUILDS this app's image, when that is not serverId. Null is Automatic: a build-only server if the fleet has one this team can reach and its architecture matches, otherwise build where the app runs. Setting it to serverId means 'always build on this app's own server'. Ignored by a compose stack and a docker-image source, neither of which Deplo builds.
composeString
composeUpArgsStringExtra flags this app appends to the docker compose up that brings it up, or null for the untouched command. Additive only - the flags that choose the project, stack file or env-file are refused.
createdAtString
dataCopyErrorStringWhy this app's data did not arrive, when a migration tried to copy it and could not. Empty for every app that was never migrated and every copy that worked. While it is set, deploying and starting this app are refused - its volumes are empty or half written - and deployWithoutMigratedData is how someone accepts that and unblocks it.
deployHookEnabledBooleanWhether this app's deploy hook answers. The hook URL itself is never a field - read it back with revealAppDeployHook.
deployments[Deployment!]The app's most recent deployments, newest first (capped so a nested query can't fan out over the whole history + per-deployment logs).
dockerImageString
domainCountInt
folderIdID
frameworkStringThe JavaScript framework backing this app ("nextjs", "astro", "nestjs", ...), or null when none was found or the app doesn't build with one of the auto-detecting builders (Nixpacks / Railpack). Detected on every deploy, unless setAppFramework has corrected it - in which case that choice is what this returns.
frameworkDetectedStringWhat the LAST DEPLOY actually read from the source, ignoring any correction. Equals framework unless the user overrode it.
healthCheckHealthCheckThe health check baked into this app's compose, or null when it has none.
idID
latestDeploymentDeployment
logoString
nameString
ports[PublishedPort!]Host ports this app publishes. Empty for a compose stack, which publishes its own in its compose file.
productionUrlString
projectIdIDThe Project container this app belongs to, if any.
resourcesResourceLimitsPer-app resource caps applied at deploy time, or null when the app has no limits set.
rollbackKeepIntHow many previous deployments this app can be rolled back to (0-20, default 3). Retention: its server keeps this many of the app's images behind the running one. 0 means there is nothing to go back to.
serverIdID
slugString
sourceDeploySource
statusAppStatus
teamIdID
updatedAtString
volumes[Volume!]Persistent volumes mounted into this app.

AppEnvGroup

One app together with all of its env vars.

FieldTypeDescription
appAppEnvGroupApp
vars[EnvVar!]

AppEnvGroupApp

FieldTypeDescription
idID
nameString
slugString

AppPreview

An ephemeral deploy of one App for one open pull request, running as its own stack deplo-<slug>__pr-<n> with its own URL. Not an App and not an Environment.

FieldTypeDescription
appIdID
approvedBooleanA fork's pull request only builds once a member with deploy approves it.
approvedShaString
authorString
baseBranchString
closedBoolean
createdAtString
headBranchString
headRepoString
hostString
idID
isForkBooleanThe head lives in a repository the operator does not control, so its code is untrusted and it never receives secret-typed variables.
latestDeploymentIdID
prNumberInt
pullRequestUrlString
statusStringblocked | queued | building | active | error | idle.
titleString
updatedAtString
urlString

AppPreviewsView

Everything the Pull requests page renders in one read: whether previews can work at all, the branch they watch, the app's settings, and the previews.

FieldTypeDescription
appIdID
autoDeployBoolean
baseDomainString
branchStringPull requests must target this branch to get a preview.
buildDraftsBoolean
commentBoolean
enabledBoolean
forkPolicyString
githubSettingsUrlString
httpsBoolean
maxActiveInt
portInt
previews[AppPreview!]
requiredLabels[String!]
serverIdString
ttlDaysInt
unavailableStringnull => previews work. Otherwise the ONE reason they cannot: not-github | no-installation | app-needs-update | disabled.

AppRuntime

What an app's containers are ACTUALLY doing on the host, read live from the owning agent. App.status only records the last thing the control plane asked for (deploy / start / stop), so it keeps saying 'active' for an app that has been crash-looping since its deploy succeeded.

FieldTypeDescription
containers[RuntimeContainer!]
missing[String!]Declared services with NO container on the host - the failure the running/total counts cannot see, because a container that was never created is not there to be counted as stopped.
restartingInt
runningInt
totalInt
unhealthyIntContainers that are running and failing their own healthcheck - up, listening, and broken.
unreachableBooleanThe agent did not answer: the counts are unknown, not zero.

AppSharedVar

A shared variable as seen from one app. linked is the explicit opt-in (the only thing that injects - ADR-0012); inScope/scope say whether an availability scope suggests it here.

FieldTypeDescription
autoInjectBooleanIt lands here with no link and cannot be removed from this app.
idID
inScopeBooleanAn availability scope (team / environment / project) covers this app.
keyString
linkedBooleanThe app opted in - the var injects on its next deploy.
maskedBoolean
ownerTeamNameStringThe team behind an auto-injected variable.
scopeStringThe most specific covering scope: teamWide | environment | project.
targets[EnvTarget!]
typeEnvVarType
updatedAtString
updatedByVarAuthor
valueStringMasked for secrets, like SharedVar.value.

AppStorageFile

The file behind a File storage entry, where a path that does not exist yet is a normal answer rather than an error.

FieldTypeDescription
pathString
stateString
textString

AppTransferInfo

What a transfer of this app would cost, plus the teams that could take it.

FieldTypeDescription
appNameString
backupCountIntBackup schedules targeting this app - removed on transfer, because they point at the current team's backup destination.
gitConnectionLabelStringThe git connection authenticating this app's clone, or null. It is always dropped on transfer - a token is owned by the current team and cannot be assumed to reach the repository from another one.
githubConnectedBoolean
homeLabelStringWhere the app currently sits in its team ("folder Marketing"), or null at the top level. It leaves that home on transfer.
serverNameString
sharedVarCountIntShared variables linked to this app. The links do not survive the move (the variables belong to the current team).
targets[AppTransferTarget!]

AppTransferTarget

A team the viewer could hand this app to - one of their OWN other teams where they hold the deploy capability.

FieldTypeDescription
avatarUrlString
githubFollowsBooleanTrue when the repository connection survives the move, because that team has its own GitHub App installed on the repository's account. False => the connection and auto-deploy are dropped and must be reconnected there. Always true when the app has no GitHub connection.
idID
nameString
serverAvailableBooleanFalse when the app's server is restricted and not shared with that team - the transfer is refused until an instance admin grants access.

AuthPayload

FieldTypeDescription
requiresTwoFactorBooleanThe password was correct but the account has 2FA: no session yet. Send a code to verifyTwoFactorLogin.
viewerViewer

Backup

A scheduled backup of a database or project to a backup destination.

FieldTypeDescription
appIdID
createdAtString
databaseIdID
databaseNameString
destinationIdID
destinationNameString
enabledBoolean
idID
lastRunAtString
lastStatusBackupStatus
nameString
retentionCountIntHow many backups this schedule keeps at its destination. A count, not a window in days.
scheduleStringCron expression.
serviceNameString
targetKindBackupTargetKind
teamIdID
timezoneStringIANA zone the cron is read in. UTC for older schedules.

BackupDestination

Where a team's backup artifacts are kept: an S3-compatible bucket, or a directory on a server in the fleet. Secrets are masked and the recovery key is never a field - it has its own mutation, which records who took it.

FieldTypeDescription
accessKeyMaskedString
allowPrivateEndpointBooleanWhether this bucket is allowed to live on a private address. Instance-admin only to set.
bucketString
createdAtString
encryptedBooleanWhether artifacts written here are encrypted. Always true for a server destination, and for any bucket connected since bucket artifacts started being encrypted.
endpointString
freeBytesFloat
idID
kindDestinationKind
lastTestAtString
lastTestErrorString
nameString
pathString
providerS3Provider
recoveryKeySavedAtString
regionString
resolvedPathString
s3ExtraArgsStringAdvanced per-store quirk flags, as typed. Null when none. A server whose agent is too old ignores them and Deplo says so.
serverIdID
serverNameString
statusDestinationStatus
teamIdID
totalBytesFloat
whereString

BackupDestinationOption

A backup destination as a picker shows it. No credentials, no test history: readable by anyone who may schedule or run a backup, including a member scoped to one folder.

FieldTypeDescription
encryptedBoolean
idID
kindDestinationKind
nameString
recoveryKeySavedAtString
serverIdID
statusDestinationStatus
whereString

BackupRun

One executed backup - a single dump+upload artifact, and the source for an in-place restore.

FieldTypeDescription
appIdID
backupIdIDThe owning schedule, or null for an ad-hoc run.
databaseIdID
destinationIdID
errorString
finishedAtString
idID
objectKeyStringObject key of the stored artifact.
sizeBytesFloat
startedAtString
statusBackupRunStatus
targetKindBackupTargetKind
teamIdID
verifiedBooleanWhether Deplo recorded a checksum when it wrote this artifact, and can therefore prove on restore that the file has not been replaced. False for runs taken before integrity checking shipped.

BasicAuthUser

An HTTP Basic Auth credential that gates every domain of an app. The password is never a field - read one back with revealBasicAuthPassword.

FieldTypeDescription
createdAtString
createdByVarAuthorWho added the credential.
idID
importedBooleanThe credential was carried over from another platform verbatim, so it never went through Deplo's password rules. Shown as a warning next to the user.
updatedAtString
updatedByVarAuthorWho last changed its password.
usernameString

BuildServerChoice

One entry in the 'Build on' picker: a host this team may compile on.

FieldTypeDescription
buildFallbackBooleanWhether this host takes over when an app's own build server cannot be reached. True on the Deplo host by default; setServerBuildFallback is what changes it.
buildOnlyBooleanTrue for a host dedicated to building (it runs no apps). False for an ordinary server that would build for this app in addition to hosting its own.
hostArchStringIts CPU architecture ("amd64" | "arm64"), or "" when the agent is too old to report one. An image only runs on a host of the same architecture, so a choice whose arch differs from the app's server must be disabled rather than offered.
idID
isDeploHostBooleanWhether this is the host running Deplo itself, as opposed to a remote that only runs the deploy agent.
nameString

BulkAppActionResult

The outcome of a bulk action: how many apps it ran on, how many refused or failed, and the first failure's message. Apps the caller can't reach are not counted at all.

FieldTypeDescription
errorString
failedInt
okInt

CertificateAccount

One server's Let's Encrypt account, read from that host's own proxy configuration. email is null when Deplo cannot manage certificates there; unavailable says why, in the host's own words.

FieldTypeDescription
customCertificatesIntHow many certificates the operator installed on this host themselves (see serverCertificates).
emailString
expiresInDaysIntWhole days until the first of those expires, negative once one has, null when there are none. Nothing renews a certificate installed by hand, so this is the only warning there is.
serverIdString
serverNameString
unavailableString

ComposeNameClash

A service name this stack shares with an app or database already on the destination network, and what the rename would call it.

FieldTypeDescription
nameString
ownerStringThe app or database already answering to the name.
renamedToStringThe free name createApp(renameClashes: true) would use.

ConsoleInfo

Console attach info for an app (no shell probe - fetch the shell label separately via shellLabel).

FieldTypeDescription
containerNameString
imageString
instances[ConsoleInstance!]
runningBoolean

ConsoleInstance

A single attachable container in an app's stack.

FieldTypeDescription
exposedBoolean
imageString
nameString
openStdinBoolean
runningBoolean
serviceString
ttyBoolean
userString
workdirString

ContainerInstanceMetrics

Live resource usage for ONE container of an app/database stack - the Monitoring tab's per-container breakdown. net_* / block_* are cumulative byte counters since the container started.

FieldTypeDescription
blockReadFloat
blockWriteFloat
cpuFloat
healthStringThe healthcheck verdict when the image defines one: healthy | unhealthy | starting. EMPTY means there is no healthcheck at all, which is not a synonym for healthy.
memLimitFloat
memPctFloat
memUsedFloat
nameString
netNsHostBooleanThis container is on the host's network (network_mode: host), so net_rx/net_tx are 0 here - its traffic is the machine's, on the server's own network chart.
netNsIdFloatThe container's network namespace. Two containers reporting the same one (a sidecar on network_mode: service:x) read the SAME counters, and the stack total counts them once. 0 from an older agent.
netRxFloat
netTxFloat
pidsInt
restartCountIntHow many times docker has restarted this container - what tells a container that is starting from one that has been dying for an hour.
runningBoolean
stateStringRaw docker state: running | restarting | exited | created | paused | dead | removing. Empty from an agent too old to report it.

ContainerMetrics

A fresh live metrics snapshot for one app/database stack: the aggregate across its containers, plus the per-container breakdown and an unsupported flag (the owning server's agent is too old for per-container metrics - the tab shows 'update the agent').

FieldTypeDescription
blockReadFloat
blockWriteFloat
containersInt
cpuFloat
hostCoresIntThe owning machine's core count - see the sample type.
idID
instances[ContainerInstanceMetrics!]Per-container usage (multi-container stacks). Live only.
memLimitFloat
memPctFloat
memUsedFloat
netRxFloat
netTxFloat
onlineBoolean
pidsInt
runningInt
tsFloat
unsupportedBoolean

ContainerMetricsSample

One buffered aggregate metrics sample for an app/database stack (the sum across its running containers) - what the Monitoring tab's charts seed from. net_* / block_* are cumulative bytes; the client derives bytes/sec from the delta between consecutive samples.

FieldTypeDescription
blockReadFloat
blockWriteFloat
containersInt
cpuFloat
hostCoresIntThe owning machine's core count. cpu is a percentage of ONE core (like docker stats and htop), so 299% is three busy cores of this many. 0 before the first frame.
idID
memLimitFloat
memPctFloat
memUsedFloat
netRxFloat
netTxFloat
onlineBoolean
pidsInt
runningInt
tsFloat

CreateTokenPayload

Result of creating a token. raw is the full secret and is returned only here, once - store it now, it cannot be recovered later.

FieldTypeDescription
rawStringThe full token secret. Shown once and never again.
tokenApiToken

CronJob

A command run inside one container of an App or a Database, on a cron schedule, in the job's own timezone. Running it produces a CronRun.

FieldTypeDescription
appIdID
commandString
createdAtString
databaseIdID
descriptionString
enabledBoolean
envKeys[String!]The NAMES of the job's extra variables. The values are write-only and have no read path.
idID
keepRunsInt
lastRunAtString
lastStatusString
lastSuccessAtStringThe last time it actually worked. Separate from lastRunAt so a job quietly skipped for a week (its container is stopped) is visible.
maxAttemptsIntLaunches per scheduled fire. 1 means no retry.
nameString
nextRunAtStringComputed, never stored, from the clock of whoever asked. Null while the job is disabled. It is a snapshot, not a countdown: re-read it rather than letting an old answer age into the past.
overlapStringskip | allow - what happens when the previous run is still going.
runningBooleanA run of this job is in flight. Not the same as lastStatus, which is written when a run SETTLES and so never says running.
scheduleString5-field cron.
serviceStringCompose service to run in. Null means the target's own container - the only possibility for a database. Never a container name: a redeploy mints new ones, so it is resolved live before every attempt.
shellStringsh | bash.
targetKindStringapp | database.
timeoutSecondsIntPer ATTEMPT - it is the agent's exec deadline. timeout x attempts is capped at 24 hours.
timezoneStringIANA zone the schedule is read in. NOT UTC unless you say so.
updatedAtString
userString
workdirString

CronJobsView

Everything a Cron jobs page renders in one read.

FieldTypeDescription
enabledBooleanThe per-target master switch. While false the scheduler skips every job here, and the jobs themselves are untouched.
jobs[CronJob!]
primaryServiceStringWhere a job that names no service runs: the service the app's domain routes to, else the first declared. Null for a database.
services[String!]Compose services a job can target. Empty for a database.
targetIdID
targetKindString

CronRun

One scheduled fire of a cron job, retries included.

FieldTypeDescription
actorString
attemptInt0-based. The output below is this attempt's, not the first's.
commandString
containerString
errorStringWhy it failed or was skipped. Not command output.
exitCodeInt
finishedAtString
idID
jobIdID
maxAttemptsInt
retryingBooleanRunning, but waiting out a retry backoff rather than executing.
scheduledForString
startedAtString
statusStringrunning | succeeded | failed | timedout | skipped | lost. skipped never started (the container was stopped, or the previous run was still going) and lost means the outcome is unknown - the agent restarted mid-run. Neither is a failure.
stderrString
stdoutStringLast 16 KiB - the tail.
triggerStringschedule | manual.

Database

A provisioned database container owned by a team. The connection string is masked; reveal it with the revealConnection mutation.

FieldTypeDescription
connectionStringMaskedString
createdAtString
customCommandStringExpert override: replaces the container command verbatim (redis's default command carries --requirepass - omit it and auth is off).
customImageStringExpert override: the full image ref replacing the derived engine image; the version field is inert while set.
dataCopyErrorStringWhy this database's data did not arrive, when a migration tried to copy it and could not. Empty in the common case. While it is set, restarting and redeploying are refused: an engine started on the emptied volume initialises a NEW database over the old one's place. startWithoutMigratedData accepts that; rebuildDatabase also clears it, since a factory reset makes the empty volume the intended state.
dbNameString
environmentIdIDThe Environment this database lives in, which is also the network it answers on. Null => the team's top level.
exposedPortInt
exposedPubliclyBoolean
hostString
idID
logoStringUploaded display logo as an image data-URI, or null to fall back to the engine's own brand mark (which is what the UI draws by default).
mounts[DatabaseMount!]Expert override: the engine's own config files, written next to the stack and bind-mounted into the container. Empty for almost every database. Saving them applies immediately - the container is recreated.
nameStringDisplay name, editable with renameDatabase. Not the container's identity - host is, and it is fixed at creation.
portInt
resourcesResourceLimitsPer-database resource caps applied at provision/redeploy time, or null when no limits are set.
serverIdID
sizeMbInt
statusDatabaseStatus
teamIdID
typeDatabaseType
usernameString
versionString

DatabaseMount

One config file of a database: its name in the stack's files directory, its body, and where it is mounted inside the container.

FieldTypeDescription
contentString
filePathString
mountPathString

DeleteUserImpact

Exactly what permanently deleting an account would take with it - read live so the confirmation states facts, not warnings.

FieldTypeDescription
blockedReasonStringNon-null => this account can't be deleted at all; the reason to show.
createdAppCountInt
foundedTeams[DeleteUserTeamImpact!]Teams they founded that still have other members - deleted only on request.
keptTeams[DeleteUserKeptTeam!]Teams that keep everything, minus this membership.
nameString
ownedAppCountInt
ownedFolderCountInt
ownedProjectCountInt
soloTeams[DeleteUserTeamImpact!]Teams where they are the ONLY member - always deleted with the account, since nobody would be left who could ever open them.
tokenCountInt
userIdID
usernameString
vacatedTeams[String!]Surviving teams whose last member/team manager this account is. The delete hands that capability to their longest-standing remaining member.

DeleteUserKeptTeam

FieldTypeDescription
nameString
teamIdID

DeleteUserResult

What a completed account deletion actually removed.

FieldTypeDescription
appsDeletedInt
databasesDeletedInt
teamsDeletedInt
usernameString

DeleteUserTeamImpact

A team affected by deleting a user, and what it holds.

FieldTypeDescription
appCountInt
databaseCountInt
nameString
otherMemberCountInt
teamIdID

DeploChangelog

Deplo's published releases, newest first.

FieldTypeDescription
errorString
releases[DeploRelease!]

DeploRelease

One published release of Deplo, as the changelog renders it.

FieldTypeDescription
bodyString
currentBoolean
nameString
prereleaseBoolean
publishedAtString
tagString
urlString

Deployment

A single build + release of an app.

FieldTypeDescription
appIdID
branchString
buildDurationMsInt
canRollbackBooleanThis app can be put back on this deployment: it succeeded, it built an image, that image is still on the app's current server, and it is not the one already running.
commitAuthorString
commitMessageString
commitShaString
createdAtString
creatorString
creatorProviderStringThe git host creator is a login on, when a webhook push started this build (github, gitlab, bitbucket, gitea). Null when somebody on this instance ran it.
creatorUserVarAuthor
deployKeyStringThe stack this build owns: the app slug for production, <slug>__pr-<n> for a pull request preview.
environmentDeploymentEnvironment
idID
logs[LogLine!]Build logs for this deployment (most recent lines, capped).
prNumberIntThe pull request number, denormalized so it survives the preview itself being reaped. Null for a production build.
previewIdIDThe pull request preview this build belongs to, or null for production.
queuePositionInt1-based position in the owning server's build queue while this deployment is queued (1 = next to build); null once it starts building or finishes.
readyAtString
rollbackOfIDSet when this deploy was a rollback: the deployment whose image it re-ran. Null when it built its own.
startedAtStringWhen the build was claimed off the queue and started running - the origin buildDurationMs is measured from, and what a live build timer counts up from. Null while still queued.
statusDeploymentStatus
urlString

DestinationRemovalImpact

What deleting this destination takes with it: the schedules that point at it, the run history, and how many stored backup files it holds.

FieldTypeDescription
artifactsInt
runsInt
schedulesInt

DestinationTestResult

A completed connection test: the destination with its badge repainted, plus the verdict. Callers MUST read report.ok - a failed probe is a normal result, not a mutation error.

FieldTypeDescription
destinationBackupDestination
reportS3TestReport

DockerCleanupPolicy

The instance-wide Docker cleanup schedule. One policy, not one per server: a host opts OUT via excludedServerIds, so a newly added server cannot silently go un-swept. Until it is saved once it reads as the defaults (ENABLED, daily at 04:00 UTC, every scope), so a fresh install sweeps its hosts without anyone finding this setting first; a saved row (including an explicit disable) always wins.

FieldTypeDescription
enabledBoolean
excludedServerIds[String!]Servers the SCHEDULED sweep skips. A manual runDockerCleanupNow ignores this list - the operator standing in front of the button has already made that decision.
keepImagesPerAppIntunused_app_images only: how many of the newest images to keep for an app that CANNOT be rolled back - a compose stack, a prebuilt image, a pull request preview. An app Deplo builds is governed by its own App.rollbackKeep instead, which the sweep sends per app.
minAgeHoursIntOnly reclaim objects older than this. 0 = no age filter.
scheduleString5-field cron expression, evaluated in UTC. Rejected on save if it does not parse.
scopes[DockerCleanupScope!]What the sweep reclaims. Empty = nothing, and the policy cannot be enabled.
updatedAtStringNull until the policy has been saved once.

DockerCleanupRun

One executed sweep on one server. A run that could not even start (an unprovisioned host, an agent offline or too old) is still recorded, as failed: the history never lies about an attempt.

FieldTypeDescription
actorStringThe user who ran it, or "Scheduler" for a scheduled sweep.
errorString
finishedAtString
idID
items[DockerCleanupRunItem!]The per-scope breakdown, in the scope allow-list's order.
reclaimedBytesFloat
serverIdIDNull once the server is removed - serverName is what keeps the row readable.
serverNameString
startedAtString
statusDockerCleanupRunStatus
triggerDockerCleanupTrigger

DockerCleanupRunItem

One scope's outcome in an executed run. Counts only - the history keeps how much was reclaimed, not which objects.

FieldTypeDescription
errorString
itemsRemovedInt
reclaimedBytesFloat
scopeDockerCleanupScope
skippedBoolean

Domain

A routable hostname attached to an app (Traefik router).

FieldTypeDescription
appIdID
appSlugString
certProviderCertProviderHow this domain's TLS certificate is issued. Set to cloudflare automatically when a DNS check finds the host proxied and it still had no certificate - Cloudflare already serves it over HTTPS. custom serves it over HTTPS from a certificate installed on the owning server (see addServerCertificate) and asks no ACME provider for one. Null on rows written before the field existed (they route as letsencrypt).
createdAtString
entrypointDomainEntrypoint
idID
importedFromStringThe hostname this domain REPLACED on the platform the app was imported from, or null when it is the address the app always had. An import cannot keep the source's own throwaway host (it carries that server's IP) nor a name another team here already serves, so the route is re-hosted onto an address Deplo mints - this is what the app's Domains section reads to say which address became which. Cleared by dismissImportedDomains.
middlewares[String!]
nameString
pathPrefixString
portInt
primaryBoolean
proxiedBooleanThe owner's declaration that a proxy (a CDN, a reverse proxy, a load balancer) answers for this hostname. Its A records then name the proxy, never this server, so the DNS check can only ever settle misconfigured - this is what keeps the host routed anyway, and makes its URL https (the proxy terminates TLS). The declared twin of the cloudflare status, which is detected from Cloudflare's published ranges.
redirectToStringHostname this domain answers a permanent 301 to (the canonical half of its www / non-www pair), or null when it serves the app itself.
serviceString
serviceNameString
sourceString
sslBoolean
statusDomainStatusDNS verification state. Only valid is confirmed: cloudflare means the host is proxied and its origin cannot be checked from DNS, so it is routed but unverified. A misconfigured host is off the router unless proxied declares another proxy answers for it. See the DomainStatus enum.
stripPrefixBoolean

EnvImportResult

What a .env import wrote, and what it deliberately left alone.

FieldTypeDescription
addedIntVariables created or updated.
skippedSecretsIntLines whose key already exists as a secret. A secret cannot be edited, so those were left untouched.

Environment

A per-Project, first-class isolated deploy target (Development/Preview/Production + custom). kind is its well-known role; slug and gitBranch drive the deploy pipeline (wired in a later phase).

FieldTypeDescription
createdAtString
gitBranchString
idID
isDefaultBoolean
kindString
nameString
positionInt
projectIdID
slugString
updatedAtString

EnvVar

A single environment variable. Secret values are masked unless revealed.

FieldTypeDescription
createdAtString
createdByVarAuthor
idID
isMaskedBoolean
keyString
targets[EnvTarget!]
typeEnvVarType
updatedAtString
updatedByVarAuthor
valueString

ExecResult

Output of an exec'd console command.

FieldTypeDescription
detachBoolean
outputString

FleetServerMetrics

One server's headline reading for the Monitoring page's fleet list, plus a thinned CPU/memory trace.

FieldTypeDescription
agentVersionString
containersInt
cpuFloat
diskPctFloat
expectedAgentVersionString
memPctFloat
onlineBooleanWhether the buffer holds a reading at all.
serverIdID
sourceString
spark[FleetSpark!]Oldest first, at most 30 points.
tsFloatNewest sample time, epoch ms. 0 means nothing has been measured - the row says so rather than drawing zeros.

FleetSpark

One thinned point of a fleet row's sparkline.

FieldTypeDescription
cpuFloat
memFloat
tsFloat

Folder

A team-wide grouping of apps on the Overview. Apps reference their folder via App.folderId; folders nest via parentId (a tree).

FieldTypeDescription
appCountInt
capabilities[String!]The current caller's effective capabilities on this folder (bounded by their team caps).
colorString
createdAtString
idID
isOwnerBooleanWhether the caller owns this folder or is a folder super-user (manage_team / admin).
nameString
ownerUserIdID
parentIdID
subfolderCountInt
teamIdID
updatedAtString

FolderGrant

A user's access to a folder: the owner (isOwner=true, implicit) or a grantee the owner has shared it with, plus their effective capabilities.

FieldTypeDescription
avatarColorString
avatarUrlString
capabilities[String!]
folderIdID
isOwnerBoolean
nameString
userIdID
usernameString

FolderShareCandidate

A team member who could be granted access to a folder (used to populate the Share dialog's picker).

FieldTypeDescription
avatarColorString
avatarUrlString
nameString
userIdID
usernameString

GitConnection

A team's stored credentials for one git host that is not GitHub. The token is never exposed.

FieldTypeDescription
accountLoginString
allowPrivateEndpointBooleanThe address points inside the deployment, which only an instance admin can allow. False for every ordinary connection.
appCountIntApps whose clone this connection authenticates.
avatarUrlString
baseUrlString
createdAtString
hasApiBooleanFalse for a plain git server: it can carry credentials but cannot list repositories or register a webhook.
healthStringok | failing. Re-derived by the maintenance sweep and by testGitConnection, so a revoked token surfaces before a deploy fails on it.
healthErrorStringThe provider's own refusal when health is failing.
idID
labelString
lastCheckedAtString
providerStringgitlab | bitbucket | gitea | git.
tokenExpiresAtString
usernameString

GithubApp

A GitHub App connected to a team (no secrets exposed).

FieldTypeDescription
appIdInt
createdAtString
htmlUrlString
idID
installations[GithubInstallation!]Installations of this App.
nameString
slugString

GithubConnectStart

Inputs for the browser's self-submitting form that creates a GitHub App.

FieldTypeDescription
actionUrlString
manifestString
stateString

GithubInstallation

An installation of a connected GitHub App on a user or org.

FieldTypeDescription
accountLoginString
accountTypeString
appNameStringName of the connected GitHub App this installation is of.
avatarUrlString
idID
installationIdInt

GithubPullRequest

An open pull request on the app's repository.

FieldTypeDescription
authorLoginString
baseRefString
draftBoolean
fromForkBoolean
headRefString
htmlUrlString
numberInt
titleString
updatedAtString

GithubRepo

A repository the installation can list and clone.

FieldTypeDescription
defaultBranchString
fullNameString
nameString
privateBoolean
updatedAtString
urlString

GitProvider

A git host Deplo can connect to, other than GitHub (beta).

FieldTypeDescription
defaultBaseUrlString
defaultUsernameString
hasApiBoolean
idString
labelString
tokenHelpUrlStringWhere to create the token. Pass the connection's own baseUrl for a self-hosted host. Arguments: baseUrl: String.
tokenScopesStringThe scopes to tick when creating the token, as one line.

GitRepoSummary

A repository a connection can list and clone.

FieldTypeDescription
defaultBranchString
fullNameString
nameString
privateBoolean
updatedAtString
urlString

GlobalUser

A registered user in the instance-wide Users list (no email exposed).

FieldTypeDescription
avatarColorString
avatarUrlStringResolved profile picture: uploaded image, else Gravatar, else null for the monogram.
canExposePortsBoolean
canMountHostVolumesBoolean
createdAtString
isInstanceAdminBoolean
isInstanceOwnerBooleanOwns the instance. Their account is editable only by themselves.
nameString
suspendedBoolean
teamCountInt
userIdID
usernameString

HealthCheck

What Deplo writes into the app's compose healthcheck:. Docker runs it inside the container and the agent reports the verdict, which is what the status dot follows. Null on an app that has none.

FieldTypeDescription
commandString
intervalSInt
pathString
portIntThe port INSIDE the container. Null means the app's own port.
retriesInt
startPeriodSInt
timeoutSInt
typeHealthCheckType

HostPortCheck

The answer to 'are these host ports free on that server?'.

FieldTypeDescription
checkedBooleanFalse when the server could not be asked at all, in which case inUse is empty and says nothing.
inUse[Int!]The subset of the requested ports that is taken.
reasonStringWhy the check could not run. Null when it did.

InstanceSettings

Settings that belong to this Deplo instance rather than to a team or a host: the address the panel answers on, and what version it runs.

FieldTypeDescription
deploHostIdString
deploHostIpStringThe IPv4 an A record for the panel's domain should point at.
deploHostNameString
gravatarEnabledBooleanWhether a person with no uploaded picture falls back to their Gravatar. The panel never dials gravatar.com itself - it only computes the address, and each viewer's browser fetches it.
logMaxDaysIntHow far back the log viewer's time range may reach, in days. Instance-wide because the logs live on the host, which several teams share. It bounds what may be ASKED for and nothing else: docker rotates its json-file logs by size, so no setting here makes the host actually hold that much.
panelFallbackUrlStringThe generated address the panel also answers on, over https (https://deplo-&lt;hexip>.nip.io). Always on and not a setting: it is the way back in when the panel's domain, its DNS or its certificate stops working, and it resolves to this server with nothing to set up. Null only when Deplo cannot work out an address of its own that anyone else could reach.
panelUrlStringThe address Deplo uses for itself right now. Every install command, deploy hook URL and invite link is built from it.
panelUrlSourceStringstored (set here), environment (DEPLO_PUBLIC_URL, set at install time) or request (derived from the browser's own host, which is a guess).
storedPanelUrlString
versionString

LogLine

FieldTypeDescription
levelString
textString
tsString

LogsInfo

Lighter container list for the logs viewer (no shell probe).

FieldTypeDescription
instances[ConsoleInstance!]
logMaxDaysIntHow far back the time range may reach, in days (instance setting). A bound on what may be asked for, not a promise the host still holds it: docker rotates its logs by size.
runningBoolean
streamableBooleanA real container exists on the host, so its logs can be streamed - whether it is running, restarting or exited. Attach on this, not on running: a crash-looping container is the one whose logs you need.
supportsTimelineBooleanThe owning host's agent can narrow a log stream by time (logs.timerange). False on an older agent, which still streams but only honours tail - the viewer greys out the time-range control rather than offering a window the host would silently ignore.
unreachableBooleanThe owning server's agent could not be reached.

McpSettings

The active team's MCP policy: whether AI agents may drive it at all. What an agent may DO is decided by its API token's capabilities and by its owner's manage_mcp in the team, and by nothing here.

FieldTypeDescription
enabledBoolean

McpTeam

A team as the MCP server names it: whether the team allows agents at all, and whether the caller may connect theirs.

FieldTypeDescription
canConnectBooleanWhether the caller holds manage_mcp in this team.
idID
mcpEnabledBooleanThe team's own MCP switch.
nameString
slugString

Member

A user's membership in the active team (no email exposed).

FieldTypeDescription
avatarColorString
avatarUrlStringResolved profile picture: uploaded image, else Gravatar, else null for the monogram.
capabilities[Capability!]
createdAtString
isInstanceAdminBoolean
isPrimaryOwnerBoolean
membershipIdID
nameString
roleRoleThe member's RANK (only owner outranks). For what to show, read roleName.
roleIdIDThe assigned team role, or null when the member holds a hand-picked capability set.
roleNameStringThe assigned role's name, or null for a custom set.
userIdID
usernameString

MigrationDataMoveResult

FieldTypeDescription
failedInt
movedInt
notes[String!]
sourceGoneBooleanThe source machine stopped answering part way through - a connection that died, not a volume that could not be read. The caller MUST stop: every service still to come is on the same machine, each one gets stopped on the other platform before its copy is attempted, and carrying on turns one broken host into a whole organisation with no data and its services down on both sides.

MigrationDataService

An already-imported service whose data can still be moved over from the panel.

FieldTypeDescription
notes[String!]
pathString
runningBooleanStill up over there. Moving the data stops it, which is the point of a cutover.
sourceIdString
sourceKindString
sourceNameString
sourceReachableBooleanWhether the machine holding this data ANSWERS Deplo right now - a live Hello, not the stored status, which goes green on the agent's outbound call-home and says nothing about the direction a copy needs. False means the copy cannot start at all, and the caller must not begin it: one unreachable machine is one refusal, not one failure per service.
sourceServerIdString
targetIdString
targetKindString
targetNameString
targetServerIdString
volumes[MigrationDataVolume!]

MigrationDataVolume

One source volume and the Deplo volume it would be copied into, paired by the path they are mounted at.

FieldTypeDescription
mountPathString
noteStringSet when the pairing rests on something weaker than an equal path - a database whose data directory moved between engine versions, for instance.
sourceVolumeString
targetVolumeString

MigrationInvite

One person from the source team or organization: either added to the team (they already had a Deplo account) or handed a single-use registration link.

FieldTypeDescription
emailString
linkStringThe single-use registration link to send them, or null when they were added directly.
messageString
nameString
outcomeMigrationOutcome

MigrationPlan

What an import would do, read from the source instance without writing anything.

FieldTypeDescription
members[MigrationPlanMember!]
orgAvatarUrlStringThat team's own picture on the panel, so the wizard draws it rather than a generic mark. Null when the panel keeps none - a Coolify team has no picture at all.
orgNameStringThe team or organization this token reads. A token belongs to one, so importing a second one means a second token.
otherTeams[String!]The panel's other teams, by name - the ones this token does not cover and that need one of their own. Null when the panel cannot say, which on Coolify it never can.
platformMigrationPlatformWhich product answered at that address.
projects[MigrationPlanProject!]
servers[MigrationPlanServer!]
sourceUrlString

MigrationPlanEnvironment

FieldTypeDescription
existsBooleanAn environment of that name is already in the matching project - the panel's production maps onto the one every Deplo project starts with.
nameString
services[MigrationPlanService!]
sourceIdString

MigrationPlanMember

Someone in the team or organization the token reads. Empty when the token belongs to a plain member, which cannot list it.

FieldTypeDescription
avatarColorString
avatarUrlString
emailString
hasAccountBoolean
inTeamBoolean
nameString
sourceRoleStringThe role they held over there. Shown, never applied: everyone arrives as a plain member and is promoted on purpose.

MigrationPlanProject

FieldTypeDescription
environments[MigrationPlanEnvironment!]
existsBoolean
nameString
sourceIdString

MigrationPlanServer

One machine behind the source instance. The FIRST entry is always the host the source instance itself runs on, whose sourceId is the empty string - the same key the server mapping and the data cutover use for it.

FieldTypeDescription
deploServerIdStringThe Deplo server at that same address, or null when Deplo has no agent there. Data cannot be copied off a machine Deplo cannot reach: a volume is read by the agent ON its host, and agents cannot dial each other.
deploServerNameString
deploServerOnlineBooleanWhether that server's agent answers. A row a failed attempt left behind sits at the same address and is matched all the same, so this - not the id - is what says the machine is ready to be read.
ipAddressString
nameString
sourceIdString

MigrationPlanService

One service on the panel (an application, a compose stack, or a database) as it would land here.

FieldTypeDescription
buildsFromSourceBooleanWhether Deplo would ever compile this. False for a compose stack, a prebuilt image and a database - all of them deploy as they are, so a build server would have nothing to do for them.
domains[String!]The hostnames that would come across. The panel's generated throwaway hosts (traefik.me, sslip.io, nip.io) are already dropped - Deplo mints its own.
engineStringDeplo's own engine id for a database (mongo over there is mongodb here), so a client can show the engine's brand mark. Null for anything that is not a database Deplo has.
exposedPortIntThe host port this database publishes over there, so a review can say what will be published and offer another port when that one is taken here. Describes the SOURCE: it is reported whether or not the caller holds the publish-ports grant, and null only for something that is not a database or publishes nothing.
kindStringWhat it is over there: application, compose, or one of the panel's database engines.
logoStringThe icon this service would arrive with, as an inline data-URI, or null when it has none. Already validated against what Deplo will store, so a client can render it as-is.
nameString
notes[String!]What will not come across, or will need a look afterwards.
sourceIdString
sourceServerIdStringThe panel's server it runs on. Empty string means the panel's own host, which has no server row over there.
statusMigrationPlanStatus
targetKindStringapp or database, or null when Deplo has no equivalent.

MigrationProjectResult

FieldTypeDescription
createdInt
failedInt
items[MigrationRunItem!]
manualInt
projectNameString
skippedInt

MigrationRecopySource

The panel service a blocked app or database was imported from. Its key is NOT here: a run wipes the token the moment it ends, so copying the data again asks for it once more.

FieldTypeDescription
platformString
runIdString
sourceIdString
sourceKindString
sourceNameString
sourceUrlString

MigrationRevertResult

What a revert took back out of Deplo, and what is still here because it could not be removed.

FieldTypeDescription
appsInt
databasesInt
environmentsInt
failed[String!]One line per thing that is still here, and why - a host that would not confirm the volume is gone, or a capability the actor does not hold.
projectsInt
sharedVarsInt

MigrationRun

One import, kept after the tab that started it is gone. The API key is never stored.

FieldTypeDescription
actorString
createdInt
doneStepsInt
errorString
failedInt
finishedAtString
heartbeatAtStringWhen the control plane driving this run last said it was alive, or null while nothing has picked it up. A run is a row that says running whether or not anybody is driving it, so this is the only honest answer to "is it actually doing something": older than 90 seconds (or null) means no runner has it, and the next tick anywhere on the instance will take it over.
idString
items[MigrationRunItem!]The report. Only loaded by the single-run query.
lastPathStringThe last thing this run touched, as Project / Environment / service. Filled in only by the live activeMigration feed - the history list leaves it null, because a finished run says where it got to with its whole report. It is the only record of a run's POSITION that survives the tab: the loop lives in the browser, and so does the plan that knew how many projects there were.
manualInt
orgNameString
phaseStringconfig | data | done. Which half the run is in - the two count different things, so their step numbers are not one scale.
platformMigrationPlatformWhich product this run read. Decided once, when it connected.
skippedInt
sourceUrlString
startedAtString
statusStringrunning | done | failed. A run left open by a closed tab is failed as Interrupted by the next one.
stepLabelString
stopRequestedBooleanSomebody asked it to stop. The runner notices between steps - never mid-call, because a call already sent finishes on the far side whatever this row says.
totalStepsInt

MigrationRunItem

FieldTypeDescription
atStringWhen this line happened. Null on rows written before the report became something you can watch. A report read afterwards is a list; read while it runs it is a log, and a log with no times is not one.
messageString
outcomeMigrationOutcome
pathStringWhere it was over there: Project / Environment / service.
sourceKindString
sourceNameString
targetIdString
targetKindString

MigrationSourceTeam

Which team of the panel one token reads. A token belongs to exactly one team on both products, so bringing several over takes one token each.

FieldTypeDescription
otherTeams[String!]The panel's other teams, by name, so the ones no token covers yet can be named. Null means the panel cannot say - always the case on Coolify, whose team listing is filtered down to the token's own team.
platformMigrationPlatform
teamAvatarUrlStringThat team's own picture on the panel, so the wizard draws it rather than a generic mark. Null when the panel keeps none - a Coolify team has no picture at all.
teamIdStringThe team's own id over there, which is how two tokens of ONE team are told apart from two tokens of two teams. Null when the panel would not say.
teamNameString

MonitoringSettings

Instance-wide monitoring settings (a fleet-scoped singleton, like the Docker cleanup policy).

FieldTypeDescription
saveMetricsBoolean
updatedAtString

PanelAddressImpact

What moving the panel to a given address would break, counted live and instance-wide. Every number is a fact about right now, so a dialog can name what is lost instead of warning in the abstract. Read-only: nothing here changes anything.

FieldTypeDescription
currentUrlString
deployHooksInt
gitConnectionsIntGit connections whose webhook is registered against the address the INSTALLER was given, not this setting - so this change does not move them.
githubAppsInt
hostChangesBooleanWhether the hostname moves. Everything a browser welds to an origin - passkeys, cookies, push subscriptions - dies on this.
losesHttpsBooleanhttps to http. Browsers that already loaded the panel over https keep refusing plain http on that hostname until the HSTS they remember expires.
mcpConnectionsInt
panelFallbackUrlString
passkeyPeopleInt
passkeysInt
pendingServersInt
pushSubscriptionsInt
registrationLinksInt
schemeChangesBoolean
sessionPeopleInt
sessionsInt
urlString

PanelDns

What DNS says about the address the panel answers on.

FieldTypeDescription
hostString
resolved[String!]
statusString

PanelHttps

How the Deplo panel itself is served, read live off the router that publishes it. unavailable says why it is not Deplo's to change here - the host is not added as a server, its proxy is not one Deplo installed, or the panel is still published by its own container.

FieldTypeDescription
certificateTrustedBooleanWhether a browser accepts the certificate this address serves. False on the generated host, which no public certificate authority issues for, so the browser warns once. Null when it could not be read, which is not the same as untrusted.
domainStringThe host the panel's route answers on, as the proxy has it.
enabledBooleanWhether the panel is served over https. False means plain http on :80, and it is an advanced opt-out: the only case for it is a panel no certificate can be issued for, on a network Let's Encrypt cannot reach.
fallbackDomainStringThe generated host the panel also answers on, or null when that IS the address above.
providerStringThe certificate resolver it is ordered from, named as this host names it. Null when https is off, or when this host orders from nobody and serves a certificate you installed.
unavailableString

Passkey

A WebAuthn credential on this account. Carries no key material: the public key and the credential id stay server-side.

FieldTypeDescription
createdAtString
idString
kindPasskeyKind
nameStringThe label shown in the list, e.g. "Chrome on macOS".
usableHereBooleanFalse for a credential minted for a different address of this panel: the browser will not offer it here, so the only thing to do with it is remove it.

PreviewEnvVar

A preview-only variable override. Write-only, like every stored secret: the value is never projected and there is no reveal path.

FieldTypeDescription
keyString
typeString
updatedAtString

Project

A top-level, team-scoped CONTAINER (ADR-0008): folder-like, but it owns Environments and holds folders/apps via their projectId. NOT the deployable app - that is an App. A Project never nests in a Project.

FieldTypeDescription
appCountInt
colorString
createdAtString
environmentCountInt
environments[Environment!]
folderCountInt
idID
nameString
ownerUserIdID
slugString
teamIdID
updatedAtString

PublishedPort

A host port an app publishes, for what the proxy cannot route - a game server, an SMTP relay, a database the app exposes.

FieldTypeDescription
idID
protocolString
publishedIntThe port on the host.
targetIntThe port inside the container.

RecognizedFramework

What Deplo read in a repository before an app exists for it: the JavaScript framework backing it, and the build/start commands the repository declares for ITSELF in its package.json. A command is never invented from the framework - null means the repo said nothing and the builder decides.

FieldTypeDescription
buildCommandStringThe repository's own build script, spelled for its lockfile's package manager (e.g. "pnpm run build").
defaultPortIntThe port this framework's production server binds when nothing tells it otherwise - what a new app's container port defaults to.
idStringStable framework id, e.g. "nextjs" - also the key for its brand mark. Null for a repo with no framework Deplo knows.
nameStringDisplay name, e.g. "Next.js".
startCommandStringThe repository's own start script (falling back to serve), spelled the same way.

RecoveryKey

The private key that decrypts a destination's artifacts. Save it somewhere outside Deplo: it is the only way to read those backups if this instance is lost. Fetching it is recorded in Activity.

FieldTypeDescription
identityString
nameString
recipientString
whereStringWhere the artifacts this key opens are stored, in one line. It goes into the key file, because whoever reads that file has lost the instance that knew the bucket or the folder.

A single-use link to register a new account.

FieldTypeDescription
canRevealBooleanThe link can still be read back with revealRegistrationLink - pending, unexpired, and minted after the token started being stored encrypted.
createdAtString
createdByString
expiresAtString
idID
linkMaskedStringThe link with its token blanked, for display while it is covered. Never carries the token.
modeRegistrationMode
statusRegistrationLinkStatus
teamNames[String!]
usedByUsernameString

Registry

A container-image registry credential owned by a team. The password / access token is never exposed - only the connection metadata.

FieldTypeDescription
createdAtString
idID
nameString
registryUrlString
typeRegistryType
usernameString

ResourceLimits

Per-container resource caps applied to a workload (an App's containers at deploy time, a Database's container at provision/redeploy time). A null field means that dimension is uncapped. Memory is in MiB, disk in GiB, CPU in milli-CPUs (1000 = one core).

FieldTypeDescription
cpuMilliInt
cpuSharesInt
cpusetString
memoryMbInt
memoryReservationMbInt
nofileInt
nprocInt
oomScoreAdjInt
pidsLimitInt
shmSizeMbInt
storageGbInt
swapMbInt

RestartedWorkload

One workload that could not be restarted, and why.

FieldTypeDescription
errorStringThe failure, verbatim from the host.
kindString"app" or "database".
nameString

RoleScope

The projects, folders and apps a role reaches. A folder brings its whole subtree. All three empty means it reaches nothing, which is what a scope whose nodes were all deleted becomes.

FieldTypeDescription
appIds[String!]
environmentIds[String!]
folderIds[String!]
projectIds[String!]

RuntimeContainer

One container of an app, as the host actually has it now.

FieldTypeDescription
exposedBoolean
healthString"healthy" | "unhealthy" | "starting", or "" when the image declares no healthcheck, which is not a synonym for healthy.
nameString
restartCountIntTimes docker has restarted this container.
runningBoolean
serviceString
startedAtUnixIntWhen it last started, epoch seconds. 0 when it has never started, or when the owning agent predates the field - both mean there is no uptime to show, never 1970.
stateStringRaw docker state ("running" | "restarting" | "exited" | ...), or "" when the owning agent is too old to report it.

S3TestLogLine

A line of the connection-test log, with the level to render it at.

FieldTypeDescription
levelString
textString

S3TestReport

The result of testing a destination: the verdict, the probe sequence, the agent's verbatim output, and the commands that reproduce the same three S3 calls by hand. never => it has not been tested yet.

FieldTypeDescription
commandString
durationMsInt
errorString
lines[S3TestLogLine!]
neverBoolean
okBoolean
serverNameString
startedAtString
steps[S3TestStep!]

S3TestStep

One step of the fixed probe sequence the agent performs (pick a server, open the endpoint, head the bucket, write a probe file, remove it).

FieldTypeDescription
detailString
keyString
labelString
statusS3TestStepStatus

SearchApp

An app a search matched. Deliberately small: enough to recognise it and to read it in full with app(slug:) afterwards.

FieldTypeDescription
idID
logoString
nameString
productionUrlString
slugString
statusAppStatus
teamSearchTeam

SearchCron

A cron job a search matched, with the app or database it runs on.

FieldTypeDescription
enabledBoolean
idID
nameString
scheduleString
targetKindString
targetNameString
targetRefStringThe app's SLUG or the database's ID - the deep link, either way.
teamSearchTeam

SearchDatabase

A database a search matched.

FieldTypeDescription
idID
logoString
nameString
statusDatabaseStatus
teamSearchTeam
typeDatabaseType

SearchDomain

A domain a search matched, with the app that serves it.

FieldTypeDescription
appNameString
appSlugString
idID
nameString
statusDomainStatus
teamSearchTeam

SearchEnvironment

An environment a search matched, with the project it is in.

FieldTypeDescription
idID
kindString
nameString
projectIdID
projectNameString
slugString
teamSearchTeam

SearchFolder

A folder a search matched. Folders have no slug: open one by id.

FieldTypeDescription
appCountInt
idID
nameString
teamSearchTeam

SearchMember

A team member a search matched. Name and username only - a search must never turn a name into an email address.

FieldTypeDescription
avatarColorString
avatarUrlString
nameString
roleNameString
teamSearchTeam
userIdID
usernameString

SearchProject

A project a search matched.

FieldTypeDescription
appCountInt
idID
nameString
slugString
teamSearchTeam

SearchResults

What a search found, grouped by kind. At most 50 of each.

SearchRole

A team role a search matched, by name or description.

FieldTypeDescription
descriptionString
idID
memberCountInt
nameString
teamSearchTeam

SearchServer

A server a search matched. Servers are the one resource shared across teams, so a hit names none.

FieldTypeDescription
hostString
idID
nameString
statusServerStatus

SearchTeam

The team a search hit was found in.

FieldTypeDescription
avatarUrlString
idID
nameString
slugString

SearchTemplate

A catalogue template a search matched. Public, so it names no team.

FieldTypeDescription
logoString
nameString
slugString

Server

A connected host running deployments (reached via its agent).

FieldTypeDescription
agentPortInt
agentVersionStringThe agent binary version last reported by this server on its last Hello. Null until the server's agent has called home and been provisioned.
allTeamsBooleanTrue (the default) when every team may target this server. False restricts it to teams (Settings -> Servers -> Team access).
buildFallbackBooleanWhether this host compiles for an app whose own build server could not be reached. On by default for the Deplo host and off for every other server, until setServerBuildFallback says otherwise. An app opts out of the whole chain with setAppBuildServer's buildFallback.
cpuCoresInt
createdAtString
deployConcurrencyIntHow many deployments this server runs at once (default 1 = strict per-server serialization). Deploys on other servers run in parallel; a same-app deploy never overlaps regardless. Editable via setServerDeployConcurrency (instance-admin). With a build server, the lane belongs to the BUILDER - that is where a deploy's cost is.
diskGbInt
dockerVersionString
expectedAgentVersionStringThe agent version this server should be running - the latest GitHub release of the agent (DeploCloud/deplo-agent). Resolved at request time and cached; falls back to a built-in version when GitHub is unreachable.
hostString
hostArchStringThis host's CPU architecture ("amd64" | "arm64"), observed from the agent. Empty when the agent is too old to report it. A build server can only build for a host of the SAME architecture.
idID
ipString
isDeploHostBooleanWhether this is the host running Deplo itself (the dashboard and API), as opposed to a remote that only runs the deploy agent. It cannot be removed, and it is the only server that can restart the Deplo panel.
lastSeenAtStringHeartbeat cache (P5) - a hint, not the source of truth.
memoryMbInt
nameString
provisionedBooleanTrue once the server's agent has called home and been trusted.
roleStringWhat this server is for: "everything" (the default), "build" (Docker but no proxy; it compiles for other hosts and runs nothing), "storage" (no Docker; it only holds backups) or "import" (a MIGRATION SOURCE: another platform's host, registered by the import wizard to read its volumes, out of every deploy and build picker and swept by nothing). Only the build axis is changeable after installation; "import" is refused by setServerRole in both directions.
statusServerStatus
statusCheckedAtStringWhen status was last OBSERVED by a live agent Hello probe (ISO), or null if it never has been. Read it WITH status: the pair is a timestamped observation, not a standing claim, and a client that shows the status without qualifying its age is showing a value that may be hours old. Never fabricated - a probe that times out or is throttled writes nothing.
statusMessageStringWhy status is not online - e.g. "The agent is up but Docker is unreachable". Null when online or never probed. Requires instanceAdmin.
teams[Team!]Teams explicitly granted access when allTeams is false (empty otherwise - every team has access). Requires manage_infra.
traefikEnabledBoolean
typeServerType
uninstallErrorStringWhy Deplo could not take its agent off this migration source, after it stopped trying (three attempts over several minutes). Empty otherwise. This is the only state that needs a person: surface it verbatim next to the host-side uninstall command.
uninstallPendingBooleanDeplo is still trying to take its agent off this migration source, and will try again on its own. Nothing is asked of anyone while this is true. False for every other server.

ServerCertificate

A TLS certificate the operator installed on a server themselves, described from the certificate itself. It lives in that host's proxy and nowhere else (Deplo stores no copy), and its private key has no read path at all.

FieldTypeDescription
domains[String!]Every hostname this certificate is valid for. Traefik picks a certificate by the domain the browser asked for, so these are the domains it will serve on this host.
expiredBooleanWhether it is already past its expiry. A certificate can lapse in place long after it was installed, so this is computed, not stored.
expiresInDaysIntWhole days left before it expires, negative once it has. Nothing renews these, so the only warning is this number.
idStringThe certificate's SHA-256 fingerprint, which is also how it is addressed for removal. Nothing is minted: a certificate identifies itself.
issuerStringWho signed it.
notAfterStringExpires at (ISO-8601).
notBeforeStringValid from (ISO-8601).
subjectStringIts common name, or its first domain when it carries none.

ServerHostInfo

What a server IS (its hardware, OS and clock) read live from its agent and stored nowhere. Distinct from the usage gauges on Monitoring: this is the make and model, not the load.

FieldTypeDescription
archStringMachine architecture, e.g. "x86_64".
canRestartControlPlaneBooleanWhether the Deplo panel runs in a container on this host that the agent could restart. False when Deplo was started some other way, in which case the restart action is not offered.
controlPlaneTimeUnixMsFloatDeplo's own clock when this reading landed (epoch ms). The pair with timeUnixMs is the honest drift measurement: measuring against the browser measures the browser, and a viewer whose laptop is an hour out would see the whole fleet reported as drifting.
cpuCoresIntPHYSICAL cores. A 6-core/12-thread chip reports 6 here and 12 in cpuThreads; reporting threads as cores is the usual way a spec sheet overstates a box.
cpuModelStringThe processor as it names itself, e.g. "AMD Ryzen 5 5600X 6-Core Processor". Empty when the host does not report one.
cpuThreadsIntLogical processors - what schedulers and nproc count.
diskTotalBytesFloatSize of the filesystem the agent's data lives on, in bytes.
diskUsedBytesFloatUsed bytes on that filesystem.
dockerRootDirStringWhere Docker actually keeps images and volumes - on a host with a mounted data disk this is not the root filesystem.
dockerVersionStringDocker engine version, empty when the daemon is unreachable.
kernelStringKernel release (uname -r).
memTotalBytesFloatInstalled RAM, in bytes.
osPrettyStringThe distribution, e.g. "Ubuntu 24.04.1 LTS".
timeUnixMsFloatThe host's own clock at the moment of the read (epoch ms). Compare it with controlPlaneTimeUnixMs, never with the viewer's clock, to spot a drifting box.
timezoneStringThe host clock's IANA zone, e.g. "Europe/Rome". Empty if it reports none.
uptimeSecFloatSeconds since the host booted.
utcOffsetMinutesIntOffset from UTC in MINUTES, not hours - Kathmandu is +345 and Kolkata +330.

ServerMetrics

A live resource-usage snapshot for one server (CPU, memory, disk, network, load and running-container count).

FieldTypeDescription
agentVersionString
containersInt
cpuFloat
cpuCoresInt
diskPctFloat
diskTotalFloat
diskUsedFloat
expectedAgentVersionString
load[Float!]Load averages over [1m, 5m, 15m].
memCacheFloatBuffers + Cached + SReclaimable.
memFreeFloatMemFree. memUsed is total-available (what free calls used), so this and memCache are what let the tile show the reclaimable half.
memPctFloat
memTotalFloat
memUsedFloat
netRxFloat
netTxFloat
onlineBoolean
serverIdID
sourceStringWhich sampler produced this frame: "cgroup2" | "docker-stats". Empty when the reading did not come from the telemetry stream.
traefikBoolean
tsFloat
uptimeSecInt

ServerReadinessCheck

One row of a server readiness report: a single thing Deplo could verify about the host, and what it found.

FieldTypeDescription
detailStringWhat we found. Drawn from a closed, curated set whenever it describes a failure, never a raw agent error (which would leak the pinned certificate fingerprint and the dial address).
groupServerReadinessGroup
hintStringWhat to do about it. Null on a pass row.
idStringStable row id, e.g. "docker.available" or "build.nixpacks".
labelString
severityServerReadinessSeverity

ServerReadinessReport

A live, never-persisted answer to 'is this host set up to run deployments?'. Assembled from one agent Hello, two host port bind-tests and one host-metrics call, plus the control plane's own record of the server. It is NOT a sixth ServerStatus and nothing gates on it - the deploy gate is and stays the mandatory live Hello pre-flight.

FieldTypeDescription
checkedAtStringWhen the probe STARTED (ISO). Never fabricated.
checks[ServerReadinessCheck!]
serverIdString
serverNameString
summaryStringOne sentence for the banner.
verdictServerReadinessVerdict

ServerRemoval

The result of removing a server. Removal revokes the agent's trust and forgets the row - it does NOT uninstall anything on the host, so the uninstall command is always returned.

FieldTypeDescription
uninstallCommandStringPaste-on-the-server command that removes the agent, Traefik and the Deplo network from the host. Deplo cannot do this remotely: revoking trust is precisely what ends its right to command that agent.
warningStringA non-blocking hazard the operator must know about (e.g. an App was mid-move off this host, so its data volumes are now stranded there), or null.

ServerRestartReport

The outcome of restarting everything Deplo runs on a server. Partial success is normal and is reported as such - one wedged stack must not hide that the other twenty came back.

FieldTypeDescription
failures[RestartedWorkload!]
restartedInt
skippedIntWorkloads left alone: the ones already stopped (starting them is a different action than restarting them) and the ones with a deploy in flight, which come back on their own.

ServerUninstall

The result of uninstalling the agent from a MIGRATION SOURCE. Unlike ServerRemoval this one DOES touch the host - it is the only case where Deplo installed the agent on a machine that is not part of the fleet, so taking it back off is Deplo's job and not the operator's.

FieldTypeDescription
errorStringWhy the uninstall did not happen, or null. Surface it verbatim.
removedBooleanTrue when the host is clean AND the server row is gone. False leaves both in place - the agent is still installed there, and pretending otherwise would strand a running agent nobody can see.
uninstallCommandStringThe host-side command, returned in both cases: on success so the operator can verify, on failure because it is then the only way through.
warningStringA non-blocking hazard, same meaning as on ServerRemoval, or null.

SharedVar

A shared environment variable (ADR-0010/0012/0027). Secret values are masked. Team / environment / project scopes say who it is AVAILABLE to, and it injects only through explicit per-app links (opt-in) - UNLESS autoInject, which is what reaching more than one team means.

FieldTypeDescription
appIds[ID!]
apps[SharedVarApp!]
autoInjectBooleanInjects into every app of every team it reaches, with no per-app link, at the LOWEST precedence. True when it reaches more than one team.
createdAtString
createdByVarAuthor
editableBooleanThe viewer's team owns it. A variable shared IN from another team is read-only here, and its project/environment/app ids come back empty.
environmentIds[ID!]
environments[SharedVarEnvironment!]
idID
keyString
maskedBoolean
ownerTeamSharedVarTeamThe owning team; null when the instance owns it.
projectIds[ID!]
projects[SharedVarProject!]
targets[EnvTarget!]Deploy runtimes this variable applies to.
teamIds[ID!]
teamWideBooleanIt reaches the VIEWER's team.
teams[SharedVarTeam!]
typeEnvVarType
updatedAtString
updatedByVarAuthor
valueString

SharedVarApp

FieldTypeDescription
idID
nameString
slugString

SharedVarEnvironment

FieldTypeDescription
idID
nameString
projectNameString

SharedVarProject

FieldTypeDescription
idID
nameString
slugString

SharedVarTeam

FieldTypeDescription
idID
nameString

Takeover

The takeover this instance is in the middle of. Null on an ordinary install.

FieldTypeDescription
dataLoss[String!]Services of every finished run that arrived without their data. The cutover stops the old panel for good (its volumes stay on the disk, unread), so requestTakeover refuses unless acceptDataLoss says so.
errorStringWhy the last cutover rolled back, in the installer's words. Null unless the state is failed.
platformTakeoverPlatform
runIdString
seenExternalRequestBooleanWhether anything but the installer has ever reached this panel. False means its port is probably closed, not that nobody has looked.
stateTakeoverState

TakeoverCancelResult

FieldTypeDescription
left[String!]The ones that would not start, with the reason.
restartedIntHow many services were started again on the platform being kept.

TakeoverPreflight

What a takeover of this machine is walking into. Both halves are things that otherwise only show up mid-copy.

FieldTypeDescription
agentMessageString
agentReadyBooleanWhether the agent on this machine answers a live probe. Without it no volume can be read at all.
diskFreeBytesFloat
diskTightBooleanThe copy writes a second copy of every volume it moves, and this machine has little room for one. A warning with the real numbers, never a refusal.
diskTotalBytesFloat

Team

A team that owns apps, infra and members.

FieldTypeDescription
avatarUrlStringThe team's picture, or null for its two-letter monogram. A team has no email, so there is no Gravatar step.
createdAtString
idID
nameString
planTeamPlan
requireTwoFactorBooleanWhether every member of this team must have two-factor authentication.
slugString

TeamMembership

A team the viewer belongs to, carrying their role and the team size.

FieldTypeDescription
avatarUrlString
createdAtString
idID
memberCountInt
nameString
planTeamPlan
roleString
slugString

TeamRole

A named capability set members of the active team can be assigned. Three defaults (owner/member/viewer) plus any number the team authors itself.

FieldTypeDescription
builtinKeyRoleSet for one of the three default roles; null for a role the team created.
capabilities[Capability!]Exactly what a member holding this role can do. view is always included.
createdAtString
descriptionString
idID
lockedBooleanThe Owner default: always full access, not editable, so a team can never edit its way out of administering itself.
memberCountInt
modifiedBooleanA default role edited away from what Deplo ships - it can be reset.
nameString
requireTwoFactorBooleanHolders of this role must have two-factor authentication; without it they resolve no capabilities at all, over the UI and the API alike.
scopeRoleScopeWhere in the team this role reaches. Null means the whole of it, which is every role until one is limited. A scoped role also loses every capability that only means something team-wide.

TemplateVariantSummary

A compact, deployable variant from the public template catalog.

FieldTypeDescription
categoryString
docsUrlString
nameString
shortDescriptionString
templateSlugString
variantNameString
variantSlugString

TwoFactorEnrolment

A pending enrolment: the secret to scan and the codes to save. Two-factor is not on until confirmTwoFactorEnrolment succeeds.

FieldTypeDescription
recoveryCodes[String!]Single-use codes, shown this once and never again.
totpUriStringThe otpauth:// URI an authenticator app scans.

UpdateInfo

Result of checking the upstream GitHub repository for a newer Deplo release.

FieldTypeDescription
checkedAtString
currentString
errorString
latestString
nameString
publishedAtString
updateAvailableBoolean
urlString

UserDetail

Full per-user detail for the admin editor - the email IS included here.

FieldTypeDescription
avatarColorString
avatarUrlStringResolved profile picture: uploaded image, else Gravatar, else null for the monogram.
canExposePortsBoolean
canMountHostVolumesBoolean
createdAtString
emailString
isInstanceAdminBoolean
isInstanceOwnerBooleanOwns the instance. Their account is editable only by themselves.
nameString
passkeyCountIntHow many passkeys they hold. Only above zero is resetUserPasskeys offered.
suspendedBoolean
teams[UserDetailTeam!]
twoFactorEnabledBooleanHas an authenticator app enrolled. Only then is resetUserTwoFactor offered.
userIdID
usernameString

UserDetailTeam

FieldTypeDescription
roleRole
teamAvatarUrlString
teamIdID
teamNameString

UserSearchResult

A registered user matched by username/display name when adding members.

FieldTypeDescription
avatarColorString
avatarUrlStringResolved profile picture: uploaded image, else Gravatar, else null for the monogram.
nameString
teamAvatarUrlString
teamNameString
userIdID
usernameString

UserSession

A browser or client currently signed in to the viewer's account. Carries no credential - a session is addressed by its id, never by its token.

FieldTypeDescription
browserStringThe client half of label, e.g. "Chrome". Null when the user agent matched nothing.
createdAtString
currentBooleanThis is the session making the request. It cannot be revoked from here; sign out instead.
deviceDeviceKind
expiresAtString
idID
ipAddressString
labelStringHuman description, e.g. "Chrome on macOS".
lastSeenAtStringWhen the session was last refreshed, which stands in for last used. Accurate to about 15 minutes.
osStringThe platform half of label, e.g. "macOS" or "iPhone".

UserTeamAccess

What one person can do in one team, as an instance admin sets it.

FieldTypeDescription
baseCapabilities[Capability!]The set on the membership - their own when they hold one, else their role's.
customCapabilitiesBooleanThat set is theirs, so saving their role no longer rewrites it.
granularBooleanTheir reach IS the nodes below: they touch those and nothing else, whatever their role reaches. Stored as the admin's choice, so deleting the last granted node doesn't silently turn it off.
isFounderBooleanThe team's primary owner. Their access can't be changed by anyone, instance admins included.
nodes[AccessNodeGrant!]
rankStringowner outranks everyone; anything else ranks as a member.
roleIdID
roleNameString
teamIdID
teamNameString

VarAuthor

The user who created or last modified a variable. Identity only, never an email.

FieldTypeDescription
avatarColorString
avatarUrlStringResolved profile picture: uploaded image, else Gravatar, else null for the monogram. Derived server-side, so the address itself never travels.
idID
nameString
usernameString

Viewer

The authenticated principal for the current request.

FieldTypeDescription
avatarColorString
avatarUrlStringResolved profile picture: uploaded image, else Gravatar, else null for the monogram.
emailString
idID
isInstanceAdminBoolean
nameString
roleString
twoFactorEnabledBooleanWhether this account has a verified second factor. Says only that one exists, never anything about it.
usernameString

Volume

A persistent volume mounted into an app - a docker named volume, an app-files bind, or a host bind mount.

FieldTypeDescription
hostPathString
idID
mountPathString
nameString
projectPathString
propagationMountPropagation
readOnlyBoolean
serviceString
typeString

Did this page help you?

On this page

AccessNodeGrantActivityAddServerPayloadApiTokenAppAppEnvGroupAppEnvGroupAppAppPreviewAppPreviewsViewAppRuntimeAppSharedVarAppStorageFileAppTransferInfoAppTransferTargetAuthPayloadBackupBackupDestinationBackupDestinationOptionBackupRunBasicAuthUserBuildServerChoiceBulkAppActionResultCertificateAccountComposeNameClashConsoleInfoConsoleInstanceContainerInstanceMetricsContainerMetricsContainerMetricsSampleCreateTokenPayloadCronJobCronJobsViewCronRunDatabaseDatabaseMountDeleteUserImpactDeleteUserKeptTeamDeleteUserResultDeleteUserTeamImpactDeploChangelogDeploReleaseDeploymentDestinationRemovalImpactDestinationTestResultDockerCleanupPolicyDockerCleanupRunDockerCleanupRunItemDomainEnvImportResultEnvironmentEnvVarExecResultFleetServerMetricsFleetSparkFolderFolderGrantFolderShareCandidateGitConnectionGithubAppGithubConnectStartGithubInstallationGithubPullRequestGithubRepoGitProviderGitRepoSummaryGlobalUserHealthCheckHostPortCheckInstanceSettingsLogLineLogsInfoMcpSettingsMcpTeamMemberMigrationDataMoveResultMigrationDataServiceMigrationDataVolumeMigrationInviteMigrationPlanMigrationPlanEnvironmentMigrationPlanMemberMigrationPlanProjectMigrationPlanServerMigrationPlanServiceMigrationProjectResultMigrationRecopySourceMigrationRevertResultMigrationRunMigrationRunItemMigrationSourceTeamMonitoringSettingsPanelAddressImpactPanelDnsPanelHttpsPasskeyPreviewEnvVarProjectPublishedPortRecognizedFrameworkRecoveryKeyRegistrationLinkRegistryResourceLimitsRestartedWorkloadRoleScopeRuntimeContainerS3TestLogLineS3TestReportS3TestStepSearchAppSearchCronSearchDatabaseSearchDomainSearchEnvironmentSearchFolderSearchMemberSearchProjectSearchResultsSearchRoleSearchServerSearchTeamSearchTemplateServerServerCertificateServerHostInfoServerMetricsServerReadinessCheckServerReadinessReportServerRemovalServerRestartReportServerUninstallSharedVarSharedVarAppSharedVarEnvironmentSharedVarProjectSharedVarTeamTakeoverTakeoverCancelResultTakeoverPreflightTeamTeamMembershipTeamRoleTemplateVariantSummaryTwoFactorEnrolmentUpdateInfoUserDetailUserDetailTeamUserSearchResultUserSessionUserTeamAccessVarAuthorViewerVolume