🇬🇧 / 🇺🇸
This is a modern base project for Django development, fully configured to run in a robust and professional Docker environment. The structure is designed to be efficient, scalable, and easy to maintain, utilizing the best practices and tools in the ecosystem.
- Web Server: Nginx
- Application Server: Gunicorn
- Backend: Django, Django REST Framework
- Database: PostgreSQL
- Package Manager:
uv
- Background Tasks: Django Q2 (
django-q2
) - API Communication: CORS (
django-cors-headers
) - Containerization: Docker & Docker Compose
- Code Quality:
Ruff
&pre-commit
- Testing:
django.test
withcoverage
- Observability:
Prometheus
&Grafana
- Environment Variables:
python-decouple
- Development Tools:
django-extensions
withwatchdog
for hot-reloading.
This mode is for active development. It uses Django's development server with hot-reloading and provides detailed logs.
-
First-Time Setup:
# Clone the repo and enter the directory git clone <your-repository-url> && cd django_base # Create the environment file cp .env.example .env # Build the images docker-compose -f docker-compose.yml -f docker-compose.dev.yml --profile dev build # Run database migrations (using 'run' for a temporary container) docker-compose -f docker-compose.yml -f docker-compose.dev.yml run --rm web python manage.py migrate # Create a superuser docker-compose -f docker-compose.yml -f docker-compose.dev.yml run --rm web python manage.py createsuperuser
-
To Start the Development Server: This command will attach to your terminal and show live logs. Press
Ctrl + C
to stop.docker-compose -f docker-compose.yml -f docker-compose.dev.yml --profile dev up
This mode runs the production-like stack with Nginx and Gunicorn.
-
To Start the Production Stack:
docker-compose --profile prod up -d --build
-
Required Commands (after starting):
# Run migrations docker-compose --profile prod exec web python manage.py migrate # Collect static files for Nginx docker-compose --profile prod exec web python manage.py collectstatic --no-input
The application will be available at http://localhost:8000
with hot-reload enabled.
After these steps, your environment will be running
- Application:
http://localhost:8000
- Example API Endpoint:
http://localhost:8000/api/v1/hello/
- Django Admin:
http://localhost:8000/admin
- Prometheus:
http://localhost:9090
- Grafana:
http://localhost:3000
(login:admin
/admin
)
- Python 3.11+
- A local PostgreSQL server running.
uv
,pip
, orpoetry
installed.
-
Clone the repository and
cd
into it. -
Set up the environment file (
.env
): Copy.env.example
to.env
. Crucially, you must changeHOST=db
toHOST=localhost
so Django connects to your local PostgreSQL instance, not a Docker container.cp .env.example .env # Now edit .env and change HOST=db to HOST=localhost
-
Install dependencies (choose one method):
-
Using
uv
(Recommended):# Create a virtual environment uv venv # Activate it (macOS/Linux) source .venv/bin/activate # Activate it (Windows PowerShell) .venv\Scripts\Activate.ps1 # or Windows (Command Prompt) .venv\Scripts\activate.bat # Install all dependencies uv sync --dev
-
Using
pip
:# Create a virtual environment python -m venv .venv # Activate it (macOS/Linux) source .venv/bin/activate # Activate it (Windows PowerShell) .venv\Scripts\Activate.ps1 # or Windows (Command Prompt) .venv\Scripts\activate.bat # Install all dependencies from requirements.txt pip install -r requirements.txt
-
Using
Poetry
:# Install all dependencies (Poetry manages the venv automatically) poetry install # To activate the shell poetry shell
-
-
Run Migrations and the Server: (Ensure your virtual environment is activated if using
uv
orpip
)# Run migrations python manage.py migrate # Run the development server python manage.py runserver_plus
The pyproject.toml
file is the source of truth for dependencies. Use the CLI commands of your package manager to add new libraries, as this will update the file automatically.
With Docker:
- Run the install command inside the
web
container:# For a production dependency docker-compose exec web uv add "some-package" # For a development dependency (like a testing tool) docker-compose exec web uv add "some-dev-package" --dev
- To make the change permanent in the image, rebuild it after updating
pyproject.toml
:docker-compose build
Locally (without Docker):
(Ensure your virtual environment is activated)
- Using
uv
:# For a production dependency uv add "some-package" # For a development dependency uv add "some-dev-package" --dev
- Using
Poetry
:# For a production dependency poetry add "some-package" # For a development dependency poetry add "some-dev-package" --group dev
- After Adding: If your team uses
requirements.txt
, remember to regenerate it:uv pip freeze > requirements.txt
- Ensure your development environment is running.
- Execute the
startapp
command:docker-compose -f docker-compose.yml -f docker-compose.dev.yml exec web python manage.py startapp my_new_app
- Move the new
my_new_app
folder from the project root into thesrc/
directory. - Add
'my_new_app'
toINSTALLED_APPS
insrc/django_base/settings.py
. - Create and configure the app's
urls.py
.
-
Start the environment with live logs (Recommended for development): Shows colored, hot-reloading logs in your terminal. To stop, press
Ctrl + C
.docker-compose up
-
Start the environment in the background:
docker-compose up -d
-
Stop all services:
docker-compose down
-
View logs (if running in the background):
docker-compose logs -f web
-
Access the web container's shell:
docker-compose exec web bash
-
Run tests and generate coverage data:
docker-compose exec web python -m coverage run manage.py test
-
View the coverage report in the terminal:
docker-compose exec web python -m coverage report -m
-
Generate an interactive HTML report (saved in the
htmlcov/
folder):docker-compose exec web python -m coverage html
pre-commit
is configured to run ruff
(formatter and linter) automatically before each commit, ensuring code consistency.
- Activation (optional, but recommended):
To enable this, install
pre-commit
on your local machine and run:pre-commit install
The settings in .vscode/settings.json
integrate ruff
with the editor, automatically formatting your code on save.
If the environment behaves unexpectedly, a corrupted Docker cache is the most likely cause. Follow these "deep clean" steps:
- Stop and remove containers and networks:
docker-compose down
- Prune the build cache:
docker builder prune
- Rebuild the images from scratch:
docker-compose build --no-cache
- Start the services again:
docker-compose up -d
🇧🇷
Este é um projeto base moderno para desenvolvimento com Django, totalmente configurado para rodar em um ambiente Docker robusto e profissional. A estrutura foi projetada para ser eficiente, escalável e fácil de manter, utilizando as melhores práticas e ferramentas do ecossistema.
- Servidor Web: Nginx
- Servidor de Aplicação: Gunicorn
- Backend: Django, Django REST Framework
- Banco de Dados: PostgreSQL
- Gerenciador de Pacotes:
uv
- Tarefas em Background: Django Q2 (
django-q2
) - Comunicação de API: CORS (
django-cors-headers
) - Containerização: Docker & Docker Compose
- Qualidade de Código:
Ruff
epre-commit
- Testes:
django.test
comcoverage
- Observabilidade:
Prometheus
eGrafana
- Variáveis de Ambiente:
python-decouple
- Ferramentas de Desenvolvimento:
django-extensions
comwatchdog
para hot-reloading.
Este modo é para o desenvolvimento ativo. Ele usa o servidor de desenvolvimento do Django com hot-reloading e logs detalhados.
-
Setup da Primeira Vez:
# Clone o repositório e entre na pasta git clone <url-do-seu-repositorio> && cd django_base # Crie o arquivo de ambiente cp .env.example .env # Construa as imagens docker-compose -f docker-compose.yml -f docker-compose.dev.yml --profile dev build # Rode as migrações (usando 'run' para um container temporário) docker-compose -f docker-compose.yml -f docker-compose.dev.yml run --rm web python manage.py migrate # Crie um superusuário docker-compose -f docker-compose.yml -f docker-compose.dev.yml run --rm web python manage.py createsuperuser
-
Para Iniciar o Servidor de Desenvolvimento: Este comando vai "prender" seu terminal e mostrar os logs ao vivo. Pressione
Ctrl + C
para parar.docker-compose -f docker-compose.yml -f docker-compose.dev.yml --profile dev up
Este modo executa a stack de produção com Nginx e Gunicorn.
-
Para Iniciar a Stack de Produção:
docker-compose --profile prod up -d --build
-
Comandos Necessários (após iniciar):
# Rodar migrações docker-compose --profile prod exec web python manage.py migrate # Coletar arquivos estáticos para o Nginx docker-compose --profile prod exec web python manage.py collectstatic --no-input
Após esses passos, seu ambiente estará no ar!
- Aplicação:
http://localhost:8000
- Endpoint de API de Exemplo:
http://localhost:8000/api/v1/hello/
- Admin do Django:
http://localhost:8000/admin
- Prometheus:
http://localhost:9090
- Grafana:
http://localhost:3000
(login:admin
/admin
)
- Python 3.11+
- Um servidor PostgreSQL rodando localmente.
uv
,pip
, oupoetry
instalados.
-
Clone o repositório e entre na pasta.
-
Configure o arquivo de ambiente (
.env
): Copie o.env.example
para.env
. É crucial que você altereHOST=db
paraHOST=localhost
, para que o Django se conecte à sua instância local do PostgreSQL, e não a um contêiner.cp .env.example .env # Agora, edite o arquivo .env e mude HOST=db para HOST=localhost
-
Instale as dependências (escolha um método):
-
Usando
uv
(Recomendado):# Crie o ambiente virtual uv venv # Ative o ambiente (macOS/Linux) source .venv/bin/activate # Ative o ambiente (Windows PowerShell) .venv\Scripts\Activate.ps1 # ou no Windows (Command Prompt) .venv\Scripts\activate.bat # Instale todas as dependências uv sync --dev
-
Usando
pip
:# Crie o ambiente virtual python -m venv .venv # Ative o ambiente (macOS/Linux) source .venv/bin/activate # Ative o ambiente (Windows PowerShell) .venv\Scripts\Activate.ps1 # ou no Windows (Command Prompt) .venv\Scripts\activate.bat # Instale as dependências a partir do requirements.txt pip install -r requirements.txt
-
Usando
Poetry
:# Instala as dependências (o Poetry gerencia o ambiente virtual) poetry install # Para ativar o shell do ambiente poetry shell
-
-
Execute as Migrações e o Servidor: (Garanta que seu ambiente virtual esteja ativado se usar
uv
oupip
)# Rode as migrações python manage.py migrate # Rode o servidor de desenvolvimento python manage.py runserver_plus
O arquivo pyproject.toml
é a fonte da verdade para as dependências. Use os comandos CLI do seu gerenciador de pacotes para adicionar novas bibliotecas, pois isso atualizará o arquivo automaticamente.
Com Docker:
- Execute o comando de instalação dentro do container
web
:# Para uma dependência de produção docker-compose exec web uv add "nome-do-pacote" # Para uma dependência de desenvolvimento (ex: ferramenta de teste) docker-compose exec web uv add "pacote-de-dev" --dev
- Para tornar a mudança permanente na imagem, reconstrua-a após atualizar o
pyproject.toml
:docker-compose build
Localmente (sem Docker):
(Garanta que seu ambiente virtual esteja ativado)
- Usando
uv
:# Para uma dependência de produção uv add "nome-do-pacote" # Para uma dependência de desenvolvimento uv add "nome-do-pacote" --dev
- Usando
Poetry
:# Para uma dependência de produção poetry add "nome-do-pacote" # Para uma dependência de desenvolvimento poetry add "pacote-de-dev" --group dev
- Após Adicionar: Se seu time utiliza
requirements.txt
, lembre-se de regerá-lo:uv pip freeze > requirements.txt
- Garanta que seu ambiente de desenvolvimento esteja rodando.
- Execute o comando
startapp
:docker-compose -f docker-compose.yml -f docker-compose.dev.yml exec web python manage.py startapp meu_novo_app
- Mova a nova pasta
meu_novo_app
da raiz do projeto para dentro do diretóriosrc/
. - Adicione
'meu_novo_app'
à listaINSTALLED_APPS
no arquivosrc/django_base/settings.py
. - Crie e configure o arquivo
urls.py
da sua nova app, e inclua-o nourls.py
principal.
-
Iniciar o ambiente com logs ao vivo (Recomendado para desenvolver): Mostra os logs coloridos e com hot-reload no seu terminal. Para parar, pressione
Ctrl + C
.docker-compose up
-
Iniciar o ambiente em segundo plano:
docker-compose up -d
-
Parar todos os serviços:
docker-compose down
-
Ver os logs (se estiver rodando em segundo plano):
docker-compose logs -f web
-
Acessar o terminal (shell) do container web:
docker-compose exec web bash
-
Rodar os testes e gerar dados de cobertura:
docker-compose exec web python -m coverage run manage.py test
-
Ver o relatório de cobertura no terminal:
docker-compose exec web python -m coverage report -m
-
Gerar um relatório HTML interativo (salvo na pasta
htmlcov/
):docker-compose exec web python -m coverage html
O pre-commit
está configurado para rodar o ruff
(formatador e linter) automaticamente antes de cada commit, garantindo a consistência do código.
- Ativação (opcional, mas recomendado):
Para habilitar, instale
pre-commit
na sua máquina local e rode:pre-commit install
As configurações em .vscode/settings.json
integram o ruff
ao editor, formatando seu código automaticamente ao salvar.
Se o ambiente se comportar de forma estranha, um cache corrompido do Docker é a causa mais provável. Siga os passos de "limpeza profunda":
- Pare e remova contêineres e redes:
docker-compose down
- Limpe o cache de build:
docker builder prune
- Reconstrua as imagens do zero:
docker-compose build --no-cache
- Inicie os serviços novamente:
docker-compose up -d