diff --git a/.env b/.env new file mode 100644 index 0000000000000000000000000000000000000000..b2a9161ecf171e3deda60760ac1120cdab811c53 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +SECRET_KEY='django-insecure-jkec5hkywvucsty25sh1q@_6l=zf+=yq$ilo&o86u1=qzsuk%i' +DEBUG=False \ No newline at end of file diff --git a/.gitignore b/.gitignore index 62d8d8e6172f6d8a35ab952cc6c3e9cafae4439a..e9f2424c2fc0752880648d08af3c02fb7d59a58b 100644 --- a/.gitignore +++ b/.gitignore @@ -150,3 +150,150 @@ backend/backend/static/admin/js/vendor/xregexp/xregexp.js backend/backend/static/admin/js/vendor/xregexp/xregexp.min.js backend/backend/photos/2024/11/05/Снимок_экрана_2024-11-05_в_21.45.21.png backend/.idea/vcs.xml +backend/.idea/workspace.xml +backend/backend/__pycache__/__init__.cpython-313.pyc +backend/backend/__pycache__/settings.cpython-313.pyc +backend/backend/__pycache__/urls.cpython-313.pyc +backend/backend/__pycache__/wsgi.cpython-313.pyc +backend/news/__pycache__/__init__.cpython-313.pyc +backend/news/__pycache__/admin.cpython-313.pyc +backend/news/__pycache__/apps.cpython-313.pyc +backend/news/__pycache__/generator.cpython-313.pyc +backend/news/__pycache__/models.cpython-313.pyc +backend/news/__pycache__/serializers.cpython-313.pyc +backend/news/__pycache__/urls.cpython-313.pyc +backend/news/__pycache__/views.cpython-313.pyc +backend/news/migrations/__pycache__/__init__.cpython-313.pyc +backend/news/migrations/__pycache__/0001_initial.cpython-313.pyc +backend/news/migrations/__pycache__/0002_news_description3.cpython-313.pyc +backend/news/migrations/__pycache__/0003_category_news_ispublished_news_photo_news_category.cpython-313.pyc +backend/news/migrations/__pycache__/0004_alter_category_options_alter_news_options_and_more.cpython-313.pyc +backend/static/admin/css/autocomplete.css +backend/static/admin/css/base.css +backend/static/admin/css/changelists.css +backend/static/admin/css/dark_mode.css +backend/static/admin/css/dashboard.css +backend/static/admin/css/forms.css +backend/static/admin/css/login.css +backend/static/admin/css/nav_sidebar.css +backend/static/admin/css/responsive_rtl.css +backend/static/admin/css/responsive.css +backend/static/admin/css/rtl.css +backend/static/admin/css/unusable_password_field.css +backend/static/admin/css/widgets.css +backend/static/admin/css/vendor/select2/LICENSE-SELECT2.md +backend/static/admin/css/vendor/select2/select2.css +backend/static/admin/css/vendor/select2/select2.min.css +backend/static/admin/img/calendar-icons.svg +backend/static/admin/img/icon-addlink.svg +backend/static/admin/img/icon-alert.svg +backend/static/admin/img/icon-calendar.svg +backend/static/admin/img/icon-changelink.svg +backend/static/admin/img/icon-clock.svg +backend/static/admin/img/icon-deletelink.svg +backend/static/admin/img/icon-hidelink.svg +backend/static/admin/img/icon-no.svg +backend/static/admin/img/icon-unknown-alt.svg +backend/static/admin/img/icon-unknown.svg +backend/static/admin/img/icon-viewlink.svg +backend/static/admin/img/icon-yes.svg +backend/static/admin/img/inline-delete.svg +backend/static/admin/img/LICENSE +backend/static/admin/img/README.txt +backend/static/admin/img/search.svg +backend/static/admin/img/selector-icons.svg +backend/static/admin/img/sorting-icons.svg +backend/static/admin/img/tooltag-add.svg +backend/static/admin/img/tooltag-arrowright.svg +backend/static/admin/img/gis/move_vertex_off.svg +backend/static/admin/img/gis/move_vertex_on.svg +backend/static/admin/js/actions.js +backend/static/admin/js/autocomplete.js +backend/static/admin/js/calendar.js +backend/static/admin/js/cancel.js +backend/static/admin/js/change_form.js +backend/static/admin/js/core.js +backend/static/admin/js/filters.js +backend/static/admin/js/inlines.js +backend/static/admin/js/jquery.init.js +backend/static/admin/js/nav_sidebar.js +backend/static/admin/js/popup_response.js +backend/static/admin/js/prepopulate_init.js +backend/static/admin/js/prepopulate.js +backend/static/admin/js/SelectBox.js +backend/static/admin/js/SelectFilter2.js +backend/static/admin/js/theme.js +backend/static/admin/js/unusable_password_field.js +backend/static/admin/js/urlify.js +backend/static/admin/js/admin/DateTimeShortcuts.js +backend/static/admin/js/admin/RelatedObjectLookups.js +backend/static/admin/js/vendor/jquery/jquery.js +backend/static/admin/js/vendor/jquery/jquery.min.js +backend/static/admin/js/vendor/jquery/LICENSE.txt +backend/static/admin/js/vendor/select2/LICENSE.md +backend/static/admin/js/vendor/select2/select2.full.js +backend/static/admin/js/vendor/select2/select2.full.min.js +backend/static/admin/js/vendor/select2/i18n/af.js +backend/static/admin/js/vendor/select2/i18n/ar.js +backend/static/admin/js/vendor/select2/i18n/az.js +backend/static/admin/js/vendor/select2/i18n/bg.js +backend/static/admin/js/vendor/select2/i18n/bn.js +backend/static/admin/js/vendor/select2/i18n/bs.js +backend/static/admin/js/vendor/select2/i18n/ca.js +backend/static/admin/js/vendor/select2/i18n/cs.js +backend/static/admin/js/vendor/select2/i18n/da.js +backend/static/admin/js/vendor/select2/i18n/de.js +backend/static/admin/js/vendor/select2/i18n/dsb.js +backend/static/admin/js/vendor/select2/i18n/el.js +backend/static/admin/js/vendor/select2/i18n/en.js +backend/static/admin/js/vendor/select2/i18n/es.js +backend/static/admin/js/vendor/select2/i18n/et.js +backend/static/admin/js/vendor/select2/i18n/eu.js +backend/static/admin/js/vendor/select2/i18n/fa.js +backend/static/admin/js/vendor/select2/i18n/fi.js +backend/static/admin/js/vendor/select2/i18n/fr.js +backend/static/admin/js/vendor/select2/i18n/gl.js +backend/static/admin/js/vendor/select2/i18n/he.js +backend/static/admin/js/vendor/select2/i18n/hi.js +backend/static/admin/js/vendor/select2/i18n/hr.js +backend/static/admin/js/vendor/select2/i18n/hsb.js +backend/static/admin/js/vendor/select2/i18n/hu.js +backend/static/admin/js/vendor/select2/i18n/hy.js +backend/static/admin/js/vendor/select2/i18n/id.js +backend/static/admin/js/vendor/select2/i18n/is.js +backend/static/admin/js/vendor/select2/i18n/it.js +backend/static/admin/js/vendor/select2/i18n/ja.js +backend/static/admin/js/vendor/select2/i18n/ka.js +backend/static/admin/js/vendor/select2/i18n/km.js +backend/static/admin/js/vendor/select2/i18n/ko.js +backend/static/admin/js/vendor/select2/i18n/lt.js +backend/static/admin/js/vendor/select2/i18n/lv.js +backend/static/admin/js/vendor/select2/i18n/mk.js +backend/static/admin/js/vendor/select2/i18n/ms.js +backend/static/admin/js/vendor/select2/i18n/nb.js +backend/static/admin/js/vendor/select2/i18n/ne.js +backend/static/admin/js/vendor/select2/i18n/nl.js +backend/static/admin/js/vendor/select2/i18n/pl.js +backend/static/admin/js/vendor/select2/i18n/ps.js +backend/static/admin/js/vendor/select2/i18n/pt-BR.js +backend/static/admin/js/vendor/select2/i18n/pt.js +backend/static/admin/js/vendor/select2/i18n/ro.js +backend/static/admin/js/vendor/select2/i18n/ru.js +backend/static/admin/js/vendor/select2/i18n/sk.js +backend/static/admin/js/vendor/select2/i18n/sl.js +backend/static/admin/js/vendor/select2/i18n/sq.js +backend/static/admin/js/vendor/select2/i18n/sr-Cyrl.js +backend/static/admin/js/vendor/select2/i18n/sr.js +backend/static/admin/js/vendor/select2/i18n/sv.js +backend/static/admin/js/vendor/select2/i18n/th.js +backend/static/admin/js/vendor/select2/i18n/tk.js +backend/static/admin/js/vendor/select2/i18n/tr.js +backend/static/admin/js/vendor/select2/i18n/uk.js +backend/static/admin/js/vendor/select2/i18n/vi.js +backend/static/admin/js/vendor/select2/i18n/zh-CN.js +backend/static/admin/js/vendor/select2/i18n/zh-TW.js +backend/static/admin/js/vendor/xregexp/LICENSE.txt +backend/static/admin/js/vendor/xregexp/xregexp.js +backend/static/admin/js/vendor/xregexp/xregexp.min.js +backend/.DS_Store +.DS_Store diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..b2002fff8a40587bffa2061739a9333c0337427d --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,18 @@ +FROM python:3.13.0 + +# .pyc запрет на их создание +ENV PYTHONDONTWRITEBYTECODE 1 + +# выводить сообщения с логами и ошибками +ENV PYTHONUNBUFFERED 1 + +RUN pip install --upgrade pip + +COPY requirements.txt requirements.txt + +RUN pip install -r requirements.txt +COPY . . + +COPY ./entrypoint.sh / + +ENTRYPOINT [ "sh", "/entrypoint.sh" ] \ No newline at end of file diff --git a/backend/backend/settings.py b/backend/backend/settings.py index 844bf9ebffae6355ecdc9f6111216ec959d58b45..5ad5266ae255dec3403abb0b5ed70fd374697000 100644 --- a/backend/backend/settings.py +++ b/backend/backend/settings.py @@ -30,7 +30,6 @@ DEBUG = True ALLOWED_HOSTS = ['*'] - # Application definition INSTALLED_APPS = [ @@ -172,11 +171,9 @@ USE_I18N = True USE_TZ = True - CORS_ALLOWED_ORIGINS = [ - "http://localhost:3000", - 'http://localhost:8000', 'http://localhost:3000', + 'http://localhost:8000', 'http://localhost:80', 'http://localhost', ] diff --git a/backend/backend/urls.py b/backend/backend/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..441df5c183d7cc953deff447d2a6565e1cee96cc --- /dev/null +++ b/backend/backend/urls.py @@ -0,0 +1,25 @@ +""" +URL configuration for testCustomApp project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/5.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static + +urlpatterns = [ + path('admin/', admin.site.urls), + path('news/', include('news.urls')) #localhost (domen:port)/news/hello -> function +] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh new file mode 100644 index 0000000000000000000000000000000000000000..84ac094945278ee63875ca5a4cb1b6a0e6e30c64 --- /dev/null +++ b/backend/entrypoint.sh @@ -0,0 +1,7 @@ +echo "!!collect our statics!!" + +python manage.py migrate --noinput + +python manage.py collectstatic --noinput + +exec "$@" \ No newline at end of file diff --git a/backend/manage.py b/backend/manage.py new file mode 100644 index 0000000000000000000000000000000000000000..4e61edf6595328020602d90b172bae078f6c036f --- /dev/null +++ b/backend/manage.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..0b9c196c87e05d6a010c9155c10639f3d772b9b9 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,25 @@ +asgiref==3.8.1 +certifi==2024.8.30 +cffi==1.17.1 +charset-normalizer==3.4.0 +cryptography==43.0.3 +defusedxml==0.8.0rc2 +Django==5.1.2 +django-cors-headers==4.6.0 +djangorestframework==3.15.2 +djangorestframework-simplejwt==5.3.1 +djoser==2.3.1 +gunicorn==23.0.0 +idna==3.10 +oauthlib==3.2.2 +packaging==24.2 +pillow==11.0.0 +pycparser==2.22 +PyJWT==2.10.0 +python3-openid==3.2.0 +requests==2.32.3 +requests-oauthlib==2.0.0 +social-auth-app-django==5.4.2 +social-auth-core==4.5.4 +sqlparse==0.5.1 +urllib3==2.2.3 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..a1ae12e12db898dcd9c669447fcac019b72c9f5b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,36 @@ +services: + backend: + container_name: backend + build: + context: ./backend + command: gunicorn backend.wsgi:application --bind 0.0.0.0:8000 + volumes: + - static:/usr/src/app/static + ports: + - "8000:8000" + env_file: + - .env + + frontend: + container_name: frontend + build: + context: ./react-app + depends_on: + - backend + ports: + - "3000:3000" + command: serve -s /usr/src/app/build -l 3000 + + nginx: + container_name: nginx + build: + context: ./nginx + depends_on: + - frontend + ports: + - "80:80" + volumes: + - static:/usr/src/app/static + +volumes: + static: \ No newline at end of file diff --git a/nginx/Dockerfile b/nginx/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..df3b3f4ffbe3c0c12b18a73edfbd6f1a48ae9571 --- /dev/null +++ b/nginx/Dockerfile @@ -0,0 +1,4 @@ +FROM nginx:latest + +RUN rm /etc/nginx/conf.d/default.conf +COPY nginx.conf /etc/nginx/conf.d \ No newline at end of file diff --git a/nginx/nginx.conf b/nginx/nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..919dc236111f690574ab7b466f8ca1ff4bfb73f5 --- /dev/null +++ b/nginx/nginx.conf @@ -0,0 +1,32 @@ +upstream backend { + server backend:8000; +} + +upstream frontend { + server frontend:3000; +} + +server { + listen 80; + + location /admin { + proxy_pass http://backend; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + proxy_redirect off; + } + + location /api { + proxy_pass http://backend; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + proxy_redirect off; + } + + location / { + proxy_pass http://frontend; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + proxy_redirect off; + } +} \ No newline at end of file diff --git a/react-app/Dockerfile b/react-app/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..a6b921f859aba08782d06dc3236bbcc64eeee2ae --- /dev/null +++ b/react-app/Dockerfile @@ -0,0 +1,11 @@ +FROM node:20.17 +WORKDIR /usr/src/app +COPY . . + +COPY ./package.json . +COPY ./package-lock.json . + +RUN npm install -g serve +RUN npm install + +RUN npm run build \ No newline at end of file