Files
chatballs/apps/backend/Dockerfile.production
T

54 lines
2.6 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1
WORKDIR /app
# Версия релиза попадает в образ при сборке: по ней приложение решает,
# есть ли обновление. Сборка из исходников остаётся «dev».
ARG CHATBALLS_VERSION=dev
ENV CHATBALLS_VERSION=${CHATBALLS_VERSION}
RUN addgroup --system hub && adduser --system --ingroup hub hub
COPY apps/backend/requirements.txt /app/apps/backend/requirements.txt
RUN pip install --no-cache-dir -r /app/apps/backend/requirements.txt
COPY apps/backend /app/apps/backend
# Генератор секретов инстанса живёт в образе, а не монтируется с хоста:
# установка — один compose.yaml, рядом с ним ничего лежать не должно.
COPY deploy/secrets/generate-instance-secrets.sh /usr/local/bin/chatballs-generate-secrets.sh
RUN chmod 0755 /usr/local/bin/chatballs-generate-secrets.sh
# collectstatic в образе (ADR-CHATBALLS-0028): STATIC_ROOT испечён, runtime-шаг не нужен.
# Build-time secret нужен только чтобы settings загрузились в production-режиме;
# collectstatic не обращается к БД/Redis/S3. whitenoise раздаёт static в runtime.
# Build-time dummy values satisfy C04 runtime guards (distinct DB users in
# settings_database, S3 bucket in settings_storage) that only matter at runtime;
# collectstatic touches neither. В runtime секреты приходят из тома
# (deploy/secrets), остальное человек задаёт в интерфейсе.
RUN cd apps/backend && CHATBALLS_SECRET_KEY=collectstatic-build CHATBALLS_DEBUG=false CHATBALLS_ENV=production \
CHATBALLS_DELIVERY_MODE=CLOUD \
CHATBALLS_APP_ALLOWED_HOSTS=collectstatic.invalid \
CHATBALLS_HELP_PUBLIC_IPV4=127.0.0.1 \
POSTGRES_APP_USER=build-app \
POSTGRES_PLATFORM_USER=build-platform \
POSTGRES_MIGRATION_USER=build-migration \
python manage.py collectstatic --noinput
# Каталог локальных файлов создаётся в образе и принадлежит hub: том
# наследует владельца из образа, поэтому загрузки работают и на Linux,
# где bind-mount достался бы контейнеру как root:root.
RUN mkdir -p /app/apps/backend/media
RUN chown -R hub:hub /app
WORKDIR /app/apps/backend
USER hub
EXPOSE 8000
CMD ["gunicorn", "chatballs_backend.wsgi_app:application", "--bind", "0.0.0.0:8000", "--workers", "3", "--timeout", "60"]