CARVIEW |
How to Update an App's Spec
Validated on 19 Oct 2023 • Last edited on 18 Dec 2024
App Platform is a Platform-as-a-Service (PaaS) offering that allows developers to publish code directly to DigitalOcean servers without worrying about the underlying infrastructure.
App Platform automatically generates a YAML file, called a “spec”, for each app deployed to App Platform. The spec defines the app’s configuration, such the app’s domain setup, regions, and environment variables.
You can edit the spec to change the app’s configuration, for example, you can edit the spec’s region
field to change the datacenter region where the app is deployed. You can review the spec file reference documentation for a full list of available fields and applicable values.
Update an App’s Spec using Automation
You can update an app’s spec using the CLI’s app update command or the API’s app update endpoint. To update a spec, include the updated spec as a JSON object in the request body of the API call, or use the CLI’s --spec
flag to specify the path to the updated spec file.
How to Update an App Spec Using the DigitalOcean CLI
- Install
doctl
, the official DigitalOcean CLI. - Create a personal access token and save it for use with
doctl
. - Use the token to grant
doctl
access to your DigitalOcean account.doctl auth init
- Finally, run
doctl apps update
. Basic usage looks like this, but you can read the usage docs for more details:The following example updates an app with the IDdoctl apps update <app id> [flags]
f81d4fae-7dec-11d0-a765-00a0c91e6bf6
using an app spec located in a directory called/src/your-app.yaml
. Additionally, the command returns the updated app’s ID, ingress information, and creation date:doctl apps update f81d4fae-7dec-11d0-a765-00a0c91e6bf6 --spec src/your-app.yaml --format ID,DefaultIngress,Created
How to Update an App Spec Using the DigitalOcean API
- Create a personal access token and save it for use with the API.
- Send a PUT request to
https://api.digitalocean.com/v2/apps/{id}
.
cURL
Using cURL:
curl -X PUT \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DIGITALOCEAN_TOKEN" \
"https://api.digitalocean.com/v2/apps/{id}" \
-d '{"alerts":[{"rule":"DEPLOYMENT_FAILED"},{"rule":"DOMAIN_FAILED"}],"domains":[{"domain":"example.com","type":"PRIMARY","zone":"example.com"}],"envs":[{"key":"API_KEY","scope":"RUN_AND_BUILD_TIME","type":"SECRET","value":"EV[1:zqiRIeaaYK/NqctZDYzy6t0pTrtRDez8:wqGpZRrsKN5nPhWQrS479cfBiXT0WQ==]"}],"features":["buildpack-stack=ubuntu-22"],"ingress":{},"name":"example-app","region":"nyc","services":[{"autoscaling":{"max_instance_count":4,"metrics":{"cpu":{"percent":70}},"min_instance_count":2},"git":{"branch":"main","repo_clone_url":"https://github.com/digitalocean/sample-nodejs.git"},"internal_ports":[8080],"log_destinations":[{"name":"your_log_consumer_name","open_search":{"endpoint":"logs.example.com:12345","basic_auth":{"user":"doadmin","password":"1234567890abcdef"},"index_name":"example-index","cluster_name":"example-cluster"}}],"name":"sample-nodejs","run_command":"yarn start","source_dir":"/"}]}'
Python
Using PyDo, the official DigitalOcean API client for Python:
import os
from pydo import Client
client = Client(token=os.environ.get("DIGITALOCEAN_TOKEN"))
req = {
"spec": {
"name": "web-app-01",
"region": "nyc",
"domains": [
{
"domain": "app.example.com",
"type": "DEFAULT",
"wildcard": True,
"zone": "example.com",
"minimum_tls_version": "1.3",
}
],
"services": [],
"static_sites": [
{
"cors": {
"allow_origins": [
{"exact": "https://www.example.com"},
{"regex": "^.*example.com"},
],
"allow_methods": [
"GET",
"OPTIONS",
"POST",
"PUT",
"PATCH",
"DELETE",
],
"allow_headers": ["Content-Type", "X-Custom-Header"],
"expose_headers": ["Content-Encoding", "X-Custom-Header"],
"max_age": "5h30m",
"allow_credentials": False,
},
"routes": [{"path": "/api", "preserve_path_prefix": True}],
}
],
"jobs": [
{
"name": "api",
"gitlab": {
"branch": "main",
"deploy_on_push": True,
"repo": "digitalocean/sample-golang",
},
"image": {
"registry": "registry.hub.docker.com",
"registry_type": "DOCR",
"repository": "origin/master",
"tag": "latest",
},
"dockerfile_path": "path/to/Dockerfile",
"build_command": "npm run build",
"run_command": "bin/api",
"source_dir": "path/to/dir",
"envs": [
{
"key": "BASE_URL",
"scope": "BUILD_TIME",
"type": "GENERAL",
"value": "https://example.com",
}
],
"environment_slug": "node-js",
"log_destinations": {
"name": "my_log_destination",
"papertrail": {
"endpoint": "https://mypapertrailendpoint.com"
},
"datadog": {
"endpoint": "https://mydatadogendpoint.com",
"api_key": "abcdefghijklmnopqrstuvwxyz0123456789",
},
"logtail": {
"token": "abcdefghijklmnopqrstuvwxyz0123456789"
},
"open_search": {
"endpoint": "https://myopensearchendpoint.com:9300"
"index_name": "logs"
"basic_auth": {
"user": "doadmin",
"password": "password"
}
},
},
"instance_count": 2,
"instance_size_slug": "apps-s-1vcpu-0.5gb",
"kind": "PRE_DEPLOY",
}
],
"workers": [
{
"name": "api",
"gitlab": {
"branch": "main",
"deploy_on_push": True,
"repo": "digitalocean/sample-golang",
},
"image": {
"registry": "registry.hub.docker.com",
"registry_type": "DOCR",
"repository": "origin/master",
"tag": "latest",
},
"dockerfile_path": "path/to/Dockerfile",
"build_command": "npm run build",
"run_command": "bin/api",
"source_dir": "path/to/dir",
"envs": [
{
"key": "BASE_URL",
"scope": "BUILD_TIME",
"type": "GENERAL",
"value": "https://example.com",
}
],
"environment_slug": "node-js",
"log_destinations": {
"name": "my_log_destination",
"papertrail": {
"endpoint": "https://mypapertrailendpoint.com"
},
"datadog": {
"endpoint": "https://mydatadogendpoint.com",
"api_key": "abcdefghijklmnopqrstuvwxyz0123456789",
},
"logtail": {
"token": "abcdefghijklmnopqrstuvwxyz0123456789"
},
"open_search": {
"endpoint": "https://myopensearchendpoint.com:9300"
"index_name": "logs"
"basic_auth": {
"user": "doadmin",
"password": "password"
}
},
},
"instance_count": 2,
"instance_size_slug": "apps-s-1vcpu-0.5gb",
}
],
"functions": [
{
"cors": {
"allow_origins": [
{"exact": "https://www.example.com"},
{"regex": "^.*example.com"},
],
"allow_methods": [
"GET",
"OPTIONS",
"POST",
"PUT",
"PATCH",
"DELETE",
],
"allow_headers": ["Content-Type", "X-Custom-Header"],
"expose_headers": ["Content-Encoding", "X-Custom-Header"],
"max_age": "5h30m",
"allow_credentials": False,
},
"routes": [{"path": "/api", "preserve_path_prefix": True}],
"name": "api",
"source_dir": "path/to/dir",
"alerts": [
{
"rule": "CPU_UTILIZATION",
"disabled": False,
"operator": "GREATER_THAN",
"value": 2.32,
"window": "FIVE_MINUTES",
}
],
"envs": [
{
"key": "BASE_URL",
"scope": "BUILD_TIME",
"type": "GENERAL",
"value": "https://example.com",
}
],
"gitlab": {
"branch": "main",
"deploy_on_push": True,
"repo": "digitalocean/sample-golang",
},
"log_destinations": {
"name": "my_log_destination",
"papertrail": {
"endpoint": "https://mypapertrailendpoint.com"
},
"datadog": {
"endpoint": "https://mydatadogendpoint.com",
"api_key": "abcdefghijklmnopqrstuvwxyz0123456789",
},
"logtail": {
"token": "abcdefghijklmnopqrstuvwxyz0123456789"
},
"open_search": {
"endpoint": "https://myopensearchendpoint.com:9300"
"index_name": "logs"
"basic_auth": {
"user": "doadmin",
"password": "password"
}
},
},
}
],
"databases": [
{
"cluster_name": "cluster_name",
"db_name": "my_db",
"db_user": "superuser",
"engine": "PG",
"name": "prod-db",
"production": True,
"version": "12",
}
],
}
}
update_resp = client.apps.update(id="bb245ba", body=req)
Update an App’s Spec from the Control Panel
To edit your app’s spec from the control panel, navigate to your app’s Overview page and then click the Settings tab. From the Settings tab, scroll to the App Spec section and click Edit. This opens the spec editor.
You can manually edit the spec in one of two ways:
- Edit the spec in your browser: Click inside the spec editor and make your changes as you would in a text editor. Once finished, click Save.
- Download and edit the spec: From the spec editor, click Download to download the spec to your local computer. Open the file in your preferred text editor and make your changes. Once finished, save the file and click Upload to upload the updated spec.
Once you have updated the spec and have saved or uploaded the changes, the app automatically redeploys with the new changes.
We can't find any results for your search.
Try using different keywords or simplifying your search terms.