diff --git a/.env.sample b/.env.sample index d11aaef..8aa7f6a 100644 --- a/.env.sample +++ b/.env.sample @@ -1,23 +1,30 @@ # Django settings DJANGO_SETTINGS_MODULE=config.settings.development SECRET_KEY=your-secret-key -ALLOWED_HOSTS=api.your-domain.com,www.your-domain.com +ALLOWED_HOSTS=localhost,127.0.0.1 -# Database (individual parameters) -DB_NAME= -DB_USER= -DB_PASSWORD= -DB_HOST= -DB_PORT= +# Database (MySQL) +DB_NAME=project_management +DB_USER=project_user +DB_PASSWORD=project_password +DB_HOST=localhost +DB_PORT=3306 -# Frontend URL -FRONTEND_URL=https://frontend.your-domain.com,https://www.frontend.your-domain.com +# Site +BASE_URL=http://localhost:8000 +SITE_NAME=Project Management -# Email settings -EMAIL_HOST= -EMAIL_PORT= -EMAIL_USE_TLS= +# Frontend (CORS) +FRONTEND_URL=http://localhost:8000 + +# Email (SMTP) +EMAIL_HOST=smtp.gmail.com +EMAIL_PORT=587 +EMAIL_USE_TLS=True EMAIL_HOST_USER= EMAIL_HOST_PASSWORD= -DEFAULT_FROM_EMAIL= -SERVER_EMAIL= \ No newline at end of file + +# Google OAuth +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= +GOOGLE_REDIRECT_URI=http://localhost:8000/api/auth/google/callback/ diff --git a/Dockerfile b/Dockerfile index 04aa6ba..726f2ef 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,35 +1,43 @@ FROM python:3.13-slim -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONUNBUFFERED=1 -ENV PIP_NO_CACHE_DIR=1 -ENV PIP_DISABLE_PIP_VERSION_CHECK=1 +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PIP_NO_CACHE_DIR=1 \ + PIP_DISABLE_PIP_VERSION_CHECK=1 \ + NODE_VERSION=20 WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends \ default-libmysqlclient-dev \ build-essential \ - && rm -rf /var/lib/apt/lists/* - -RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ - && rm -rf /var/lib/apt/lists/* -ENV NODE_VERSION=20 -RUN curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - \ + && curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - \ && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -RUN python manage.py tailwind install - - COPY . . -RUN python manage.py collectstatic --noinput || true +ARG DJANGO_SETTINGS_MODULE=config.settings.production +ENV DJANGO_SETTINGS_MODULE=${DJANGO_SETTINGS_MODULE} +ARG SECRET_KEY +ENV SECRET_KEY=${SECRET_KEY} + +RUN python manage.py tailwind install && python manage.py collectstatic --noinput + +RUN addgroup --system --gid 1001 app && \ + adduser --system --uid 1001 --gid 1001 app && \ + chown -R app:app /app EXPOSE 8000 -CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"] \ No newline at end of file +COPY --chown=app:app docker-entrypoint.sh /docker-entrypoint.sh +RUN chmod +x /docker-entrypoint.sh + +USER app + +ENTRYPOINT ["/docker-entrypoint.sh"] +CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..6d8df14 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,56 @@ +services: + db: + image: mysql:8.0 + volumes: + - mysql_data:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-rootpassword} + MYSQL_DATABASE: ${DB_NAME:-project_management} + MYSQL_USER: ${DB_USER:-project_user} + MYSQL_PASSWORD: ${DB_PASSWORD:-project_password} + ports: + - "3306:3306" + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] + timeout: 5s + retries: 10 + + app: + build: + context: . + args: + DJANGO_SETTINGS_MODULE: ${DJANGO_SETTINGS_MODULE:-config.settings.production} + SECRET_KEY: ${SECRET_KEY} + volumes: + - static_volume:/app/staticfiles + - media_volume:/app/media + ports: + - "8000:8000" + environment: + DJANGO_SETTINGS_MODULE: ${DJANGO_SETTINGS_MODULE:-config.settings.production} + SECRET_KEY: ${SECRET_KEY} + ALLOWED_HOSTS: ${ALLOWED_HOSTS:-localhost,127.0.0.1} + DB_NAME: ${DB_NAME:-project_management} + DB_USER: ${DB_USER:-project_user} + DB_PASSWORD: ${DB_PASSWORD:-project_password} + DB_HOST: db + DB_PORT: ${DB_PORT:-3306} + BASE_URL: ${BASE_URL:-http://localhost:8000} + SITE_NAME: ${SITE_NAME:-Project Management} + FRONTEND_URL: ${FRONTEND_URL:-http://localhost:8000} + GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-} + GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-} + GOOGLE_REDIRECT_URI: ${GOOGLE_REDIRECT_URI:-} + EMAIL_HOST: ${EMAIL_HOST:-} + EMAIL_PORT: ${EMAIL_PORT:-} + EMAIL_USE_TLS: ${EMAIL_USE_TLS:-} + EMAIL_HOST_USER: ${EMAIL_HOST_USER:-} + EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD:-} + depends_on: + db: + condition: service_healthy + +volumes: + mysql_data: + static_volume: + media_volume: diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..b92001e --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/sh +set -e + +python manage.py migrate --noinput + +exec "$@"