Command line
cdnctl Reference
Complete reference for cdnctl (v0.12.x). All commands output JSON. Authentication token is stored in ~/.cdnctl/config.json or read from the CDNCTL_TOKEN and CDNCTL_ENDPOINT environment variables.
delete or revoke requires an explicit --yes flag. Without it the command exits with an error and makes no changes.
Install & Update
cdnctl ships as a static binary for Linux, macOS, and Windows (amd64/arm64). It requires no PHP, Python, Node.js, or kubectl.
install — package managers
# macOS and Linux (Homebrew)
brew install mediatriple/tap/cdnctl
# Debian / Ubuntu (signed APT repository)
curl -fsSL https://cdn.com.tr/downloads/cdn-com-tr.gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/cdn-com-tr.gpg
echo "deb [signed-by=/usr/share/keyrings/cdn-com-tr.gpg] \
https://cdn.com.tr/downloads/deb stable main" \
| sudo tee /etc/apt/sources.list.d/cdn-com-tr.list
sudo apt-get update && sudo apt-get install cdnctl
# RHEL / Fedora / Rocky (signed YUM repository)
sudo tee /etc/yum.repos.d/cdn-com-tr.repo >/dev/null <<'EOF'
[cdn-com-tr]
name=cdn.com.tr
baseurl=https://cdn.com.tr/downloads/rpm
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://cdn.com.tr/downloads/cdn-com-tr.gpg
EOF
sudo dnf install cdnctl
# Go toolchain
go install github.com/mediatriple/cdnctl@latest
Installed through a package manager, cdnctl upgrades with that package manager
(brew upgrade cdnctl, apt-get install --only-upgrade cdnctl,
dnf upgrade cdnctl) and cdnctl update deliberately steps aside,
so it never overwrites a file dpkg, rpm or Homebrew owns.
install — script or direct download
curl -fsSL https://cdn.com.tr/downloads/cdnctl/install.sh | sh
# pin a specific version
CDNCTL_VERSION=0.17.2 curl -fsSL https://cdn.com.tr/downloads/cdnctl/install.sh | sh
Downloads the latest release for your platform, verifies it against the published checksums, and installs the binary.
Archives for linux (amd64/arm64), macOS (amd64/arm64) and Windows (amd64), each with a SHA256 checksums file, are published at /downloads/cdnctl/ and on the GitHub releases page. cdnctl is open source: github.com/mediatriple/cdnctl (MIT).
update
cdnctl update --check
cdnctl update --yes
cdnctl update --version <version> --yes
Self-updates the installed binary from the public release channel. The downloaded archive is verified against the published checksum file before the binary is replaced.
| Flag | Description | |
|---|---|---|
| --check | optional | Only report whether a newer version exists; change nothing |
| --yes | optional | Apply the update without prompting |
| --version | optional | Update (or downgrade) to a specific version instead of latest |
| --bin-dir | optional | Install directory when the current binary path is not writable. Default fallback: $HOME/.local/bin. Env: CDNCTL_BIN_DIR |
Authentication & Configuration
login
cdnctl login [--password-login] [--email <email>] [--password <password>] [--endpoint <url>]
Signs in and saves a token to ~/.cdnctl/config.json. By default a browser opens and your account approves this terminal, so no password is typed into the CLI; add --password-login to sign in with email and password instead (this is also what happens automatically when there is no terminal, e.g. CI). Use once per machine; the token is reused for subsequent commands.
| Flag | Description | |
|---|---|---|
| --password-login | optional | Sign in with email and password instead of the browser (chosen automatically when there is no terminal, e.g. CI) |
| optional | Account email address | |
| --password | optional | Account password |
| --endpoint | optional | API base URL. Defaults to https://cdn.com.tr |
configure
cdnctl configure [--endpoint <url>] [--token <token>]
Manually sets the endpoint or token without logging in. Useful for CI environments or token-based automation.
| Flag | Description | |
|---|---|---|
| --endpoint | optional | API base URL |
| --token | optional | Bearer token. Alternatively set CDNCTL_TOKEN env var |
CDNCTL_TOKEN and CDNCTL_ENDPOINT override the config file and are useful for CI pipelines where writing to disk is not ideal.
Accounts
accounts list
cdnctl accounts list
Lists all CDN accounts accessible to the authenticated user (full JSON). The uuid field is used as --account in all other commands.
accounts ls
cdnctl accounts ls
A short, human-friendly version of the list — one line per account with just the uuid, domain, and type. Handy for finding the uuid to save as your default.
accounts use / current / clear
cdnctl accounts use <uuid>
cdnctl accounts current
cdnctl accounts clear
Save a default account once so you don't have to pass --account <uuid> on every command. After accounts use, account-scoped commands use the saved account automatically (they print (using saved account <uuid>) so you know which one); pass --account any time to override it. current shows it, clear forgets it.
File access (upload & manage your files)
Upload, list, and delete files in your managed WordPress site straight from the command line — no FTP, and no upload-size limit. Use this instead of a browser upload if you ever hit 413 Request Entity Too Large. Paths are relative to your site's wp-content, so you can reach uploads/, plugins/, themes/, and so on. You only ever see your own account's files.
Set your account once
cdnctl accounts use <uuid>
So the file commands below don't need --account every time. (Run cdnctl accounts ls to find your uuid.)
List files — files ls
cdnctl files ls # lists wp-content (uploads, plugins, themes, …)
cdnctl files ls --path uploads
cdnctl files ls --path uploads/2026
With no --path it lists the wp-content root.
Upload files — cp
cdnctl cp ./photo.jpg /uploads/photo.jpg
cdnctl cp ./backup.zip /uploads/backup.zip
cdnctl cp ./my-plugin.php /plugins/my-plugin/my-plugin.php
# upload a whole folder as one archive (structure is preserved):
cdnctl cp -r ./my-folder /uploads/my-folder
Add -r to upload a whole folder. It travels as one archive, not file by file, so even thousands of files take seconds; the folder structure is recreated under the destination, empty folders included, and every file is checked against its SHA-256 on the server before it is put in place. Existing files are not overwritten unless you add --force. You can also spell out the account inline as <uuid>:/uploads/photo.jpg instead of saving a default.
| Flag | Description | |
|---|---|---|
-r | Upload a directory recursively. | |
--force | Overwrite files that already exist. |
Download files — cp
cdnctl cp :/uploads/photo.jpg ./ # into the current folder
cdnctl cp :/plugins/my-plugin/my-plugin.php ./backup.php
cdnctl cp <account_uuid>:/uploads/photo.jpg ./ # a specific account
# download a whole folder recursively (its contents land in ./backup):
cdnctl cp -r :/uploads/2026 ./backup
# the same single-file download as an explicit sub-command:
cdnctl files get --path /uploads/photo.jpg --out ./photo.jpg
Put the remote path first, with a colon in front of it — the same order scp uses. : alone means your default account; write <account_uuid>:path for another one. The file lands in the folder you name (or at the file name you give). With -r a remote folder comes down as one archive into the local folder; -r with an empty path (<account_uuid>:) brings the whole storage. Every download is checked against its size and SHA-256 before anything is written; an existing local file is replaced only with --force. A single file (without -r) can be up to 10 MB.
Keep a folder in sync — sync
# upload what changed in ./my-theme (rsync-style, one direction):
cdnctl sync ./my-theme :/themes/my-theme
# download what changed on the server:
cdnctl sync :/uploads ./uploads-backup
# mirror, deleting what the source no longer has — look at the plan first:
cdnctl sync --delete --dry-run ./my-theme :/themes/my-theme
cdnctl sync --delete --exclude '*.log' ./my-theme :/themes/my-theme
# compare by SHA-256 instead of size and modification time:
cdnctl sync -c :/uploads ./uploads-backup
Works like rsync, in one direction: SOURCE and DESTINATION, exactly one of them remote. Only what differs is moved — by size and modification time, or by SHA-256 with -c — and modification times are kept, so a second run moves nothing. --delete also removes what the source no longer has (never the folder itself or excluded names, and nothing at all if anything in the run failed); --dry-run prints the plan (+ new, ~ changed, - deleted, ! skipped) without changing anything; --exclude leaves names out (*.log, /cache/). A trailing slash makes no difference: the contents of SOURCE always go into DESTINATION. Symbolic links are reported and left alone.
Create a folder — files mkdir
cdnctl files mkdir --path /uploads/2026/07
Delete a file — files rm
cdnctl files rm --path /uploads/photo.jpg --yes
Requires --yes. Only files can be deleted (directories are refused).
Container Apps
container apps list
cdnctl container apps list --account <uuid>
Lists all container apps under the account.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
container apps create
cdnctl container apps create \
--account <uuid> \
--name <name> \
--image <registry/image> \
[--tag <tag>] \
[--port <port>] \
[--healthcheck <path>] \
[--healthcheck-type http|tcp|none] \
[--metrics-port <port>] \
[--metrics-path <path>] \
[--replicas <n>] \
[--plan <code>] \
[--domain <domain>] \
[--env-json '{"KEY":"value"}'] \
[--secrets-json '{"SECRET":"value"}'] \
[--registry-credential <uuid>] \
[--persistent-mount-path <path>] \
[--persistent-storage-gb <n>]
Creates a new container app record and first revision. Does not deploy — run deploy after create.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --name | required | App name (slug-safe) |
| --image | required | Container image path, e.g. registry.example.com/acme/api |
| --tag | optional | Image tag. Default: empty string |
| --port | optional | Container port the app listens on. Default: 8080 |
| --healthcheck | optional | HTTP health check path. Default: /health |
| --healthcheck-type | optional | Health check type: http, tcp, or none |
| --metrics-port | optional | Port that exposes Prometheus metrics |
| --metrics-path | optional | Path that exposes Prometheus metrics, e.g. /metrics |
| --replicas | optional | Number of replicas. Default: 1 |
| --plan | optional | Resource plan code. Default: starter |
| --domain | optional | Custom domain to attach |
| --env-json | optional | JSON object of environment variables. Values are visible in GET responses. |
| --secrets-json | optional | JSON object of secrets. Values are encrypted and never returned after create. |
| --registry-credential | optional | UUID of a registry credential for private images |
| --persistent-mount-path | optional | Mount path for persistent volume, e.g. /app/data |
| --persistent-storage-gb | optional | Persistent volume size in GB |
--secrets-json are stored encrypted and are not returned in any GET response. Save them before running this command.
container apps update
cdnctl container apps update \
--account <uuid> \
--app <uuid> \
[--image <registry/image>] \
[--tag <tag>] \
[--port <port>] \
[--replicas <n>] \
[--healthcheck <path>] \
[--healthcheck-type http|tcp|none] \
[--metrics-port <port>] \
[--metrics-path <path>] \
[--domain <domain>] \
[--env-json '{"KEY":"value"}'] \
[--secrets-json '{"SECRET":"value"}'] \
[--registry-credential <uuid>] \
[--persistent-mount-path <path>]
Updates app settings. Only the flags you pass are changed. Run deploy after update to publish the new revision.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --image | optional | New image path |
| --tag | optional | New image tag |
| --port | optional | Container port |
| --replicas | optional | Number of replicas |
| --healthcheck | optional | Health check path |
| --healthcheck-type | optional | Health check type: http, tcp, or none |
| --metrics-port | optional | Port that exposes Prometheus metrics |
| --metrics-path | optional | Path that exposes Prometheus metrics |
| --domain | optional | Domain to attach. Pass empty string to remove. |
| --env-json | optional | Replaces all env vars with this JSON object |
| --secrets-json | optional | Replaces all secrets with this JSON object. Values are never returned. |
| --registry-credential | optional | Registry credential UUID. Pass empty string to remove. |
| --persistent-mount-path | optional | Persistent mount path. Pass empty string to disable. |
container apps deploy
cdnctl container apps deploy --account <uuid> --app <uuid>
Publishes the current configuration as a new revision. Use wait afterwards to block until the deployment reaches a target status.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
container apps expose
cdnctl container apps expose --account <uuid> --app <uuid>
Mints a permanent, immutable <uid>.cdn.com.tr subdomain for the app. The subdomain never changes even if a custom domain is updated.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
container apps restart
cdnctl container apps restart --account <uuid> --app <uuid>
Performs a rolling restart of all running replicas without creating a new revision.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
container apps scale
cdnctl container apps scale --account <uuid> --app <uuid> --replicas <n>
Changes the replica count immediately without creating a new revision. Pass 0 to scale the app to zero.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --replicas | required | Target replica count (use 0 to suspend the app) |
container apps show
cdnctl container apps show --account <uuid> --app <uuid>
Returns full app configuration including the list of revisions. Use the revision UUIDs from this output with rollback.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
container apps rollback
cdnctl container apps rollback --account <uuid> --app <uuid> --revision <revision_uuid>
Re-deploys a previous revision. Use show to list available revision UUIDs.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --revision | required | Revision UUID to roll back to (from show) |
container apps operations
cdnctl container apps operations --account <uuid> --app <uuid>
Lists all platform operations recorded for the app, such as deploys, restarts, and scale events.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
container apps status
cdnctl container apps status --account <uuid> --app <uuid>
Returns the current runtime status and last operation result of the app.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
container apps wait
cdnctl container apps wait \
--account <uuid> \
--app <uuid> \
--status <target> \
[--timeout <seconds>] \
[--interval <seconds>]
Polls app status until it reaches --status or the timeout expires. Exits 0 on success, 1 on failure or timeout. On failure, includes diagnose output automatically.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --status | required | Target status string, e.g. running |
| --timeout | optional | Max seconds to wait. Default: 300 |
| --interval | optional | Poll interval in seconds. Default: 5 |
container apps logs
cdnctl container apps logs --account <uuid> --app <uuid> [--tail <n>]
Returns recent container log lines.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --tail | optional | Number of log lines to return. Default: 100 |
container apps diagnose
cdnctl container apps diagnose --account <uuid> --app <uuid> [--tail <n>]
Returns a combined status and log snapshot. Used automatically by wait on failure. Run this first when an app is stuck or failing.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --tail | optional | Number of log lines to include. Default: 120 |
container apps delete
cdnctl container apps delete --account <uuid> --app <uuid> --yes
Permanently deletes the app and all its revisions. This operation is irreversible.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --yes | required | Explicit confirmation required for destructive operations |
Container Preflight
Run preflight before creating apps to verify that the account has all platform prerequisites satisfied (quotas, network policies, registry access, etc.).
container preflight
cdnctl container preflight --account <uuid>
Checks that the account is ready to run container workloads and returns a list of any issues found.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
Registry Credentials
Registry credentials are account-scoped and can be reused across apps. The password is stored encrypted and is never returned after create.
container registry-credentials list
cdnctl container registry-credentials list --account <uuid>
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
container registry-credentials create
cdnctl container registry-credentials create \
--account <uuid> \
--name <name> \
--password <token> \
[--registry-url <url>] \
[--username <user>]
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --name | required | Friendly name for this credential |
| --password | required | Registry password or access token |
| --registry-url | optional | Registry URL. Default: https://index.docker.io/v1/ |
| --username | optional | Registry username |
container registry-credentials delete
cdnctl container registry-credentials delete \
--account <uuid> \
--credential <credential_uuid> \
--yes
Permanently removes a registry credential. Any apps that reference this credential will fail to pull images on the next deploy.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --credential | required | Credential UUID from registry-credentials list |
| --yes | required | Explicit confirmation required for destructive operations |
Managed Add-ons
Add-ons are created and connected to the app automatically. Credentials are injected as environment variables — no manual host, port, or password entry needed. Run deploy after enabling or disabling an add-on.
container addons list
cdnctl container addons list --account <uuid> --app <uuid>
Lists all add-ons currently attached to the app.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
container addons enable-database
cdnctl container addons enable-database \
--account <uuid> \
--app <uuid> \
[--plan <code>] \
[--env-prefix <prefix>] \
[--storage-mb <n>] \
[--url-scheme <scheme>]
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --plan | optional | Resource plan code. Default: starter |
| --env-prefix | optional | Env var prefix for injected credentials. Default: DB |
| --storage-mb | optional | Storage size in MB |
| --url-scheme | optional | Database URL scheme for the DATABASE_URL var, e.g. mysql+pymysql. Default: mysql |
container addons disable-database
cdnctl container addons disable-database --account <uuid> --app <uuid>
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
container addons enable-redis
cdnctl container addons enable-redis \
--account <uuid> \
--app <uuid> \
[--plan <code>] \
[--env-prefix <prefix>]
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --plan | optional | Resource plan code. Default: starter |
| --env-prefix | optional | Env var prefix. Default: REDIS |
container addons disable-redis
cdnctl container addons disable-redis --account <uuid> --app <uuid>
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
container addons enable-postgres
cdnctl container addons enable-postgres \
--account <uuid> \
--app <uuid> \
[--plan <code>] \
[--env-prefix <prefix>] \
[--storage-mb <n>]
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --plan | optional | Resource plan code. Default: starter |
| --env-prefix | optional | Env var prefix for injected credentials. Default: DATABASE |
| --storage-mb | optional | Storage size in MB. Default: 10240 |
container addons disable-postgres
cdnctl container addons disable-postgres \
--account <uuid> \
--app <uuid> \
[--delete-data --confirmation <app_name>]
Disables the Postgres add-on. By default data is retained. Pass --delete-data together with --confirmation to permanently destroy all data.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --delete-data | optional | Permanently destroy all Postgres data |
| --confirmation | optional | App name to confirm data deletion when --delete-data is set |
container addons enable-nats
cdnctl container addons enable-nats \
--account <uuid> \
--app <uuid> \
[--plan <code>] \
[--env-prefix <prefix>] \
[--storage-mb <n>]
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --plan | optional | Resource plan code. Default: starter |
| --env-prefix | optional | Env var prefix for injected credentials. Default: NATS |
| --storage-mb | optional | JetStream storage size in MB. Default: 5120 |
container addons disable-nats
cdnctl container addons disable-nats \
--account <uuid> \
--app <uuid> \
[--delete-data]
Disables the NATS add-on. Pass --delete-data to permanently destroy all JetStream data.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --delete-data | optional | Permanently destroy all NATS JetStream data |
Compose Import
Import an existing docker-compose.yml as managed container apps. Services with a prebuilt image become apps; Redis, MySQL/MariaDB, Postgres, and NATS services are converted into managed add-ons attached to the apps that depend on them. Always run preview first — it shows the resulting plan, warnings, unsupported services, and whether the import fits your app quota, without creating anything.
container compose preview
cdnctl container compose preview --account <uuid> --file docker-compose.yml
Parses the compose file server-side and returns the import plan: apps to be created, add-on mappings, environment/secret key classification, warnings, unsupported services, and an entitlement check. Creates nothing. Secret values are never echoed back — only key names.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --file | required | Path to the compose file (max 256 KB) |
container compose apply
cdnctl container compose apply --account <uuid> --file docker-compose.yml --yes
Applies the import: creates the apps in dependency order and enables the mapped add-ons. All-or-nothing — if any app name conflicts with an existing app, or any service is unsupported (e.g. uses build:), nothing is created. Deploy each created app afterwards with container apps deploy.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --file | required | Path to the compose file (max 256 KB) |
| --yes | required | Confirms resource creation |
build: (push a prebuilt image instead), command/entrypoint overrides (bake into the image), env_file, file-based compose secrets, and more than one persistent mount per service. Host-side port numbers are ignored — public exposure uses the platform's domain and apps expose flow.
Imports
Imports must complete before deployment opens public routing. Use apps status or apps wait to track readiness after an import finishes.
container imports list
cdnctl container imports list --account <uuid> --app <uuid>
Lists all imports and their current status for the app.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
container imports database
cdnctl container imports database \
--account <uuid> \
--app <uuid> \
--file <path/to/dump.sql.gz>
Uploads and queues a gzip-compressed SQL dump for import into the managed database.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --file | required | Local path to .sql.gz file |
container imports files
cdnctl container imports files \
--account <uuid> \
--app <uuid> \
--file <path/to/archive.tar.gz> \
[--target-path <path>]
Uploads and extracts a tar.gz archive into the persistent volume.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --file | required | Local path to .tar.gz archive |
| --target-path | optional | Destination path inside the container. Default: /app/data |
container imports cancel
cdnctl container imports cancel \
--account <uuid> \
--app <uuid> \
--import <import_uuid>
Cancels a queued or in-progress import. Has no effect if the import has already completed.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --import | required | Import UUID from imports list |
Scheduled Jobs
Jobs are HTTP calls made on a cron schedule to an endpoint inside the app. Create them disabled, verify with run, then enable.
container jobs list
cdnctl container jobs list --account <uuid> --app <uuid>
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
container jobs create
cdnctl container jobs create \
--account <uuid> \
--app <uuid> \
--name <name> \
--schedule "<cron expression>" \
--path </endpoint/path> \
[--method <POST|GET>] \
[--secret-header-name <header>] \
[--secret-source <ENV_VAR>] \
[--enabled]
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --name | required | Job name |
| --schedule | required | Cron expression, e.g. */30 * * * * |
| --path | required | HTTP path to call, e.g. /jobs/run |
| --method | optional | HTTP method. Default: POST |
| --secret-header-name | optional | Header name to send the token in, e.g. X-Token |
| --secret-source | optional | Name of the app secret or env var whose value is sent as the header value |
| --enabled | optional | Create the job enabled. Omit to create disabled (recommended for first-time setup) |
container jobs run
cdnctl container jobs run \
--account <uuid> \
--app <uuid> \
--job <job_uuid> \
[--wait] \
[--timeout <seconds>] \
[--interval <seconds>]
Triggers an immediate one-off run of the job. Use --wait to block until the run completes or fails.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --job | required | Job UUID from jobs list |
| --wait | optional | Block until the run completes |
| --timeout | optional | Max seconds to wait when --wait is set. Default: 180 |
| --interval | optional | Poll interval in seconds. Default: 5 |
container jobs delete
cdnctl container jobs delete \
--account <uuid> \
--app <uuid> \
--job <job_uuid> \
--yes
Permanently removes the scheduled job.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --job | required | Job UUID from jobs list |
| --yes | required | Explicit confirmation required for destructive operations |
Object Storage
Use cdnctl for the control plane: creating buckets, access keys, and bindings. For reading and writing objects use any S3-compatible client pointed at https://s3.cdn.com.tr. See the Object Storage with AWS CLI guide.
object-storage buckets list
cdnctl object-storage buckets list --account <uuid>
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
object-storage buckets create
cdnctl object-storage buckets create \
--account <uuid> \
--name <bucket-name> \
[--visibility private|public]
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --name | required | Bucket name (globally unique within the platform) |
| --visibility | optional | private or public. Default: private |
object-storage buckets usage
cdnctl object-storage buckets usage --account <uuid> --bucket <bucket_uuid>
Returns current storage usage statistics for the bucket.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --bucket | required | Bucket UUID from buckets list |
object-storage buckets delete
cdnctl object-storage buckets delete --account <uuid> --bucket <bucket_uuid> --yes
Permanently deletes the bucket and all objects inside it. This operation is irreversible.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --bucket | required | Bucket UUID from buckets list |
| --yes | required | Explicit confirmation required for destructive operations |
object-storage access-keys create
cdnctl object-storage access-keys create \
--account <uuid> \
[--bucket <uuid>] \
[--name <name>]
Creates an S3-compatible access key. The secret_key field in the response is shown once and never returned again. Copy it before closing the terminal.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --bucket | optional | Bucket UUID to scope the key to |
| --name | optional | Friendly name for the key |
object-storage access-keys rotate
cdnctl object-storage access-keys rotate --account <uuid> --key <key_uuid>
Generates a new secret for the access key while keeping the same key UUID and bucket scope. The new secret_key is returned once and never again. Update any clients before rotating in production.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --key | required | Access key UUID from access-keys create |
object-storage access-keys revoke
cdnctl object-storage access-keys revoke --account <uuid> --key <key_uuid> --yes
Permanently revokes and deletes the access key. Any clients still using this key will receive authentication errors immediately.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --key | required | Access key UUID to revoke |
| --yes | required | Explicit confirmation required for destructive operations |
object-storage bindings create
cdnctl object-storage bindings create \
--account <uuid> \
--app <uuid> \
--bucket <uuid> \
[--access-key <uuid>] \
[--env-prefix <prefix>]
Binds a bucket to an app. S3 credentials and endpoint are injected as environment variables on the next deploy.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --bucket | required | Bucket UUID |
| --access-key | optional | Access key UUID to use for the binding |
| --env-prefix | optional | Env var prefix. Default: S3 |
object-storage bindings delete
cdnctl object-storage bindings delete \
--account <uuid> \
--app <uuid> \
--binding <binding_uuid> \
--yes
Removes the bucket binding from the app. The bucket and access key are not affected; only the environment variable injection is removed on the next deploy.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID |
| --app | required | App UUID |
| --binding | required | Binding UUID from bindings list or app show response |
| --yes | required | Explicit confirmation required for destructive operations |
CDN operations: purge, WAF and access logs
For sites delivered through the CDN: clear cached paths, read what the firewall blocked, and fetch or search the access logs your account receives. Switch access logs on in the panel (Access logs) before logs pull and logs grep can find anything.
purge
cdnctl purge --account <uuid> --path /sitemap.xml [--path /other] [--type exact|prefix|variants] [--save]
cdnctl purge --account <uuid> --paths "/a,/b,/c" [--type prefix]
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID. |
| --path | optional | A path to purge, e.g. /sitemap.xml. Repeat the flag for more paths. |
| --paths | optional | Several paths as one comma-separated list. |
| --type | optional | exact (default): only that URL. prefix: the path and everything under it. variants: every stored variant of the cache key. |
| --save | optional | Also keep the paths as a saved purge you can run again from the panel. |
purge all
cdnctl purge all --account <uuid> --yes
cdnctl purge all status --account <uuid>
Empties the account's entire edge cache; the next requests go to your origin. purge all status shows whether the last full purge has finished on every edge.
| Flag | Description | |
|---|---|---|
| --account | required | Account UUID. |
| --yes | required | Required: purge all empties the whole cache of the account. |
waf logs
cdnctl waf logs [--account <uuid>] [--range 1h|1d|7d|30d] [--format table|json]
What the WAF matched in the window: rules, countries, client IPs and response codes — the same numbers as the panel's WAF page.
| Flag | Description | |
|---|---|---|
| --account | optional | Account UUID. Defaults to the account saved with cdnctl accounts use. |
| --range | optional | Window: 1h (default), 1d, 7d or 30d. |
| --format | optional | table (default) or json. |
waf show
cdnctl waf show <ref> [--account <uuid>] [--format table|json]
One blocked request in detail. <ref> is the Reference ID on the block page your visitor saw (32 characters), or at least its first 12 characters as the panel table shows them. Searches the last 30 days of this account's sites and prints the request, every rule it matched with the matched data, and a verdict — for example whether an upload was blocked only because it was larger than the part of the body the WAF inspects. Exits with status 1 when nothing matches.
| Flag | Description | |
|---|---|---|
| --account | optional | Account UUID. Defaults to the account saved with cdnctl accounts use. |
| --format | optional | table (default) or json. |
logs status / logs list
cdnctl logs status [--account <uuid>]
cdnctl logs list [--account <uuid>] [--day YYYY-MM-DD] [--format table|json]
logs status shows whether delivery is on, whether IPs are masked and how many days files are kept. logs list lists one UTC day's files — one per edge per five minutes.
| Flag | Description | |
|---|---|---|
| --account | optional | Account UUID. Defaults to the account saved with cdnctl accounts use. |
| --day | optional | UTC day, YYYY-MM-DD. Default: today (UTC). |
| --format | optional | table (default) or json. |
logs pull
cdnctl logs pull [--account <uuid>] [--day YYYY-MM-DD] [--out <dir>]
Downloads every file of a UTC day into a folder. Running it again fetches only new files; the same folder is the cache logs grep uses.
| Flag | Description | |
|---|---|---|
| --account | optional | Account UUID. Defaults to the account saved with cdnctl accounts use. |
| --day | optional | UTC day, YYYY-MM-DD. Default: today (UTC). |
| --out | optional | Target folder. Default: cdntr-logs/<day>. |
logs grep
cdnctl logs grep --from "2026-09-25 14:00" --to "2026-09-25 15:00" \
--status 5xx --path /api/ --format table
cdnctl logs grep --from 14:00 --ip 203.0.113.0/24 --count
Searches a time window on your own computer: downloads only the five-minute files that overlap the window (skipping any already in the cache), then filters every line. Filters combine; without a filter every line in the window is printed. Output is the raw JSON lines, ready for jq.
| Flag | Description | |
|---|---|---|
| --from | required | Start of the window: 2026-09-25T14:00, "2026-09-25 14:00", 14:00 (today) or RFC 3339. A time without a zone is your computer's local time. |
| --to | optional | End of the window (exclusive), same formats. Default: now. |
| --ip | optional | Client address or CIDR block, e.g. 203.0.113.7 or 203.0.113.0/24. |
| --status | optional | Status code or class, comma-separated: 404, 5xx, 429,503. |
| --host | optional | Exact host name, e.g. www.example.com. |
| --path | optional | Text the request path must contain, e.g. /api/. |
| --method | optional | HTTP method, e.g. POST. |
| --cache | optional | Cache result: HIT, MISS, EXPIRED, STALE, BYPASS… |
| --country | optional | Two-letter country code of the client, e.g. TR. |
| --text | optional | Any text the raw line must contain (user agent, referer…). |
| --format | optional | json (default, one line per request) or table. |
| --count | optional | Print only the number of matching lines. |
| --cache-dir | optional | Local cache folder. Default: cdntr-logs, shared with logs pull. |