Не установлена переменная окружения 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).