diff --git a/Makefile b/Makefile index 49d35a2..d9e41af 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,9 @@ -PROJECTNAME := project_name +include .env +export $(shell sed 's/=.*//' .env) + SHELL := /bin/sh -APP_NAME := project_name +PROJECTNAME ?= default_app_name +APP_NAME := $(PROJECTNAME) BACKEND_APP_NAME := $(APP_NAME)-backend define HELP @@ -48,10 +51,10 @@ migrate: "python manage.py migrate" build-dev: - docker-compose -f docker-compose.yml up --build -d + DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker-compose -f docker-compose.yml up --build -d build-prod: - docker-compose -f docker-compose.prod.yml up --build -d + DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker-compose -f docker-compose.prod.yml up --build -d stop-dev: @docker-compose -f docker-compose.yml down diff --git a/README.md b/README.md index 948744f..7faddba 100644 --- a/README.md +++ b/README.md @@ -1,153 +1,160 @@ # Django Docker Quickstart +This quickstart provides an easy way to initiate a Django project using Docker. It comes with pre-configured services including PostgreSQL, Redis, Celery (worker and beat), Nginx, and Traefik, ready to run a Django web application. Additionally, it provides a few handy shortcuts for easier development. + --- -Provides a quick and easy way to get started with a Django project using Docker. -It comes with pre-configured services, -including PostgreSQL, Redis, Celery (worker and beat), -Nginx, and Traefik, that can be used to run a Django web application. -It also comes with a few shortcuts to make development easier. +## Features 🚀 -## Features +- **Django** web application framework +- **PostgreSQL** database +- **Redis** in-memory data structure store +- **Celery** worker and beat services for running background tasks asynchronously +- **Nginx** web server for serving static and media files, and proxying requests to the Django application +- **Traefik** reverse proxy for routing requests to the appropriate service and providing SSL termination -- Django web application framework -- PostgreSQL database -- Redis -- Celery worker and beat services: Celery is a task queue that is used to run background tasks asynchronously. -- Nginx web server: Used to serve static files and media files, and to proxy requests to the Django application. -- Traefik reverse proxy: Used to route requests to the appropriate service. It also provides SSL termination. +## Included Packages and Tools 🛠️ -## Included Packages and Tools +- **Pytest**: Testing framework +- **Pytest Sugar**: A pytest plugin for a better look +- **Pytest Django**: A pytest plugin providing useful tools for testing Django applications +- **Coverage**: Test coverage tool +- **Ruff**: Linter +- **Black**: Code formatter -- Pytest: Testing framework -- Pytest Sugar: Plugin for pytest that changes the default look -- Pytest Django: Plugin for pytest that provides useful tools for testing Django applications -- Coverage: Test coverage -- Ruff: Linter -- Black: Code formatter +## Requirements 📋 -## Requirements - -- Docker & Docker Compose [Install and Use Docker](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04) +- Docker & Docker Compose - [Install and Use Docker](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04) - Python 3.10 or higher -- Make(optional for shortcuts) +- Make (optional for shortcuts) +--- -## Getting Started +## Getting Started 🏁 -To get started, follow these steps: - -1. Clone the repository: - - ``` +1. **Clone the repository:** + ```bash git clone https://github.com/godd0t/django-docker-quickstart.git ``` -2. Change directory into the project: - ``` +2. **Change directory into the project:** + ```bash cd django-docker-quickstart ``` - -3. Copy the `env.example` file to `.env` and update the values as needed: - ``` + +3. **Copy the `env.example` file to `.env` and update the values as needed:** +
+ **For Linux/macOS:** + ```bash cp env.example .env ``` + **For Windows (Command Prompt):** + ```powershell + Copy-Item -Path env.example -Destination .env + ``` -## Initial Setup +--- + +## Initial Setup ⚙️ ### Development Prerequisites -To set up the project for development, follow these steps: - -1. Create a virtual environment: - ``` +1. **Create a virtual environment:** + ```bash python -m venv venv ``` - -2. Activate the virtual environment: - ``` + +2. **Activate the virtual environment:** + ```bash source venv/bin/activate ``` - -3. (Optional) Install the development requirements specific to your IDE for enhanced functionality and support. - ``` + +3. **(Optional) Install the development requirements specific to your IDE for enhanced functionality and support.** + ```bash pip install -r src/requirements-dev.txt ``` -4. Build the image and run the container: - ``` - docker-compose -f docker-compose.yml up --build -d - ``` - Or you can use the shortcut: - ``` - make build-dev - ``` - -Now you can access the application at http://localhost:8000. -With the development environment, you can make changes to the code and the changes will be reflected immediately. +4. **Build the image and run the container:** +
+ - If buildkit is not enabled, enable it and build the image: + ```bash + DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker-compose -f docker-compose.yml up --build -d + ``` -### Production + - If buildkit is enabled, build the image: + ```bash + docker-compose -f docker-compose.yml up --build -d + ``` -To set up the project for production, follow these steps: + - Or, use the shortcut: + ```bash + make build-dev + ``` -1. Build the image and run the container: +You can now access the application at http://localhost:8000. The development environment allows for immediate reflection of code changes. + +### Production Setup + +1. **Build the image and run the container:** +
+ - If buildkit is not enabled, enable it and build the image: + ```bash + DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker-compose -f docker-compose.prod.yml up --build -d ``` + + - If buildkit is enabled, + build the image: + ```bash docker-compose -f docker-compose.prod.yml up --build -d ``` - Or you can use the shortcut: - ``` + - Or, use the shortcut: + ```bash make build-prod ``` +--- -## Shortcuts +## Shortcuts 🔑 -To make development easier, there are a few shortcuts available: +This project includes several shortcuts to streamline the development process: -Create migrations: +- **Create migrations:** + ```bash + make make-migrations + ``` -``` -make make-migrations -``` +- **Run migrations:** + ```bash + make migrate + ``` -Run migrations: +- **Run the linter:** + ```bash + make lint + ``` -``` -make migrate -``` +- **Run the formatter:** + ```bash + make format + ``` -Run the linter: +- **Run the tests:** + ```bash + make test + ``` -``` -make lint -``` +- **Create a super user:** + ```bash + make super-user + ``` -Run the formatter: +- **Build and run dev environment:** + ```bash + make build-dev + ``` -``` -make format -``` - -Run the tests: - -``` -make test -``` - -Create a super user: - -``` -make super-user -``` - -Build and run dev environment: - -``` -make build-dev -``` - -Build and run prod environment: - -``` -make build-prod -``` +- **Build and run prod environment:** + ```bash + make build-prod + ``` +--- diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index ae0a36e..00c0384 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -112,15 +112,6 @@ services: - "--log.level=DEBUG" - "--accesslog=true" - "--tracing=true" - labels: - - "traefik.enable=true" - - "traefik.http.routers.dashboard.rule=Host(`${TRAEFIK_DOMAIN}`) && (PathPrefix(`/`))" - - "traefik.http.routers.dashboard.tls=true" - - "traefik.http.routers.dashboard.tls.certresolver=myresolver" - - "traefik.http.routers.dashboard.entrypoints=websecure" - - "traefik.http.routers.dashboard.service=api@internal" - - "traefik.http.routers.dashboard.middlewares=auth" - - "traefik.http.middlewares.auth.basicauth.users=user:$$2y$$05$$22TlNvU.X30m4rVd3aIA3.jF/XXkh6eayHg5UYwDNgF8MVFwJgPrS" ports: - "80:80" - "443:443" diff --git a/env.example b/env.example index a8754f4..114cfd7 100644 --- a/env.example +++ b/env.example @@ -3,9 +3,8 @@ APP_NAME=project_name APP_HOST=0.0.0.0 APP_PORT=8000 SECRET_KEY='ur secret key' -APP_ENV=dev +APP_ENV='dev' # Could be dev, prod or test DEBUG=True -DJANGO_SETTINGS_MODULE=project_name.settings.dev ALLOWED_HOSTS='app.backend.dev' CSRF_TRUSTED_ORIGINS='https://*.backend.dev' CORS_ALLOWED_ORIGINS=http://app.backend.dev,http://localhost:3000 diff --git a/src/manage.py b/src/manage.py index b6dadb6..e06b63e 100755 --- a/src/manage.py +++ b/src/manage.py @@ -6,7 +6,8 @@ import sys def main(): """Run administrative tasks.""" - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings") + APP_ENV = os.getenv("APP_ENV", "dev") + os.environ.setdefault("DJANGO_SETTINGS_MODULE", f"project_name.settings.{APP_ENV}") try: from django.core.management import execute_from_command_line except ImportError as exc: diff --git a/src/project_name/asgi.py b/src/project_name/asgi.py index 3ee8cc1..49a91cc 100644 --- a/src/project_name/asgi.py +++ b/src/project_name/asgi.py @@ -11,6 +11,7 @@ import os from django.core.asgi import get_asgi_application -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings") +APP_ENV = os.getenv("APP_ENV", "dev") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", f"project_name.settings.{APP_ENV}") application = get_asgi_application() diff --git a/src/project_name/celery.py b/src/project_name/celery.py index 5b5fb52..e2dc597 100644 --- a/src/project_name/celery.py +++ b/src/project_name/celery.py @@ -4,7 +4,8 @@ from celery import Celery from celery.schedules import crontab # Set the default Django settings module for the 'celery' program. -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings.dev") +APP_ENV = os.getenv("APP_ENV", "dev") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", f"project_name.settings.{APP_ENV}") app = Celery("project_name") diff --git a/src/project_name/wsgi.py b/src/project_name/wsgi.py index a13618a..2ba232f 100644 --- a/src/project_name/wsgi.py +++ b/src/project_name/wsgi.py @@ -11,6 +11,7 @@ import os from django.core.wsgi import get_wsgi_application -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings.dev") +APP_ENV = os.getenv("APP_ENV", "dev") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", f"project_name.settings.{APP_ENV}") application = get_wsgi_application()