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

При развертывании сайта Django на сервере AWS EC2 я получаю ошибку

Не установлена переменная окружения DATABASE_URL, а значит, не настроены базы данных.

Я создал файл gunicon.service на моем сервере в месте /home/ubuntu/lighthousemedia/LightHouseMediaAgency и установил EnvironmentFile=/home/ubuntu/lighthousemedia/LightHouseMediaAgency/.env для получения переменных окружения и в том же месте я создал .env файл, который содержит DATABASE_URL = postgresql://postgres:password@lighthousemediadb.crte3456.ap-south-1.rds.amazonaws.com:5432/dbname. Я считаю, что файл .env находится в правильном месте. Также проверьте, что моя база данных установлена правильно.

production.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'lighthousemediadb',
        'USER': "postgres",
        'PASSWORD': os.environ.get('DB_PASSWORD'),  # dont keep it hardcoded in production
        'HOST': os.environ.get('DB_HOST'),
        'PORT': '5432',

        # add these too it improve performance slightly
        'client_encoding': 'UTF8',
        'default_transaction_isolation': 'read committed',
        'timezone': 'UTC'
    }
}

import dj_database_url
db_from_env = dj_database_url.config()
DATABASES['default'].update(db_from_env)
DATABASES['default']['CONN_MAX_AGE'] = 500

gunicorn.service


    [Unit]
    Description=gunicorn daemon
    Requires=gunicorn.socket
    After=network.target
    
    [Service]
    User=ubuntu
    Group=www-data
    EnvironmentFile=/home/ubuntu/lighthousemedia/LightHouseMediaAgency/.env
    WorkingDirectory=/home/ubuntu/lighthousemedia/LightHouseMediaAgency
    ExecStart=/home/ubuntu/lighthousemedia/.venv/bin/gunicorn \
              --access-logfile - \
              --workers 3 \
              --bind unix:/run/gunicorn.sock \
              BE.wsgi:application
    
    [Install]
    WantedBy=multi-user.target

.env

    SECRET_KEY = 'epmxxxxxxxxxxxxu$0'
    DEBUG = True
    ALLOWED_HOSTS = '3.196.58.181', 'abc.com', 'localhost', '127.0.0.1'
    DB_PASSWORD = 'password'
    DB_HOST = 'lighthousemediadb.crte3456.ap-south-1.rds.amazonaws.com'
    DATABASE_URL = postgresql://postgres:password@lighthousemediadb.crte3456.ap-south-1.rds.amazonaws.com:5432/dbname
$ lxc launch ubuntu:22.04 ub22
Creating ub22
Starting ub22
$ lxc shell ub22
# apt-get update && apt-get install -y python3-virtualenv
...
# sudo su - ubuntu
$ mkdir lighthousemedia && cd lighthousemedia
$ virtualenv .venv && . .venv/bin/activate
(.venv)$ pip install django gunicorn
(.venv)$ django-admin startproject myproj && cd myproj
(.venv)$ ./manage.py migrate

myproj/views.py:

from django.conf import settings
from django.http import HttpResponse

ENVVAR = "MYVAR"


def show_envvar_setting(request):
    value = getattr(settings, ENVVAR, '<not defined in settings>')
    return HttpResponse(f'{ENVVAR}={value}', content_type='text/plain')

myproj/urls.py:

from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('envvar/', views.show_envvar_setting),
]

myproj/settings.py:

...
import os
MYVAR = os.environ.get('MYVAR', '<not definen in environment>')
...

Тест с 2 разными клеммами.

  • терминал 1: (.venv)$ /manage runserver
  • терминал 2: $ wget -O- -nv http://localhost:8000/envvar/ 2>/dev/null

Повторный запуск теста с определением env var:

  • терминал 1: (.venv)$ MYVAR='testing 1234'
  • терминал 2: запустите wget снова, чтобы увидеть вывод

Создайте .env: файл и установите systemd config:

echo "MYVAR='systemd env file test'" > ~/.env

/etc/systemd/system/gunicorn.service:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=www-data
EnvironmentFile=/home/ubuntu/lighthousemedia/.env
WorkingDirectory=/home/ubuntu/lighthousemedia/myproj
ExecStart=/home/ubuntu/lighthousemedia/.venv/bin/gunicorn \
      --access-logfile - \
      --workers 2 \
      myproj.wsgi:application

[Install]
WantedBy=multi-user.target

Запустите службу и проверьте:

# systemctl daemon-reload   # force reload if systemd files have changed
# systemctl start gunicorn
# journalctl -xeu gunicorn.service
...  # check if it's running and no errors happen
# wget -O- http://localhost:8000/envvar 2>/dev/null

Проверьте, что переменная окружения была выведена.

Итак, к моему выводу, у вас может быть ошибка в нашем .env файле. Я бы определенно дважды проверил синтаксис файла .env (строка ALLOWED_HOSTS может быть неправильной) и файл settings.py. Вы можете записать это в лог в stdout или stderr, используя print (так что это будет частью журналов systemd).

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