From c8205cc6f32002813a955acdefd749cb25374812 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Sat, 17 Jan 2026 16:54:26 +0300 Subject: [PATCH] feat: Add Docker support with Dockerfile and entrypoint script. --- myproject/docker/Dockerfile | 15 +++++++++++---- myproject/docker/entrypoint.sh | 22 ++++++++++++++++------ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/myproject/docker/Dockerfile b/myproject/docker/Dockerfile index b9f82b7..1694f45 100644 --- a/myproject/docker/Dockerfile +++ b/myproject/docker/Dockerfile @@ -40,7 +40,14 @@ RUN mkdir -p /app/staticfiles /app/media # Создаём непривилегированного пользователя RUN useradd -m -u 1000 appuser -# Копируем entrypoint скрипт +# Установка gosu для безопасного понижения привилегий +RUN set -eux; \ + apt-get update; \ + apt-get install -y gosu; \ + rm -rf /var/lib/apt/lists/*; \ +# Проверка работы gosu + gosu nobody true + # Копируем entrypoint скрипт COPY docker/entrypoint.sh /entrypoint.sh COPY docker/create_public_tenant.py /app/docker/create_public_tenant.py @@ -49,13 +56,13 @@ RUN chmod 755 /entrypoint.sh && chown appuser:appuser /entrypoint.sh # Меняем владельца рабочей директории RUN chown -R appuser:appuser /app -USER appuser +# USER appuser - УДАЛЕНО: запускаем entrypoint от root для настройки прав # Порт приложения EXPOSE 8000 -# Точка входа (запускаем через bash явно, чтобы избежать ошибок Permission denied) +# Точка входа ENTRYPOINT ["/bin/bash", "/entrypoint.sh"] -# Команда по умолчанию (будет переопределена в docker-compose) +# Команда по умолчанию CMD ["web"] diff --git a/myproject/docker/entrypoint.sh b/myproject/docker/entrypoint.sh index 53494a2..8f86961 100644 --- a/myproject/docker/entrypoint.sh +++ b/myproject/docker/entrypoint.sh @@ -202,7 +202,7 @@ case "$1" in run_migrations create_platform_admin echo "Starting Gunicorn..." - exec gunicorn myproject.wsgi:application \ + exec gosu appuser gunicorn myproject.wsgi:application \ --bind 0.0.0.0:8000 \ --workers 3 \ --threads 2 \ @@ -216,7 +216,7 @@ case "$1" in wait_for_redis setup_directories echo "Starting Celery Worker for photo processing and product import..." - exec celery -A myproject worker \ + exec gosu appuser celery -A myproject worker \ -l info \ --concurrency=4 ;; @@ -224,18 +224,28 @@ case "$1" in wait_for_postgres wait_for_redis echo "Starting Celery Beat..." - exec celery -A myproject beat -l info + exec gosu appuser celery -A myproject beat -l info ;; migrate) wait_for_postgres - run_migrations + # Миграции тоже запускаем от gosu + gosu appuser python manage.py migrate_schemas --shared + gosu appuser python manage.py migrate_schemas --tenant + gosu appuser python manage.py collectstatic --noinput + + # Права уже выставлены setup_directories (который запускается перед этим в case web/celery, + # но для migrate мы можем вызвать его явно или просто поправить права на статику) + # В данном блоке setup_directories не вызывался в оригинальном скрипте, но лучше вызвать если хотим гарантий + # setup_directories + + # Для migrate обычно важно просто создать схемы. create_platform_admin ;; collectstatic) wait_for_postgres setup_directories echo "Collecting static files..." - python manage.py collectstatic --noinput + gosu appuser python manage.py collectstatic --noinput echo "Setting permissions on static files..." STATIC_ROOT="/app/myproject/staticfiles" find "$STATIC_ROOT" -type d -exec chmod 755 {} \; 2>/dev/null || true @@ -243,7 +253,7 @@ case "$1" in echo "Static files collected and permissions set." ;; shell) - exec python manage.py shell + exec gosu appuser python manage.py shell ;; *) exec "$@"