DigitalOcean App Platform does not parse ${db.DATABASE_URL} after bulk editor changes
I am using DigitalOcean App Platform to deploy a Django app. The initial deployment worked fine, but I've attempted to use the bulk editor on the component-level environment variables, and since then, the deployment fails when executing dj_database_url.config(default=config('DATABASE_URL')
.
For debugging, I added this line to settings.py
:
print(f"[BUILD DEBUG] DATABASE_URL = {repr(os.environ.get('DATABASE_URL'))}")
This returns [BUILD DEBUG] DATABASE_URL = '${db.DATABASE_URL}'
in the build logs.
I don't understand why the environment variable is not resolving. My app spec looks like this:
services:
- environment_slug: python
envs:
- key: DATABASE_URL
scope: RUN_AND_BUILD_TIME
value: ${db.DATABASE_URL}
Could this be a bug, or am I doing something wrong? Yes, my database is named correctly:
databases:
- engine: PG
name: db
The only thing that changed between my last deployment and this failed deployment, besides a few lines of code, is that I used the bulk editor to add new environment variables. Some of the existing environment variables were encrypted, but they look OK in the app spec.
The template syntax, eg. ${db.DATABASE_URL}
isn't used within the app specification file, it's used in Digital Ocean's control panel:
services:
envs:
- key: DATABASE_URL
scope: RUN_AND_BUILD_TIME
value: 'https://example.com'
Now in the control panel, you can use the template syntax [docs]:
note: I've never used this service.
While this doesn't really answer the question of why my DigitalOcean App only broke after using the bulk editor, I fixed my problem by wrapping my DATABASES
declaration in a try/except block:
database_url = config('DATABASE_URL', default=None, cast=str)
try:
DATABASES = {
'default': dj_database_url.config(
default=database_url, conn_max_age=600)
}
except Exception as e:
print(f"Failed to parse DATABASE_URL, using default SQLite. Reason: {e}")
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
Although rudimentary, this works in both development (where DATABASE_URL
is absent from the environment variables) and in production.