From 8385e041035ea6515cc98e42f7b03b879ec0e394 Mon Sep 17 00:00:00 2001 From: erjemin Date: Tue, 31 Mar 2026 13:45:32 +0300 Subject: [PATCH] =?UTF-8?q?refactor:=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BD=D0=B5=D0=BD=D1=83=D0=B6=D0=BD=D0=B0=D1=8F?= =?UTF-8?q?=20=D0=BF=D0=B0=D0=BF=D0=BA=D0=B0=20logs=20=D0=9F=D1=80=D0=B8?= =?UTF-8?q?=D1=87=D0=B8=D0=BD=D1=8B:=20-=20=D0=92=20production=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8=20nginx=20=D1=85=D1=80=D0=B0=D0=BD=D1=8F?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D0=B2=20=D1=81=D0=B8=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=BC=D0=BD=D0=BE=D0=B9=20=D0=BF=D0=B0=D0=BF=D0=BA=D0=B5=20?= =?UTF-8?q?=D1=85=D0=BE=D1=81=D1=82=D0=B0=20-=20=D0=92=20dev=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B7=20=D0=BF=D0=BE=D1=81=D1=82=D0=BE=D1=8F?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D0=B8=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F,=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8=20=D0=BD=D0=B5=20=D0=BD=D0=B0=D0=BA=D0=B0?= =?UTF-8?q?=D0=BF=D0=BB=D0=B8=D0=B2=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20-=20?= =?UTF-8?q?=D0=9B=D0=BE=D0=B3=D0=B8=20=D0=BD=D0=B5=20=D0=BD=D1=83=D0=B6?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D0=B9=D0=BD=D0=B5=D1=80=D0=B5=20=D0=A3=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE:=20-=20=D0=9F=D0=B0=D0=BF=D0=BA=D0=B0=20logs?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D0=BA=D0=BE=D1=80=D0=BD=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20-=20mkdir=20-p=20/app/logs=20?= =?UTF-8?q?=D0=B8=D0=B7=20Dockerfile=20-=20=D0=9C=D0=BE=D0=BD=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20logs=20=D0=B8?= =?UTF-8?q?=D0=B7=20docker-compose.yml=20=D0=B8=20docker-compose.prod.yml?= =?UTF-8?q?=20-=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20TOUCH=5FRELOAD=20=D0=B8=D0=B7=20settings.py=20=D0=B8?= =?UTF-8?q?=20.env=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=20=D0=A0=D0=B5?= =?UTF-8?q?=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82:=20=D0=B1=D0=BE?= =?UTF-8?q?=D0=BB=D0=B5=D0=B5=20clean=20=D0=B8=20=D0=BC=D0=B8=D0=BD=D0=B8?= =?UTF-8?q?=D0=BC=D0=B0=D0=BB=D0=B8=D1=81=D1=82=D0=B8=D1=87=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=B0?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 3 +- .github/copilot-instructions.md | 9 ++++ .idea/.gitignore | 10 +++++ .idea/2024-test-rosmorport.iml | 29 ++++++++++++ .idea/copilot.data.migration.ask2agent.xml | 6 +++ .idea/copilotDiffState.xml | 45 +++++++++++++++++++ .idea/inspectionProfiles/Project_Default.xml | 10 +++++ .../inspectionProfiles/profiles_settings.xml | 6 +++ .idea/misc.xml | 7 +++ .idea/modules.xml | 8 ++++ .idea/vcs.xml | 7 +++ Dockerfile | 10 ++--- docker-compose.prod.yml | 1 - docker-compose.yml | 1 - logs/touchreload.txt | 1 - rosmorport_tsts/rosmorport_tsts/settings.py | 1 - rosmorport_tsts/rosmorport_tsts/wsgi.py | 9 +++- 17 files changed, 150 insertions(+), 13 deletions(-) create mode 100644 .github/copilot-instructions.md create mode 100644 .idea/.gitignore create mode 100644 .idea/2024-test-rosmorport.iml create mode 100644 .idea/copilot.data.migration.ask2agent.xml create mode 100644 .idea/copilotDiffState.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml delete mode 100644 logs/touchreload.txt diff --git a/.env.example b/.env.example index 5f02f51..1c2e45f 100644 --- a/.env.example +++ b/.env.example @@ -41,12 +41,11 @@ DB_NAME=db.sqlite3 # DB_PORT=3306 # ======================================== -# Пути для файлов (относительно проекта) +# Пути для файлов (относительно корня проекта) # ======================================== MEDIA_ROOT=public/media STATIC_ROOT=public/static SITEMAP_ROOT=public -TOUCH_RELOAD_PATH=logs/touchreload.txt # ======================================== # Настройки почты (опционально) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..4492c68 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,9 @@ +Вы - опытный помощник по программированию GitHub Copilot. +Всегда отвечай на русском языке, если не указано иное. +Комментируй код, который ты генерируешь, чтобы объяснить его функциональность на русском языке. +Не удаляй старые комментарии. Код которых хочешь удалить скрывай в комментариях. +При написании кода следуй стандартам PEP 8 для Python. +Используй современные возможности Python (3.12+) и Django (6.0+). +Предпочитай `poetry` для управления зависимостями. +Подробнее комментировать каждое действие. +Всегда спрашивай да/нет пред деплоем, git commit и git push. diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..ab1f416 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/2024-test-rosmorport.iml b/.idea/2024-test-rosmorport.iml new file mode 100644 index 0000000..b1e6b9a --- /dev/null +++ b/.idea/2024-test-rosmorport.iml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copilot.data.migration.ask2agent.xml b/.idea/copilot.data.migration.ask2agent.xml new file mode 100644 index 0000000..1f2ea11 --- /dev/null +++ b/.idea/copilot.data.migration.ask2agent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/copilotDiffState.xml b/.idea/copilotDiffState.xml new file mode 100644 index 0000000..e5b477f --- /dev/null +++ b/.idea/copilotDiffState.xml @@ -0,0 +1,45 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..d3b20ab --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f2a68b8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..793bf6f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..8306744 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 16966ad..e05d7b8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,10 +42,7 @@ ENV PATH="/opt/venv/bin:$PATH" COPY . . # Создаём необходимые директории -RUN mkdir -p /app/logs /app/public/media /app/public/static - -# Собираем статические файлы -RUN python rosmorport_tsts/manage.py collectstatic --noinput --clear || true +RUN mkdir -p /app/public/media /app/public/static /app/database # Устанавливаем пользователя для запуска приложения (из соображений безопасности) RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app @@ -54,6 +51,7 @@ USER appuser # Открываем порт EXPOSE 8000 -# Команда для запуска приложения (используем gunicorn) -CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "4", "--timeout", "120", "rosmorport_tsts.wsgi:application"] +# CMD - выполняет миграции, собирает статику и запускает Gunicorn +# Использует sh для выполнения нескольких команд последовательно +CMD ["sh", "-c", "cd /app/rosmorport_tsts && echo '>>> Applying database migrations...' && python manage.py migrate --noinput && echo '>>> Collecting static files...' && python manage.py collectstatic --noinput --clear && echo '>>> Starting Gunicorn...' && gunicorn --bind 0.0.0.0:8000 --workers 4 --worker-class sync --worker-tmp-dir /dev/shm --max-requests 1000 --timeout 60 --access-logfile - --error-logfile - rosmorport_tsts.wsgi:application"] diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 13f568e..0023de0 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -32,7 +32,6 @@ services: - public_media:/app/public/media - public_static:/app/public/static - database:/app/database - - ./logs:/app/logs # Перенаправляем порты ports: diff --git a/docker-compose.yml b/docker-compose.yml index dc06877..c501b8f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,7 +27,6 @@ services: - ./public/static:/app/public/static - ./public/media:/app/public/media - ./database:/app/database - - ./logs:/app/logs # Перенаправляем порты ports: diff --git a/logs/touchreload.txt b/logs/touchreload.txt deleted file mode 100644 index 7566c14..0000000 --- a/logs/touchreload.txt +++ /dev/null @@ -1 +0,0 @@ -. \ No newline at end of file diff --git a/rosmorport_tsts/rosmorport_tsts/settings.py b/rosmorport_tsts/rosmorport_tsts/settings.py index 60dd606..0c5bbf4 100644 --- a/rosmorport_tsts/rosmorport_tsts/settings.py +++ b/rosmorport_tsts/rosmorport_tsts/settings.py @@ -194,7 +194,6 @@ MEDIA_URL = 'media/' PROJECT_ROOT = BASE_DIR.parent MEDIA_ROOT = get_env('MEDIA_ROOT', str(PROJECT_ROOT / 'public' / 'media')) SITEMAP_ROOT = get_env('SITEMAP_ROOT', str(PROJECT_ROOT / 'public')) -TOUCH_RELOAD = get_env('TOUCH_RELOAD_PATH', str(PROJECT_ROOT / 'logs' / 'touchreload.txt')) # Статические файлы - разные конфигурации для DEBUG и PRODUCTION if DEBUG: diff --git a/rosmorport_tsts/rosmorport_tsts/wsgi.py b/rosmorport_tsts/rosmorport_tsts/wsgi.py index 139d40b..45e1890 100644 --- a/rosmorport_tsts/rosmorport_tsts/wsgi.py +++ b/rosmorport_tsts/rosmorport_tsts/wsgi.py @@ -10,7 +10,14 @@ https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ import os from django.core.wsgi import get_wsgi_application +from django.contrib.staticfiles.handlers import StaticFilesHandler os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rosmorport_tsts.settings') -application = get_wsgi_application() +# Получаем базовое WSGI приложение Django +django_application = get_wsgi_application() + +# Оборачиваем в StaticFilesHandler для отдачи статических файлов +# Это позволяет Gunicorn отдавать статику без необходимости отдельного веб-сервера +# Примечание: В production рекомендуется использовать nginx/apache вместо этого +application = StaticFilesHandler(django_application)