configurate docker and docker compose
This commit is contained in:
38
.env.example
38
.env.example
@@ -0,0 +1,38 @@
|
|||||||
|
####################
|
||||||
|
# Secret key
|
||||||
|
####################
|
||||||
|
SECRET_KEY=key
|
||||||
|
|
||||||
|
####################
|
||||||
|
# Debug
|
||||||
|
####################
|
||||||
|
DEBUG=True
|
||||||
|
|
||||||
|
####################
|
||||||
|
# Allowed hosts
|
||||||
|
####################
|
||||||
|
ALLOWED_HOSTS=localhost,127.0.0.1
|
||||||
|
|
||||||
|
###################
|
||||||
|
# Database
|
||||||
|
###################
|
||||||
|
POSTGRES_PASSWORD=password
|
||||||
|
POSTGRES_USER=postgres
|
||||||
|
POSTGRES_DB=uyqur_db
|
||||||
|
POSTGRES_HOST=db
|
||||||
|
POSTGRES_PORT=5432
|
||||||
|
|
||||||
|
###################
|
||||||
|
# Port
|
||||||
|
###################
|
||||||
|
PORT=8000 # optional -> default 8001
|
||||||
|
|
||||||
|
###################
|
||||||
|
# Command
|
||||||
|
###################
|
||||||
|
COMMAND=sh ./resources/entrypoint.sh # optional
|
||||||
|
|
||||||
|
###################
|
||||||
|
# Redis
|
||||||
|
###################
|
||||||
|
REDIS_URL=redis://redis:6379/0
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import os, environ
|
||||||
|
|
||||||
|
|
||||||
|
environ.Env.read_env(os.path.join(".env"))
|
||||||
|
|
||||||
|
env = environ.Env(
|
||||||
|
|
||||||
|
)
|
||||||
@@ -1,17 +1,7 @@
|
|||||||
"""
|
|
||||||
Django settings for config project.
|
|
||||||
|
|
||||||
Generated by 'django-admin startproject' using Django 5.2.4.
|
|
||||||
|
|
||||||
For more information on this file, see
|
|
||||||
https://docs.djangoproject.com/en/5.2/topics/settings/
|
|
||||||
|
|
||||||
For the full list of settings and their values, see
|
|
||||||
https://docs.djangoproject.com/en/5.2/ref/settings/
|
|
||||||
"""
|
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
from config.env import env
|
||||||
|
|
||||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||||
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
||||||
|
|
||||||
@@ -20,12 +10,12 @@ BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
|||||||
# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/
|
# See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/
|
||||||
|
|
||||||
# SECURITY WARNING: keep the secret key used in production secret!
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
SECRET_KEY = 'django-insecure-6%*k%_mx!*x&%$y0n*=d)_y-$@qk9#*5ez0#3_4_7fx6ew7(%x'
|
SECRET_KEY = env.str('SECRET_KEY')
|
||||||
|
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
DEBUG = True
|
DEBUG = env.bool('DEBUG')
|
||||||
|
|
||||||
ALLOWED_HOSTS = []
|
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
|
||||||
|
|
||||||
|
|
||||||
# Application definition
|
# Application definition
|
||||||
@@ -74,8 +64,13 @@ WSGI_APPLICATION = 'config.wsgi.application'
|
|||||||
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
'default': {
|
'default': {
|
||||||
'ENGINE': 'django.db.backends.sqlite3',
|
'ENGINE': 'django.db.backends.postgresql',
|
||||||
'NAME': BASE_DIR / 'db.sqlite3',
|
'NAME': env.str('POSTGRES_DB'),
|
||||||
|
'USER': env.str('POSTGRES_USER'),
|
||||||
|
'PASSWORD': env.str('POSTGRES_PASSWORD'),
|
||||||
|
'HOST': env.str('POSTGRES_HOST'),
|
||||||
|
'PORT': env.str('POSTGRES_PORT'),
|
||||||
|
'CONN_MAX_AGE': 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,19 +97,22 @@ AUTH_PASSWORD_VALIDATORS = [
|
|||||||
# Internationalization
|
# Internationalization
|
||||||
# https://docs.djangoproject.com/en/5.2/topics/i18n/
|
# https://docs.djangoproject.com/en/5.2/topics/i18n/
|
||||||
|
|
||||||
LANGUAGE_CODE = 'en-us'
|
LANGUAGE_CODE = 'uz'
|
||||||
|
|
||||||
TIME_ZONE = 'UTC'
|
TIME_ZONE = 'Asia/Tashkent'
|
||||||
|
|
||||||
USE_I18N = True
|
USE_I18N = True
|
||||||
|
|
||||||
USE_TZ = True
|
USE_TZ = False
|
||||||
|
|
||||||
|
|
||||||
# Static files (CSS, JavaScript, Images)
|
# Static files (CSS, JavaScript, Images)
|
||||||
# https://docs.djangoproject.com/en/5.2/howto/static-files/
|
# https://docs.djangoproject.com/en/5.2/howto/static-files/
|
||||||
|
|
||||||
STATIC_URL = 'static/'
|
STATIC_URL = 'static/'
|
||||||
|
STATIC_ROOT = BASE_DIR / 'resources/static'
|
||||||
|
MEDIA_URL = 'media/'
|
||||||
|
MEDIA_ROOT = BASE_DIR / 'resources/media'
|
||||||
|
|
||||||
# Default primary key field type
|
# Default primary key field type
|
||||||
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field
|
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
networks:
|
||||||
|
uyqur:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
pg_data: null
|
||||||
|
|
||||||
|
services:
|
||||||
|
nginx:
|
||||||
|
networks:
|
||||||
|
- uyqur
|
||||||
|
ports:
|
||||||
|
- ${PORT:-8001}:80
|
||||||
|
volumes:
|
||||||
|
- ./resources/layout/nginx.conf:/etc/nginx/nginx.conf
|
||||||
|
- ./resources/:/usr/share/nginx/html/resources/
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: ./docker/Dockerfile.nginx
|
||||||
|
depends_on:
|
||||||
|
- web
|
||||||
|
|
||||||
|
web:
|
||||||
|
networks:
|
||||||
|
- uyqur
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: ./docker/Dockerfile.web
|
||||||
|
restart: always
|
||||||
|
command: ${COMMAND:-sh ./resources/scripts/entrypoint.sh}
|
||||||
|
environment:
|
||||||
|
- PYTHONPYCACHEPREFIX=/var/cache/pycache
|
||||||
|
volumes:
|
||||||
|
- './:/code'
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: postgres:17
|
||||||
|
networks:
|
||||||
|
- uyqur
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||||
|
POSTGRES_USER: ${POSTGRES_USER}
|
||||||
|
POSTGRES_DB: ${POSTGRES_DB}
|
||||||
|
volumes:
|
||||||
|
- pg_data:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
redis:
|
||||||
|
networks:
|
||||||
|
- uyqur
|
||||||
|
restart: always
|
||||||
|
image: redis
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
FROM nginx:alpine
|
||||||
|
|
||||||
|
COPY ./resources/layout/nginx.conf /etc/nginx/nginx.conf
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
FROM python:3.12
|
||||||
|
|
||||||
|
WORKDIR /code
|
||||||
|
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y \
|
||||||
|
gdal-bin \
|
||||||
|
libgdal-dev \
|
||||||
|
python3-gdal \
|
||||||
|
libgeos-dev \
|
||||||
|
libproj-dev \
|
||||||
|
g++ \
|
||||||
|
make \
|
||||||
|
wkhtmltopdf && \
|
||||||
|
apt-get clean && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
RUN gdalinfo --version
|
||||||
|
|
||||||
|
COPY ./ /code
|
||||||
|
RUN --mount=type=cache,target=/root/.cache/pip python3 -m pip install -r requirements.txt
|
||||||
|
|
||||||
|
CMD ["sh", "./resources/scripts/entrypoint.sh"]
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
asgiref==3.9.1
|
||||||
|
click==8.2.1
|
||||||
|
Django==5.2.4
|
||||||
|
django-environ==0.12.0
|
||||||
|
gunicorn==23.0.0
|
||||||
|
h11==0.16.0
|
||||||
|
packaging==25.0
|
||||||
|
psycopg2-binary==2.9.10
|
||||||
|
sqlparse==0.5.3
|
||||||
|
uvicorn==0.35.0
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
FROM python:3.13-alpine
|
||||||
|
|
||||||
|
ENV PYTHONPYCACHEPREFIX=/dev/null
|
||||||
|
|
||||||
|
RUN apk update && apk add git gettext
|
||||||
|
|
||||||
|
WORKDIR /code
|
||||||
|
|
||||||
|
COPY requirements.txt /code/requirements.txt
|
||||||
|
|
||||||
|
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt
|
||||||
|
|
||||||
|
CMD ["sh", "./entrypoint.sh"]
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
FROM nginx:alpine
|
||||||
|
|
||||||
|
COPY ./resources/layout/nginx.conf /etc/nginx/nginx.conf
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
worker_processes 1;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
|
'$status $body_bytes_sent "$http_referer" '
|
||||||
|
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||||
|
access_log /var/log/nginx/access.log main;
|
||||||
|
|
||||||
|
sendfile on;
|
||||||
|
tcp_nopush on;
|
||||||
|
tcp_nodelay on;
|
||||||
|
keepalive_timeout 65;
|
||||||
|
types_hash_max_size 2048;
|
||||||
|
client_max_body_size 1024M;
|
||||||
|
|
||||||
|
# Server block for handling requests
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://web:8000;
|
||||||
|
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 https;
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
}
|
||||||
|
location /ws/ {
|
||||||
|
proxy_pass http://web:8000; # Uvicorn serveri ishga tushadigan port
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection 'upgrade';
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /static/ {
|
||||||
|
alias /usr/share/nginx/html/resources/staticfiles/;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /media/ {
|
||||||
|
alias /usr/share/nginx/html/resources/media/;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
5
resources/scripts/backup.sh
Normal file
5
resources/scripts/backup.sh
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
file=/tmp/db-$(/usr/bin/date +\%Y-%m-%d-%H:%M:%S).sql
|
||||||
|
container=postgres
|
||||||
|
/usr/bin/docker container exec $container pg_dump -U postgres django > $file
|
||||||
|
mc cp $file b2/buket-name
|
||||||
|
rm $file
|
||||||
8
resources/scripts/entrypoint-server.sh
Normal file
8
resources/scripts/entrypoint-server.sh
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
python3 manage.py collectstatic --noinput
|
||||||
|
python3 manage.py migrate --noinput
|
||||||
|
|
||||||
|
gunicorn config.wsgi:application -b 0.0.0.0:8000 --workers $(($(nproc) * 2 + 1))
|
||||||
|
|
||||||
|
|
||||||
|
exit $?
|
||||||
7
resources/scripts/entrypoint.sh
Normal file
7
resources/scripts/entrypoint.sh
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
python3 manage.py collectstatic --noinput
|
||||||
|
python3 manage.py migrate --noinput
|
||||||
|
|
||||||
|
uvicorn config.asgi:application --host 0.0.0.0 --port 8000 --reload-dir core --reload-dir config
|
||||||
|
|
||||||
|
exit $?
|
||||||
Reference in New Issue
Block a user