Autosave: 20260207-181152
This commit is contained in:
parent
d0b49e0c8a
commit
8150c2ba43
33
Dockerfile
Normal file
33
Dockerfile
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# Use official Python runtime as a parent image
|
||||||
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
# Set environment variables
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE 1
|
||||||
|
ENV PYTHONUNBUFFERED 1
|
||||||
|
|
||||||
|
# Install system dependencies required for mysqlclient
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
default-libmysqlclient-dev \
|
||||||
|
build-essential \
|
||||||
|
pkg-config \
|
||||||
|
netcat-openbsd \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Set work directory
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
COPY requirements.txt /app/
|
||||||
|
RUN pip install --upgrade pip && pip install -r requirements.txt
|
||||||
|
|
||||||
|
# Copy project
|
||||||
|
COPY . /app/
|
||||||
|
|
||||||
|
# Make entrypoint executable
|
||||||
|
RUN chmod +x /app/entrypoint.sh
|
||||||
|
|
||||||
|
# Expose port
|
||||||
|
EXPOSE 8000
|
||||||
|
|
||||||
|
# Define entrypoint
|
||||||
|
ENTRYPOINT ["/app/entrypoint.sh"]
|
||||||
Binary file not shown.
@ -156,14 +156,26 @@ USE_I18N = True
|
|||||||
|
|
||||||
USE_TZ = True
|
USE_TZ = True
|
||||||
|
|
||||||
|
# Script Name (for subpath deployment)
|
||||||
|
FORCE_SCRIPT_NAME = os.getenv("FORCE_SCRIPT_NAME")
|
||||||
|
|
||||||
# Static files (CSS, JavaScript, Images)
|
# Static files (CSS, JavaScript, Images)
|
||||||
# https://docs.djangoproject.com/en/5.2/howto/static-files/
|
# https://docs.djangoproject.com/en/5.2/howto/static-files/
|
||||||
|
|
||||||
STATIC_URL = 'static/'
|
# Default to 'static/' but allow override or adjust based on FORCE_SCRIPT_NAME
|
||||||
|
if FORCE_SCRIPT_NAME:
|
||||||
|
# Ensure FORCE_SCRIPT_NAME starts with / and ends without / for consistency if needed,
|
||||||
|
# but normally users provide "/meezan".
|
||||||
|
# We strip trailing slash from script name when forming static url
|
||||||
|
_script_prefix = FORCE_SCRIPT_NAME.rstrip('/')
|
||||||
|
STATIC_URL = os.getenv("STATIC_URL", f"{_script_prefix}/static/")
|
||||||
|
MEDIA_URL = os.getenv("MEDIA_URL", f"{_script_prefix}/media/")
|
||||||
|
else:
|
||||||
|
STATIC_URL = os.getenv("STATIC_URL", "static/")
|
||||||
|
MEDIA_URL = os.getenv("MEDIA_URL", "media/")
|
||||||
|
|
||||||
# Collect static into a separate folder; avoid overlapping with STATICFILES_DIRS.
|
# Collect static into a separate folder; avoid overlapping with STATICFILES_DIRS.
|
||||||
STATIC_ROOT = BASE_DIR / 'staticfiles'
|
STATIC_ROOT = BASE_DIR / 'staticfiles'
|
||||||
MEDIA_URL = 'media/'
|
|
||||||
MEDIA_ROOT = BASE_DIR / 'media'
|
MEDIA_ROOT = BASE_DIR / 'media'
|
||||||
|
|
||||||
STATICFILES_DIRS = [
|
STATICFILES_DIRS = [
|
||||||
@ -202,4 +214,14 @@ LOGIN_URL = '/accounts/login/'
|
|||||||
# Default primary key field type
|
# Default primary key field type
|
||||||
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field
|
# https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field
|
||||||
|
|
||||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
|
|
||||||
|
# Whitenoise configuration for production
|
||||||
|
# Only enable if whitenoise is installed
|
||||||
|
try:
|
||||||
|
import whitenoise
|
||||||
|
MIDDLEWARE.insert(1, 'whitenoise.middleware.WhiteNoiseMiddleware')
|
||||||
|
# Use CompressedStaticFilesStorage instead of Manifest to avoid build crashes on missing files
|
||||||
|
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
28
docker-compose.yml
Normal file
28
docker-compose.yml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
build: .
|
||||||
|
command: /app/entrypoint.sh
|
||||||
|
volumes:
|
||||||
|
- .:/app
|
||||||
|
ports:
|
||||||
|
- "8000:8000"
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: mariadb:10.6
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
MYSQL_DATABASE: ${DB_NAME:-mydatabase}
|
||||||
|
MYSQL_USER: ${DB_USER:-myuser}
|
||||||
|
MYSQL_PASSWORD: ${DB_PASS:-mypassword}
|
||||||
|
MYSQL_ROOT_PASSWORD: ${DB_PASS:-mypassword}
|
||||||
|
volumes:
|
||||||
|
- db_data:/var/lib/mysql
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
db_data:
|
||||||
15
entrypoint.sh
Normal file
15
entrypoint.sh
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Starting deployment script..."
|
||||||
|
|
||||||
|
echo "Collecting static files..."
|
||||||
|
# Run collectstatic but allow it to fail without crashing the container immediately,
|
||||||
|
# so we can see the logs if something goes wrong.
|
||||||
|
python manage.py collectstatic --noinput || echo "WARNING: collectstatic failed! Check static files."
|
||||||
|
|
||||||
|
echo "Applying migrations..."
|
||||||
|
python manage.py migrate
|
||||||
|
|
||||||
|
echo "Starting Gunicorn..."
|
||||||
|
exec gunicorn config.wsgi:application --bind 0.0.0.0:8000
|
||||||
@ -2,3 +2,5 @@ Django==5.2.7
|
|||||||
mysqlclient==2.2.7
|
mysqlclient==2.2.7
|
||||||
python-dotenv==1.1.1
|
python-dotenv==1.1.1
|
||||||
pyzk==0.9
|
pyzk==0.9
|
||||||
|
gunicorn==21.2.0
|
||||||
|
whitenoise==6.6.0
|
||||||
Loading…
x
Reference in New Issue
Block a user