I'm trying to switch SQLite to PostgreSQL and keep getting connection error when I try to build the docker container to start the app. Can you help me figure out what I'm doing wrong. Below is the error and relevant code.
`=> ERROR [appseed-app 9/9] RUN python manage.py migrate 1.4s
[appseed-app 9/9] RUN python manage.py migrate:
1.340 Traceback (most recent call last):
1.340 File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 289, in ensure_connection
1.340 self.connect()
1.340 File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
1.340 return func(*args, **kwargs)
1.340 File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 270, in connect
1.340 self.connection = self.get_new_connection(conn_params)
1.340 File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
1.340 return func(*args, **kwargs)
1.340 File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 275, in get_new_connection
1.340 connection = self.Database.connect(**conn_params)
1.340 File "/usr/local/lib/python3.10/site-packages/psycopg2/init.py", line 122, in connect
1.340 conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
1.340 psycopg2.OperationalError: connection to server at "localhost" (::1), port 5432 failed: Connection refused
1.340 Is the server running on that host and accepting TCP/IP connections?
1.340 connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused
1.340 Is the server running on that host and accepting TCP/IP connections?
1.340
1.340
1.340 The above exception was the direct cause of the following exception:
1.340
1.340 Traceback (most recent call last):
1.340 File "//manage.py", line 22, in
1.340 main()
1.340 File "//manage.py", line 18, in main
1.340 execute_from_command_line(sys.argv)
1.340 File "/usr/local/lib/python3.10/site-packages/django/core/management/init.py", line 442, in execute_from_command_line
1.340 utility.execute()
1.340 File "/usr/local/lib/python3.10/site-packages/django/core/management/init.py", line 436, in execute
1.340 self.fetch_command(subcommand).run_from_argv(self.argv)
1.340 File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 412, in run_from_argv
1.341 self.execute(*args, **cmd_options)
1.341 File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 458, in execute
1.341 output = self.handle(*args, **options)
1.341 File "/usr/local/lib/python3.10/site-packages/django/core/management/base.py", line 106, in wrapper
1.341 res = handle_func(*args, **kwargs)
1.341 File "/usr/local/lib/python3.10/site-packages/django/core/management/commands/migrate.py", line 117, in handle
1.341 executor = MigrationExecutor(connection, self.migration_progress_callback)
1.341 File "/usr/local/lib/python3.10/site-packages/django/db/migrations/executor.py", line 18, in init
1.341 self.loader = MigrationLoader(self.connection)
1.341 File "/usr/local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 58, in init
1.341 self.build_graph()
1.341 File "/usr/local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 235, in build_graph
1.341 self.applied_migrations = recorder.applied_migrations()
1.341 File "/usr/local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 81, in applied_migrations
1.341 if self.has_table():
1.341 File "/usr/local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 57, in has_table
1.341 with self.connection.cursor() as cursor:
1.341 File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
1.341 return func(*args, **kwargs)
1.341 File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 330, in cursor
1.341 return self._cursor()
1.341 File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 306, in _cursor
1.342 self.ensure_connection()
1.342 File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
1.342 return func(*args, **kwargs)
1.342 File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 288, in ensure_connection
1.342 with self.wrap_database_errors:
1.342 File "/usr/local/lib/python3.10/site-packages/django/db/utils.py", line 91, in exit
1.342 raise dj_exc_value.with_traceback(traceback) from exc_value
1.342 File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 289, in ensure_connection
1.342 self.connect()
1.342 File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
1.342 return func(*args, **kwargs)
1.342 File "/usr/local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 270, in connect
1.342 self.connection = self.get_new_connection(conn_params)
1.342 File "/usr/local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner
1.342 return func(*args, **kwargs)
1.342 File "/usr/local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 275, in get_new_connection
1.342 connection = self.Database.connect(**conn_params)
1.342 File "/usr/local/lib/python3.10/site-packages/psycopg2/init.py", line 122, in connect
1.342 conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
1.342 django.db.utils.OperationalError: connection to server at "localhost" (::1), port 5432 failed: Connection refused
1.342 Is the server running on that host and accepting TCP/IP connections?
1.342 connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused
1.342 Is the server running on that host and accepting TCP/IP connections?`
My docker-compose looks like:
`version: "3.8"
services:
appseed-app:
container_name: appseed-app
restart: always
build:
context: .
networks:
- db_network
- web_network
environment:
DATABASE_URL: postgresql://postgres:password@postgres:5432/dbname
depends_on:
postgres:
condition: service_healthy
nginx:
container_name: nginx
restart: always
image: "nginx:latest"
ports:
- "5085:5085"
volumes:
- ./nginx:/etc/nginx/conf.d
networks:
- web_network
depends_on:
- appseed-app
redis:
image: redis:7.0.12
container_name: redis
command: ["redis-server", "--port", "6379", "--slave-read-only", "no"]
restart: always
ports:
- 6379:6379
networks:
- db_network
celery:
container_name: celery
restart: always
build:
context: .
networks:
- db_network
environment:
DJANGO_SETTINGS_MODULE: "core.settings"
command: "celery -A apps.tasks worker -l info -B"
depends_on:
- appseed-app
- redis
postgres:
container_name: postgres
image: postgres:13
environment:
POSTGRES_DB: dbname
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
expose:
- 5432
networks:
- db_network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
networks:
db_network:
driver: bridge
web_network:
driver: bridge
volumes:
postgres_data:
`
Dockerfile
`FROM python:3.10.4
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y postgresql-client
COPY requirements.txt .
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN python manage.py collectstatic --no-input
RUN python manage.py makemigrations
RUN python manage.py migrate
EXPOSE 5005
CMD ["gunicorn", "--config", "gunicorn-cfg.py", "core.wsgi"]
`
database settings in settings.py
`DB_ENGINE = os.getenv('DB_ENGINE' , None)
DB_USERNAME = os.getenv('DB_USERNAME' , None)
DB_PASS = os.getenv('DB_PASS' , None)
DB_HOST = os.getenv('DB_HOST' , None)
DB_PORT = os.getenv('DB_PORT' , None)
DB_NAME = os.getenv('DB_NAME' , None)
if DB_ENGINE and DB_NAME and DB_USERNAME:
DATABASES = {
'default': {
'ENGINE' : 'django.db.backends.' + DB_ENGINE,
'NAME' : DB_NAME,
'USER' : DB_USERNAME,
'PASSWORD': DB_PASS,
'HOST' : DB_HOST,
'PORT' : DB_PORT,
},
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'db.sqlite3',
}
}`
And finally the variables in .env:
DB_ENGINE=postgresql
DB_NAME=dbname
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=postgres
DB_PASS='password'
I'm trying to switch SQLite to PostgreSQL and keep getting connection error when I try to build the docker container to start the app. Can you help me figure out what I'm doing wrong. Below is the error and relevant code.
`=> ERROR [appseed-app 9/9] RUN python manage.py migrate 1.4s
My docker-compose looks like:
`version: "3.8"
services:
appseed-app:
container_name: appseed-app
restart: always
build:
context: .
networks:
- db_network
- web_network
environment:
DATABASE_URL: postgresql://postgres:password@postgres:5432/dbname
depends_on:
postgres:
condition: service_healthy
nginx:
container_name: nginx
restart: always
image: "nginx:latest"
ports:
- "5085:5085"
volumes:
- ./nginx:/etc/nginx/conf.d
networks:
- web_network
depends_on:
- appseed-app
redis:
image: redis:7.0.12
container_name: redis
command: ["redis-server", "--port", "6379", "--slave-read-only", "no"]
restart: always
ports:
- 6379:6379
networks:
- db_network
celery:
container_name: celery
restart: always
build:
context: .
networks:
- db_network
environment:
DJANGO_SETTINGS_MODULE: "core.settings"
command: "celery -A apps.tasks worker -l info -B"
depends_on:
- appseed-app
- redis
postgres:
container_name: postgres
image: postgres:13
environment:
POSTGRES_DB: dbname
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
expose:
- 5432
networks:
- db_network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
networks:
db_network:
driver: bridge
web_network:
driver: bridge
volumes:
postgres_data:
`
Dockerfile
`FROM python:3.10.4
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y postgresql-client
COPY requirements.txt .
RUN pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN python manage.py collectstatic --no-input
RUN python manage.py makemigrations
RUN python manage.py migrate
EXPOSE 5005
CMD ["gunicorn", "--config", "gunicorn-cfg.py", "core.wsgi"]
`
database settings in settings.py
`DB_ENGINE = os.getenv('DB_ENGINE' , None)
DB_USERNAME = os.getenv('DB_USERNAME' , None)
DB_PASS = os.getenv('DB_PASS' , None)
DB_HOST = os.getenv('DB_HOST' , None)
DB_PORT = os.getenv('DB_PORT' , None)
DB_NAME = os.getenv('DB_NAME' , None)
if DB_ENGINE and DB_NAME and DB_USERNAME:
DATABASES = {
'default': {
'ENGINE' : 'django.db.backends.' + DB_ENGINE,
'NAME' : DB_NAME,
'USER' : DB_USERNAME,
'PASSWORD': DB_PASS,
'HOST' : DB_HOST,
'PORT' : DB_PORT,
},
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'db.sqlite3',
}
}`
And finally the variables in .env:
DB_ENGINE=postgresql
DB_NAME=dbname
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=postgres
DB_PASS='password'