Skip to content

Commit d9badfe

Browse files
committed
add nivel1 env+dev mode
1 parent 197683a commit d9badfe

File tree

8 files changed

+254
-22
lines changed

8 files changed

+254
-22
lines changed

.env

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Django
2+
DEBUG=1
3+
SECRET_KEY=django-insecure-1234567890
4+
5+
# Postgres
6+
POSTGRES_DB=django_db
7+
POSTGRES_USER=django_user
8+
POSTGRES_PASSWORD=django_pass
9+
POSTGRES_PORT=5432
10+
11+
# Django -> DB
12+
DB_NAME=django_db
13+
DB_USER=django_user
14+
DB_PASSWORD=django_pass
15+
DB_HOST=db
16+
DB_PORT=5432

.gitignore

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
*.pyc
2+
__pycache__/
3+
*.sqlite3
4+
env/
5+
venv/
6+
*.log
7+
*.pid
8+
*.sock
9+
/static/
10+
/media/
11+
# .env
12+
.idea/
13+
.vscode/
14+
__pycache__/
15+
# Docker
16+
*.pid
17+
*.seed
18+
*.tar

Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ RUN apt-get update && apt-get install -y \
1313
gcc \
1414
python3-dev \
1515
musl-dev \
16+
curl \
1617
&& rm -rf /var/lib/apt/lists/*
1718

1819
# Copiar archivo de dependencias

docker-compose.override.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
version: '3.8'
2+
3+
services:
4+
web:
5+
command: sh -c "python manage.py runserver 0.0.0.0:8000"
6+
environment:
7+
DEBUG: "1"
8+
volumes:
9+
- .:/app

docker-compose.yml

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@ services:
55
db:
66
image: postgres:15-alpine
77
container_name: django_postgres
8-
volumes:
9-
- postgres_data:/var/lib/postgresql/data
8+
env_file:
9+
- .env
1010
environment:
11-
POSTGRES_DB: django_db
12-
POSTGRES_USER: django_user
13-
POSTGRES_PASSWORD: django_pass
11+
POSTGRES_DB: ${POSTGRES_DB}
12+
POSTGRES_USER: ${POSTGRES_USER}
13+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
1414
ports:
15-
- "5432:5432"
15+
- "${POSTGRES_PORT}:5432"
16+
volumes:
17+
- postgres_data:/var/lib/postgresql/data
1618
healthcheck:
17-
test: ["CMD-SHELL", "pg_isready -U django_user -d django_db"]
19+
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
1820
interval: 5s
1921
timeout: 5s
2022
retries: 5
@@ -25,21 +27,31 @@ services:
2527
web:
2628
build: .
2729
container_name: django_web
28-
command: sh -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
30+
env_file:
31+
- .env
32+
command: >
33+
sh -c "python manage.py migrate &&
34+
gunicorn myproject.wsgi:application --bind 0.0.0.0:8000"
2935
volumes:
3036
- .:/app
3137
ports:
3238
- "8000:8000"
3339
environment:
34-
DB_NAME: django_db
35-
DB_USER: django_user
36-
DB_PASSWORD: django_pass
37-
DB_HOST: db
38-
DB_PORT: 5432
39-
DJANGO_SETTINGS_MODULE: myproject.settings
40+
DB_NAME: ${DB_NAME}
41+
DB_USER: ${DB_USER}
42+
DB_PASSWORD: ${DB_PASSWORD}
43+
DB_HOST: ${DB_HOST}
44+
DB_PORT: ${DB_PORT}
45+
DEBUG: ${DEBUG}
46+
SECRET_KEY: ${SECRET_KEY}
4047
depends_on:
4148
db:
4249
condition: service_healthy
50+
healthcheck:
51+
test: ["CMD", "curl", "-f", "http://localhost:8000"]
52+
interval: 10s
53+
timeout: 5s
54+
retries: 5
4355
networks:
4456
- django_network
4557

myproject/settings.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
1010

1111
# SECURITY WARNING: keep the secret key used in production secret!
12-
SECRET_KEY = 'django-insecure-5pef)xgr-#oy-eh*e(n&l8x0!g)ik&uu8jgvo*zcz7uz3nw#@e'
12+
SECRET_KEY = os.environ.get("SECRET_KEY")
1313

1414
# SECURITY WARNING: don't run with debug turned on in production!
15-
DEBUG = True
15+
DEBUG = os.environ.get("DEBUG") == "1"
1616

1717
ALLOWED_HOSTS = []
1818

@@ -69,11 +69,11 @@
6969
DATABASES = {
7070
'default': {
7171
'ENGINE': 'django.db.backends.postgresql',
72-
'NAME': os.environ.get('DB_NAME', 'django_db'),
73-
'USER': os.environ.get('DB_USER', 'django_user'),
74-
'PASSWORD': os.environ.get('DB_PASSWORD', 'django_pass'),
75-
'HOST': os.environ.get('DB_HOST', 'localhost'),
76-
'PORT': os.environ.get('DB_PORT', '5432'),
72+
'NAME': os.environ.get("DB_NAME"),
73+
'USER': os.environ.get("DB_USER"),
74+
'PASSWORD': os.environ.get("DB_PASSWORD"),
75+
'HOST': os.environ.get("DB_HOST"),
76+
'PORT': os.environ.get("DB_PORT"),
7777
}
7878
}
7979

nivel1.md

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
# 🟦 Nivel 1: Mejora del Proyecto con Docker — Dev Mode & Deploy Mode
2+
3+
Este documento explica detalladamente los ajustes implementados en el **Nivel 1**, los cambios aplicados al proyecto y cómo arrancar el sistema correctamente tanto en **modo desarrollo** como en **modo producción**, junto con sus diferencias clave.
4+
5+
---
6+
7+
# 📘 1. ¿Qué incluye el Nivel 1?
8+
9+
El Nivel 1 mejora la estructura general del proyecto agregando:
10+
11+
1.**Archivo `.env`** para manejar variables de entorno.
12+
2.**docker-compose.yml actualizado** para usar variables del `.env`.
13+
3.**docker-compose.override.yml** para ejecutar el proyecto en modo desarrollo.
14+
4.**Healthcheck para Django y PostgreSQL**.
15+
5.**Gunicorn como servidor de producción**.
16+
6.**Separación real entre Dev Mode y Deploy Mode**.
17+
18+
Estas mejoras te permiten trabajar de manera profesional y aprender conceptos reales de Docker.
19+
20+
---
21+
22+
# 📁 2. Archivos creados o modificados en este nivel
23+
24+
## `.env`
25+
Variables de entorno centralizadas para evitar hardcodeo.
26+
27+
## `docker-compose.yml`
28+
Archivo principal usado en producción.
29+
30+
## `docker-compose.override.yml`
31+
Archivo usado automáticamente en desarrollo.
32+
33+
## `settings.py`
34+
Actualizado para leer valores desde variables de entorno.
35+
36+
## `Dockerfile`
37+
Actualizado para incluir `curl` y `gunicorn`.
38+
39+
---
40+
41+
# 🚀 3. Cómo arrancar el proyecto en cada modo
42+
43+
---
44+
45+
# 🟢 DEV MODE (modo desarrollo)
46+
47+
### ✔ ¿Qué características tiene Dev Mode?
48+
- Usa `docker-compose.yml` + `docker-compose.override.yml`
49+
- Django corre con **runserver**
50+
- Código del host → contenedor (hot reload)
51+
- Depuración ON
52+
- Ideal para programar
53+
54+
### 🎯 Comando para iniciar en dev:
55+
```bash
56+
docker-compose up --build
57+
```
58+
59+
### 🎯 Comando para detener en dev:
60+
```bash
61+
docker-compose down
62+
```
63+
64+
### 🔍 Confirmación visual:
65+
66+
En los logs verás:
67+
```rust
68+
Watching for file changes...
69+
Starting development server at http://0.0.0.0:8000
70+
```
71+
72+
---
73+
74+
# 🔵 DEPLOY MODE (modo producción)
75+
76+
### ✔ ¿Qué características tiene Deploy Mode?
77+
78+
- Usa solo docker-compose.yml
79+
- No usa override
80+
- Django corre con Gunicorn
81+
- No existe hot reload
82+
- DEBUG desactivado
83+
- Volúmenes más controlados
84+
85+
### 🎯 Comando para iniciar en producción:
86+
```bash
87+
docker-compose -f docker-compose.yml up --build -d
88+
```
89+
90+
### 🎯 Para ver logs:
91+
```bash
92+
docker-compose logs -f
93+
```
94+
95+
### 🎯 Para detener:
96+
```bash
97+
docker-compose -f docker-compose.yml down
98+
```
99+
100+
### 🔍 Confirmación visual:
101+
102+
En los logs verás:
103+
```rust
104+
[INFO] Starting gunicorn...
105+
[INFO] Booting worker with pid...
106+
```
107+
108+
---
109+
110+
# ⚖️ 4. Diferencias clave entre Dev Mode y Deploy Mode
111+
112+
| Característica | Dev Mode | Deploy Mode |
113+
| Servidor | runserver | Gunicorn |
114+
| Hot Reload | ✔ Sí | ❌ No |
115+
| Volúmenes | ✔ Montados | ❌ No montados |
116+
| DEBUG | ✔ Activado | ❌ Desactivado |
117+
| Archivos | usados | docker-compose.yml + override.yml docker-compose.yml |
118+
| Ideal | para Programar | Producción / pruebas reales |
119+
120+
---
121+
122+
# 📊 5. Flujo de archivos utilizados por Docker
123+
124+
## 🟢 Dev Mode:
125+
126+
```bash
127+
docker-compose.yml
128+
+ docker-compose.override.yml
129+
--------------------------------
130+
= Configuración combinada para desarrollo
131+
```
132+
133+
## 🔵 Deploy Mode:
134+
135+
```bash
136+
docker-compose.yml
137+
--------------------------------
138+
= Configuración única optimizada para producción
139+
```
140+
141+
---
142+
143+
# 🔧 6. Comandos útiles según el modo
144+
145+
## 🟢 Desarrollo
146+
147+
```bash
148+
docker-compose up
149+
docker-compose up --build
150+
docker-compose down
151+
docker-compose exec web bash
152+
```
153+
154+
155+
## 🔵 Producción
156+
157+
```bash
158+
docker-compose -f docker-compose.yml up -d
159+
docker-compose -f docker-compose.yml build
160+
docker-compose -f docker-compose.yml restart
161+
docker-compose -f docker-compose.yml down
162+
docker-compose logs -f
163+
```
164+
165+
---
166+
167+
# 🎓 7. Qué has aprendido en este nivel
168+
169+
✔ Diferencia entre override y compose normal
170+
✔ Separación entre entornos desarrollo y producción
171+
✔ Cómo usar .env en Docker
172+
✔ Cómo levantar Gunicorn con Django
173+
✔ Cómo aplicar healthchecks en contenedores
174+
✔ Cómo leer variables de entorno desde Django
175+
✔ Cómo Docker combina configuraciones

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
Django==4.2.7
22
psycopg2-binary==2.9.9
3-
djangorestframework==3.14.0
3+
djangorestframework==3.14.0
4+
gunicorn==21.2.0

0 commit comments

Comments
 (0)