refactor: Удалена ненужная папка logs

Причины:
- В production логи nginx хранятся в системной папке хоста
- В dev образ постоянно перестраивается, логи не накапливаются
- Логи не нужны для хранения в контейнере
Удалено:
- Папка logs из корня проекта
- mkdir -p /app/logs из Dockerfile
- Монтирование logs из docker-compose.yml и docker-compose.prod.yml
- Переменная TOUCH_RELOAD из settings.py и .env файлов
Результат: более clean и минималистичная структура проекта
This commit is contained in:
2026-03-31 13:45:32 +03:00
parent 55980a0659
commit 8385e04103
17 changed files with 150 additions and 13 deletions

View File

@@ -41,12 +41,11 @@ DB_NAME=db.sqlite3
# DB_PORT=3306 # DB_PORT=3306
# ======================================== # ========================================
# Пути для файлов (относительно проекта) # Пути для файлов (относительно корня проекта)
# ======================================== # ========================================
MEDIA_ROOT=public/media MEDIA_ROOT=public/media
STATIC_ROOT=public/static STATIC_ROOT=public/static
SITEMAP_ROOT=public SITEMAP_ROOT=public
TOUCH_RELOAD_PATH=logs/touchreload.txt
# ======================================== # ========================================
# Настройки почты (опционально) # Настройки почты (опционально)

9
.github/copilot-instructions.md vendored Normal file
View File

@@ -0,0 +1,9 @@
Вы - опытный помощник по программированию GitHub Copilot.
Всегда отвечай на русском языке, если не указано иное.
Комментируй код, который ты генерируешь, чтобы объяснить его функциональность на русском языке.
Не удаляй старые комментарии. Код которых хочешь удалить скрывай в комментариях.
При написании кода следуй стандартам PEP 8 для Python.
Используй современные возможности Python (3.12+) и Django (6.0+).
Предпочитай `poetry` для управления зависимостями.
Подробнее комментировать каждое действие.
Всегда спрашивай да/нет пред деплоем, git commit и git push.

10
.idea/.gitignore generated vendored Normal file
View File

@@ -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/

29
.idea/2024-test-rosmorport.iml generated Normal file
View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="FacetManager">
<facet type="django" name="Django">
<configuration>
<option name="rootFolder" value="$MODULE_DIR$/rosmorport_tsts" />
<option name="settingsModule" value="rosmorport_tsts/settings.py" />
<option name="manageScript" value="$MODULE_DIR$/rosmorport_tsts/manage.py" />
<option name="environment" value="&lt;map/&gt;" />
<option name="doNotUseTestRunner" value="false" />
<option name="trackFilePattern" value="migrations" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/rosmorport_tsts" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="Python 3.14 (rosmorport-tsts-OiaYl72h-py3.14)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Django" />
</component>
</module>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Ask2AgentMigrationStateService">
<option name="migrationStatus" value="COMPLETED" />
</component>
</project>

45
.idea/copilotDiffState.xml generated Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,10 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<Languages>
<language minSize="57" name="Python" />
</Languages>
</inspection_tool>
</profile>
</component>

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

7
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.8" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.14 (rosmorport-tsts-OiaYl72h-py3.14)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/2024-test-rosmorport.iml" filepath="$PROJECT_DIR$/.idea/2024-test-rosmorport.iml" />
</modules>
</component>
</project>

7
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@@ -42,10 +42,7 @@ ENV PATH="/opt/venv/bin:$PATH"
COPY . . COPY . .
# Создаём необходимые директории # Создаём необходимые директории
RUN mkdir -p /app/logs /app/public/media /app/public/static RUN mkdir -p /app/public/media /app/public/static /app/database
# Собираем статические файлы
RUN python rosmorport_tsts/manage.py collectstatic --noinput --clear || true
# Устанавливаем пользователя для запуска приложения (из соображений безопасности) # Устанавливаем пользователя для запуска приложения (из соображений безопасности)
RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app
@@ -54,6 +51,7 @@ USER appuser
# Открываем порт # Открываем порт
EXPOSE 8000 EXPOSE 8000
# Команда для запуска приложения (используем gunicorn) # CMD - выполняет миграции, собирает статику и запускает Gunicorn
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "4", "--timeout", "120", "rosmorport_tsts.wsgi:application"] # Использует 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"]

View File

@@ -32,7 +32,6 @@ services:
- public_media:/app/public/media - public_media:/app/public/media
- public_static:/app/public/static - public_static:/app/public/static
- database:/app/database - database:/app/database
- ./logs:/app/logs
# Перенаправляем порты # Перенаправляем порты
ports: ports:

View File

@@ -27,7 +27,6 @@ services:
- ./public/static:/app/public/static - ./public/static:/app/public/static
- ./public/media:/app/public/media - ./public/media:/app/public/media
- ./database:/app/database - ./database:/app/database
- ./logs:/app/logs
# Перенаправляем порты # Перенаправляем порты
ports: ports:

View File

@@ -1 +0,0 @@
.

View File

@@ -194,7 +194,6 @@ MEDIA_URL = 'media/'
PROJECT_ROOT = BASE_DIR.parent PROJECT_ROOT = BASE_DIR.parent
MEDIA_ROOT = get_env('MEDIA_ROOT', str(PROJECT_ROOT / 'public' / 'media')) MEDIA_ROOT = get_env('MEDIA_ROOT', str(PROJECT_ROOT / 'public' / 'media'))
SITEMAP_ROOT = get_env('SITEMAP_ROOT', str(PROJECT_ROOT / 'public')) 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 # Статические файлы - разные конфигурации для DEBUG и PRODUCTION
if DEBUG: if DEBUG:

View File

@@ -10,7 +10,14 @@ https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/
import os import os
from django.core.wsgi import get_wsgi_application from django.core.wsgi import get_wsgi_application
from django.contrib.staticfiles.handlers import StaticFilesHandler
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rosmorport_tsts.settings') 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)