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)