From d8c1848cf4996a80ae72f9649d57adaf77706e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o?= Date: Thu, 6 Mar 2025 14:57:14 +0100 Subject: [PATCH] setup for production --- .dockerignore | 15 +++++++++++++++ DockerFile | 7 +++++++ StockSeeker/settings.py | 36 ++++++++++++++++++++++-------------- StockSeeker/urls.py | 1 - docker-compose.yml | 29 +++++++++++++++++++++++++++++ docs/Doc API Django REST.md | 2 ++ docs/schema_db.png | Bin 0 -> 26208 bytes requirements.txt | Bin 208 -> 586 bytes 8 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 .dockerignore create mode 100644 DockerFile create mode 100644 docker-compose.yml create mode 100644 docs/Doc API Django REST.md create mode 100644 docs/schema_db.png diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8d855b3 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,15 @@ +__pycache__ +*.pyc +*.pyo +*.pyd +*.db +*.log +*.sqlite3 +*.venv +.env +*.git +.git/ +docker-compose.yml +Dockerfile +.idea/ +.vscode/ \ No newline at end of file diff --git a/DockerFile b/DockerFile new file mode 100644 index 0000000..9d073d6 --- /dev/null +++ b/DockerFile @@ -0,0 +1,7 @@ +FROM python:3.11-slim +WORKDIR /app +COPY requirements.txt requirements.txt +RUN pip install --no-cache-dir -r requirements.txt +COPY . . +EXPOSE 8001 +CMD ["gunicorn", "--bind", "0.0.0.0:8000", "StockSeeker.wsgi:application"] diff --git a/StockSeeker/settings.py b/StockSeeker/settings.py index 5080865..b830d64 100644 --- a/StockSeeker/settings.py +++ b/StockSeeker/settings.py @@ -12,6 +12,7 @@ https://docs.djangoproject.com/en/5.1/ref/settings/ from pathlib import Path from datetime import timedelta from decouple import config +import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -20,12 +21,15 @@ BASE_DIR = Path(__file__).resolve().parent.parent # See https://docs.djangoproject.com/en/5.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = config('SECRET_KEY') +SECRET_KEY = os.environ.get('SECRET_KEY') # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = config('DEBUG') +DEBUG = os.environ.get('DEBUG', '0') == '1' + +ALLOWED_HOSTS = os.environ.get('DJANGO_ALLOWED_HOSTS', '127.0.0.1').split(',') +if '' in ALLOWED_HOSTS: + ALLOWED_HOSTS.remove('') -ALLOWED_HOSTS = ['localhost', '127.0.0.1','192.168.1.41'] # Application definition @@ -36,6 +40,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django_extensions', 'StockSeeker', 'rest_framework', 'drf_spectacular', @@ -81,11 +86,11 @@ WSGI_APPLICATION = 'StockSeeker.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', - 'NAME': config('DB_NAME'), - 'USER': config('DB_USER'), - 'PASSWORD': config('DB_PASSWORD'), - 'HOST': config('DB_HOST', default='localhost'), - 'PORT': config('DB_PORT', default='5432'), + 'NAME': os.environ.get('DB_NAME', 'postgres'), + 'USER': os.environ.get('DB_USER', 'postgres'), + 'PASSWORD': os.environ.get('DB_PASSWORD',''), + 'HOST': os.environ.get('DB_HOST','db'), + 'PORT': os.environ.get('DB_PORT','5432'), } } @@ -142,14 +147,17 @@ SPECTACULAR_SETTINGS = { 'DESCRIPTION': 'Doc de l’API pour StockSeeker', 'VERSION': '1.0.0', } -CORS_ALLOWED_ORIGINS = [ - "http://localhost:5173","http://192.168.1.41:5173","http://192.168.1.41" -] + +CORS_ALLOWED_ORIGINS = os.environ.get("CORS_ALLOWED_ORIGINS", "").split(",") +if '' in CORS_ALLOWED_ORIGINS: + CORS_ALLOWED_ORIGINS.remove('') + CORS_ALLOW_CREDENTIALS = True -CSRF_COOKIE_SECURE = False -CSRF_COOKIE_SAMESITE = "None" +CSRF_COOKIE_SECURE = True +CSRF_COOKIE_SAMESITE = "Lax" SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(days=1), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), 'ROTATE_REFRESH_TOKENS': True, - 'BLACKLIST_AFTER_ROTATION': True,} \ No newline at end of file + 'BLACKLIST_AFTER_ROTATION': True, + } \ No newline at end of file diff --git a/StockSeeker/urls.py b/StockSeeker/urls.py index 1ee43d1..a5d3f9f 100644 --- a/StockSeeker/urls.py +++ b/StockSeeker/urls.py @@ -6,7 +6,6 @@ from . import views from rest_framework_simplejwt.views import * from drf_spectacular.views import SpectacularAPIView -##juge pas les noms d'acces OK ?## router = routers.DefaultRouter() router.register(r'products', ProductView, basename='product') diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e0989c7 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,29 @@ +version: '3' + +services: + backend: + build: . + command: gunicorn --bind 0.0.0.0:8001 StockSeeker.wsgi:application + volumes: + - .:/app + ports: + - "8001:8000" + depends_on: + - stockseeker_db + environment: + - DB_HOST=${DB_HOST} + - DB_NAME=${DB_NAME} + - DB_USER=${DB_USER} + - DB_PASSWORD=${DB_PASSWORD} + + stockseeker_db: + image: postgres:latest + environment: + POSTGRES_DB: ${DB_NAME} + POSTGRES_USER: ${DB_USER} + POSTGRES_PASSWORD: ${DB_PASSWORD} + volumes: + - postgres_data:/var/lib/postgresql/data + +volumes: + postgres_data: \ No newline at end of file diff --git a/docs/Doc API Django REST.md b/docs/Doc API Django REST.md new file mode 100644 index 0000000..deeb17b --- /dev/null +++ b/docs/Doc API Django REST.md @@ -0,0 +1,2 @@ +# Documentation de l'API Django REST +## 1. Schéma de la base de données \ No newline at end of file diff --git a/docs/schema_db.png b/docs/schema_db.png new file mode 100644 index 0000000000000000000000000000000000000000..f41305aa262573dd916b25ca25c13376dacaf893 GIT binary patch literal 26208 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 Tw+S1rFqEAJrqok85WMp*LuQy=vmQ9S!oi3#= z#oUi_cykJ9w%QXSyKO~EvMJj3iU05cWE1>%%p%pU2Ck)2dE zj^9?3Lo(J>N)4<9)Pt9t_wl0jFd&9rq`cXf7KIUcEw4q|rdX0+D@VeIxZiFbA8Ii) z_LdN@3(Hp|klV^JhHfGoSKM0L2XLPL-Q8-9Frk3&Bc@;*tCwSS&-A(?#ae9 CeYP3^ literal 208 zcmYL@%?iRW5C-Qg_$Zbd74+cE7YY80)Y#U8KD;_f1qn-*%cHDhU b=C$?%t=%+aW~1ljj_4hKS+%Kio#8)U^s66%