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]:

enter image description here

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.

Вернуться на верх