diff --git a/django.coolify.Dockerfile b/django.coolify.Dockerfile new file mode 100644 index 0000000..6f1d4e7 --- /dev/null +++ b/django.coolify.Dockerfile @@ -0,0 +1,15 @@ +# Dockerfile dedicado para el despliegue en Coolify. +# No toca django.Dockerfile (que usan los compose dev/staging/prod locales). +# Diferencias: copia el código de tienda_ilusion/ dentro de la imagen (Coolify +# no monta el directorio local) y expone PYTHONUNBUFFERED para logs en tiempo real. +FROM python:3.12-slim + +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 + +WORKDIR /app/ + +COPY requirements.txt ./ +RUN pip install --no-cache-dir -r requirements.txt + +COPY tienda_ilusion/ /app/ \ No newline at end of file diff --git a/docker-compose.coolify.yaml b/docker-compose.coolify.yaml new file mode 100644 index 0000000..2900daf --- /dev/null +++ b/docker-compose.coolify.yaml @@ -0,0 +1,71 @@ +# Docker Compose para despliegue en Coolify. +# Copia este stack tal cual: Coolify lo clona y parsea (Build Pack: Docker Compose). +# En Coolify indica: +# - Docker Compose Location: docker-compose.coolify.yaml +# - Service 'django' -> Domain: https://api.tudominio.com (puerto interno 8000) +# - Environment Variables se crean solas a partir de los ${VAR} de abajo. +# NO usa env_file (.env.production): las variables se definen en la UI de Coolify. + +services: + postgres: + image: postgres:15-alpine + restart: unless-stopped + environment: + - POSTGRES_USER=${DB_USER:?Define DB_USER en Coolify} + - POSTGRES_PASSWORD=${DB_PASSWORD:?Define DB_PASSWORD en Coolify} + - POSTGRES_DB=${DB_NAME:?Define DB_NAME en Coolify} + volumes: + - postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"] + interval: 10s + timeout: 5s + retries: 5 + + django: + build: + context: ./ + dockerfile: django.coolify.Dockerfile + restart: unless-stopped + environment: + - DJANGO_ENV=production + - DEBUG=${DEBUG:-False} + - SECRET_KEY=${SECRET_KEY:?Define SECRET_KEY en Coolify} + - ALLOWED_HOSTS=${ALLOWED_HOSTS:?Define ALLOWED_HOSTS en Coolify} + - CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS:?Define CORS_ALLOWED_ORIGINS en Coolify} + - CSRF_TRUSTED_ORIGINS=${CSRF_TRUSTED_ORIGINS:?Define CSRF_TRUSTED_ORIGINS en Coolify} + - DB_HOST=postgres + - DB_PORT=5432 + - DB_NAME=${DB_NAME:?Define DB_NAME en Coolify} + - DB_USER=${DB_USER:?Define DB_USER en Coolify} + - DB_PASSWORD=${DB_PASSWORD:?Define DB_PASSWORD en Coolify} + - EMAIL_HOST=${EMAIL_HOST:-smtp.gmail.com} + - EMAIL_PORT=${EMAIL_PORT:-587} + - EMAIL_USE_TLS=${EMAIL_USE_TLS:-True} + - EMAIL_HOST_USER=${EMAIL_HOST_USER:-} + - EMAIL_HOST_PASSWORD=${EMAIL_HOST_PASSWORD:-} + - DEFAULT_FROM_EMAIL=${DEFAULT_FROM_EMAIL:-noreply@tiendailusion.com} + - ADMIN_EMAIL=${ADMIN_EMAIL:-admin@tiendailusion.com} + - TRYTON_HOST=${TRYTON_HOST:?Define TRYTON_HOST en Coolify} + - TRYTON_DATABASE=${TRYTON_DATABASE:?Define TRYTON_DATABASE en Coolify} + - TRYTON_USERNAME=${TRYTON_USERNAME:?Define TRYTON_USERNAME en Coolify} + - TRYTON_PASSWORD=${TRYTON_PASSWORD:?Define TRYTON_PASSWORD en Coolify} + expose: + - "8000" + volumes: + - static_volume:/app/staticfiles + - media_volume:/app/media + - logs_volume:/app/logs + depends_on: + postgres: + condition: service_healthy + command: > + sh -c "python manage.py migrate && + python manage.py collectstatic --noinput && + gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 4 --timeout 120" + +volumes: + postgres_data: + static_volume: + media_volume: + logs_volume: \ No newline at end of file