Платформа приложений DigitalOcean не анализирует ${db.DATABASE_URL} после массовых изменений в редакторе

Я использую платформу DigitalOcean App Platform для развертывания приложения Django. Первоначальное развертывание прошло нормально, но я попытался использовать массовый редактор переменных среды на уровне компонентов, и с тех пор при выполнении происходит сбой развертывания dj_database_url.config(default=config('DATABASE_URL').

Для отладки я добавил эту строку в settings.py:

print(f"[BUILD DEBUG] DATABASE_URL = {repr(os.environ.get('DATABASE_URL'))}")

Это возвращает [BUILD DEBUG] DATABASE_URL = '${db.DATABASE_URL}' в журналах сборки.

Я не понимаю, почему переменная окружения не разрешает проблему. Спецификация моего приложения выглядит следующим образом:

services:
- environment_slug: python
  envs:
  - key: DATABASE_URL
    scope: RUN_AND_BUILD_TIME
    value: ${db.DATABASE_URL}

Может ли это быть ошибкой или я делаю что-то не так? Да, моя база данных названа правильно:

databases:
- engine: PG
  name: db

Единственное, что изменилось между моим последним развертыванием и этим неудачным, помимо нескольких строк кода, это то, что я использовал массовый редактор для добавления новых переменных среды. Некоторые из существующих переменных среды были зашифрованы, но в спецификации приложения они выглядят нормально.

Синтаксис шаблона, например, ${db.DATABASE_URL}, не используется в файле спецификации приложения, он используется в панели управления Digital Ocean :

services:
  envs:
  - key: DATABASE_URL
    scope: RUN_AND_BUILD_TIME
    value: 'https://example.com'

Теперь в панели управления вы можете использовать синтаксис шаблона [docs]:

enter image description here

примечание: Я никогда не пользовался этой услугой.

Хотя это на самом деле не дает ответа на вопрос, почему мое приложение DigitalOcean вышло из строя только после использования массового редактора, я исправил свою проблему, поместив мое объявление DATABASES в блок try/except:

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',
        }
    }

Несмотря на элементарность, это работает как при разработке (где DATABASE_URL отсутствует в переменных среды), так и при производстве.

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