From d359cb97805cd3600a8295cf42831994391896ac Mon Sep 17 00:00:00 2001 From: WGAVermeer <90707235+WGAVermeer@users.noreply.github.com> Date: Fri, 6 Mar 2026 16:56:14 +0100 Subject: [PATCH] working database connection in Django --- .gitea/workflows/build.yaml | 23 ++++++++++++ Dockerfile | 9 ++--- compose.yaml | 41 ++++++++++++++++++++- docker-compose.dev.yml | 5 --- requirements.txt | 1 + src/website/settings.py | 73 ++++++++++++++++++++----------------- 6 files changed, 105 insertions(+), 47 deletions(-) create mode 100644 .gitea/workflows/build.yaml delete mode 100644 docker-compose.dev.yml diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml new file mode 100644 index 0000000..98192f8 --- /dev/null +++ b/.gitea/workflows/build.yaml @@ -0,0 +1,23 @@ +name: Gitea build & run. +run-name: ${{ gitea.actor }} +on: + push: + branches: + - main + +pull_request: + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Build and run tests + run: docker compose up + + + + + run: + name: run diff --git a/Dockerfile b/Dockerfile index 3447842..ec95d30 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,13 @@ FROM python:3.14-alpine -RUN mkdir /app - WORKDIR /app -RUN pip install --upgrade pip - COPY requirements.txt /app/ COPY gunicorn.conf.py /app/ -COPY ./app/ /app/ +COPY ./src/ /app/ -RUN pip install --no-cache-dir -r requirements.txt +RUN pip install --upgrade pip && \ + pip install --no-cache-dir -r requirements.txt EXPOSE 8000 diff --git a/compose.yaml b/compose.yaml index 792c9cb..a9bd279 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,9 +1,46 @@ services: web: build: . + depends_on: + - db ports: - 8000:8000 environment: - - PYTHONDONTWRITEBYTECODE=1 - - PYTHONUNBUFFERED=1 + PYTHONDONTWRITEBYTECODE: 1 + PYTHONUNBUFFERED: 1 + DJANGO_SETTINGS_MODULE: ${DJANGO_SETTINGS_MODULE} + POSTGRES_DB: ${DB_NAME} + POSTGRES_USER: ${DB_USER} + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_HOST: ${DB_HOST} + POSTGRES_PORT: ${DB_PORT} restart: unless-stopped + + db: + image: postgres:18 + environment: + POSTGRES_DB: ${DB_NAME} + POSTGRES_USER: ${DB_USER} + POSTGRES_PASSWORD: ${DB_PASSWORD} + volumes: + - postgres_data:/var/lib/postgresql + restart: unless-stopped + + adminer: + image: adminer + depends_on: + - db + restart: always + ports: + - 8080:8080 + + test: + build: . + command: python manage.py test + depends_on: + - db + profiles: + - test + +volumes: + postgres_data: diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml deleted file mode 100644 index a59e57d..0000000 --- a/docker-compose.dev.yml +++ /dev/null @@ -1,5 +0,0 @@ -services: - web: - volumes: - - ./app:/app - diff --git a/requirements.txt b/requirements.txt index 76a2a45..d340205 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ Django==6.0.3 gunicorn==25.1.0 +psycopg [binary] ==3.3.3 diff --git a/src/website/settings.py b/src/website/settings.py index cc91025..c3946b0 100644 --- a/src/website/settings.py +++ b/src/website/settings.py @@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/6.0/ref/settings/ """ from pathlib import Path +import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -20,7 +21,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent # See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-c$q7wdq+u@ow74wp!&zzkxdylkueu)(+34e%!e0du&bjwoqz9z' +SECRET_KEY = "django-insecure-c$q7wdq+u@ow74wp!&zzkxdylkueu)(+34e%!e0du&bjwoqz9z" # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True @@ -31,51 +32,55 @@ ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", ] MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', + "django.middleware.security.SecurityMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", ] -ROOT_URLCONF = 'website.urls' +ROOT_URLCONF = "website.urls" TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", ], }, }, ] -WSGI_APPLICATION = 'website.wsgi.application' +WSGI_APPLICATION = "website.wsgi.application" # Database # https://docs.djangoproject.com/en/6.0/ref/settings/#databases DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', + "default": { + "ENGINE": "django.db.backends.postgresql", + "NAME": os.getenv("POSTGRES_NAME"), + "USER": os.getenv("POSTGRES_USER"), + "PASSWORD": os.getenv("POSTGRES_PASSWORD"), + "HOST": os.getenv("POSTGRES_HOST"), + "PORT": os.getenv("POSTGRES_PORT"), } } @@ -85,16 +90,16 @@ DATABASES = { AUTH_PASSWORD_VALIDATORS = [ { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", }, ] @@ -102,9 +107,9 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/6.0/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = "en-us" -TIME_ZONE = 'UTC' +TIME_ZONE = "UTC" USE_I18N = True @@ -114,4 +119,4 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/6.0/howto/static-files/ -STATIC_URL = 'static/' +STATIC_URL = "static/"