diff --git a/Dockerfile b/Dockerfile index bee1b28f..2230ffda 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,32 +1,30 @@ -# FROM python:3.10.0-alpine3.15 -FROM python:3.14.2-alpine3.12 +FROM python:3.14.2-slim WORKDIR /usr/src/app -RUN apk add --update --no-cache \ +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PIP_NO_CACHE_DIR=1 + +RUN apt-get update && apt-get install -y --no-install-recommends \ git \ - build-base \ - openldap-dev \ - python3-dev \ - postgresql-dev \ - jpeg-dev \ + build-essential \ + libldap2-dev \ + libsasl2-dev \ + libpq-dev \ + libjpeg-dev \ + zlib1g-dev \ libxml2-dev \ - libxslt-dev \ + libxslt1-dev \ libmemcached-dev \ - zlib-dev \ - && rm -rf /var/cache/apk/* - -## For alpine 3.15 replace postgresql-dev with libpq-dev - -# FIX https://github.com/python-ldap/python-ldap/issues/432 -RUN echo 'INPUT ( libldap.so )' > /usr/lib/libldap_r.so + && rm -rf /var/lib/apt/lists/* COPY requirements.txt ./ -# Pillow seems to need LIBRARY_PATH set as follows: (see: https://github.com/python-pillow/Pillow/issues/1763#issuecomment-222383534) -RUN LIBRARY_PATH=/lib:/usr/lib /bin/sh -c "pip install --no-cache-dir -r requirements.txt --no-deps" +RUN LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:/usr/lib \ + pip install --no-cache-dir -r requirements.txt --no-deps -COPY ./ . -COPY entrypoint.sh / +COPY . . -ENTRYPOINT ["/entrypoint.sh" ] + +CMD ["gunicorn", "--workers", "1", "--bind", "0.0.0.0:8000", "dynamicweb.wsgi:application"] \ No newline at end of file diff --git a/deploy/nginx/deploy.conf b/deploy/nginx/deploy.conf new file mode 100644 index 00000000..e87011f6 --- /dev/null +++ b/deploy/nginx/deploy.conf @@ -0,0 +1,22 @@ +server { + listen 80; + + server_name 185.203.114.147; + + location /static/ { + alias /usr/src/app/staticfiles/; + } + + location /media/ { + alias /usr/src/app/media/; + } + + location / { + proxy_pass http://web:8000; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index f6586d26..0c7f20f4 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,95 +1,128 @@ services: - -db: -image: postgres:16 -restart: unless-stopped - - -env_file: - - .env - -environment: - POSTGRES_DB: ${POSTGRES_DB} - POSTGRES_USER: ${POSTGRES_USER} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - -volumes: - - postgres_data:/var/lib/postgresql/data - -networks: - - backend - -healthcheck: - test: - [ - "CMD-SHELL", - "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}" - ] - interval: 10s - timeout: 5s - retries: 5 - - -web: -build: . - - -restart: unless-stopped - -env_file: - - .env - -environment: - POSTGRES_HOST: db - POSTGRES_PORT: 5432 - -command: > - gunicorn dynamicweb.wsgi:application - --bind 0.0.0.0:8000 - --workers 3 - --access-logfile - - --error-logfile - - -volumes: - - static_data:/app/staticfiles - - media_data:/app/media - -expose: - - "8000" - -depends_on: db: - condition: service_healthy + image: postgres:16 + restart: unless-stopped -networks: - - backend + env_file: + - .env + environment: + POSTGRES_DB: app + POSTGRES_USER: postgres + POSTGRES_HOST_AUTH_METHOD: trust -nginx: -image: nginx:alpine + volumes: + - postgres_data:/var/lib/postgresql/data + healthcheck: + test: + [ + "CMD-SHELL", + "pg_isready -U $${POSTGRES_USER} -d app" + ] + interval: 10s + timeout: 5s + retries: 5 -restart: unless-stopped + networks: + - backend -ports: - - "80:80" + redis: + image: redis:7-alpine + restart: unless-stopped + + volumes: + - redis_data:/data + + command: redis-server --appendonly yes + + networks: + - backend + + web: + build: + context: . + + restart: unless-stopped + + env_file: + - .env + + environment: + POSTGRES_HOST: db + POSTGRES_PORT: 5432 + POSTGRES_DB: app + + CELERY_BROKER_URL: redis://redis:6379/0 + CELERY_RESULT_BACKEND: redis://redis:6379/1 + + volumes: + - static_data:/usr/src/app/staticfiles + - media_data:/usr/src/app/media + + expose: + - "8000" + + depends_on: + db: + condition: service_healthy + redis: + condition: service_started + + networks: + - backend + + celery: + build: + context: . + + restart: unless-stopped + + env_file: + - .env + + environment: + POSTGRES_HOST: db + POSTGRES_PORT: 5432 + POSTGRES_DB: app + + CELERY_BROKER_URL: redis://redis:6379/0 + CELERY_RESULT_BACKEND: redis://redis:6379/1 + + command: celery -A dynamicweb worker --loglevel=info + + depends_on: + db: + condition: service_healthy + redis: + condition: service_started + + networks: + - backend + + nginx: + image: nginx:latest + restart: unless-stopped + + ports: + - "80:80" + + volumes: + - ./deploy/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro + - static_data:/usr/src/app/staticfiles:ro + - media_data:/usr/src/app/media:ro + + depends_on: + - web + + networks: + - backend volumes: - - ./deploy/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro - - static_data:/app/staticfiles:ro - - media_data:/app/media:ro - -depends_on: - - web + postgres_data: + redis_data: + static_data: + media_data: networks: - - backend - - -volumes: -postgres_data: -static_data: -media_data: - -networks: -backend: + backend: \ No newline at end of file diff --git a/dynamicweb/settings/base.py b/dynamicweb/settings/base.py index bc438891..9dd7cf48 100644 --- a/dynamicweb/settings/base.py +++ b/dynamicweb/settings/base.py @@ -259,6 +259,8 @@ DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'app', + "USER": "postgres", + "HOST": env("HOST"), } }