feat: Add deploy environment, Add pyprojectoml
This commit is contained in:
331
AGENTS.md
331
AGENTS.md
@@ -7,19 +7,21 @@ Backend Django con Django REST Framework
|
||||
```
|
||||
don_confiao_backend/
|
||||
├── requirements.txt # Dependencias Python
|
||||
├── docker-compose.yml # Configuración Docker
|
||||
├── django.Dockerfile # Dockerfile Django
|
||||
├── .env # Variables de entorno
|
||||
├── .env_example # Ejemplo de variables de entorno
|
||||
├── README.rst # Documentación básica
|
||||
├── Rakefile # Tareas rake
|
||||
├── doc/ # Documentación adicional
|
||||
├── docker-compose.dev.yml # Docker Compose para desarrollo
|
||||
├── docker-compose.prod.yml # Docker Compose para producción
|
||||
├── django.Dockerfile # Dockerfile Django
|
||||
├── .env.development # Variables de entorno desarrollo
|
||||
├── .env.production.example # Ejemplo variables de entorno producción
|
||||
├── .env_example # Ejemplo de variables de entorno
|
||||
├── README.rst # Documentación básica
|
||||
├── Rakefile # Tareas rake
|
||||
├── doc/ # Documentación adicional
|
||||
│ └── requests.org
|
||||
└── tienda_ilusion/ # Proyecto Django
|
||||
└── tienda_ilusion/ # Proyecto Django
|
||||
├── manage.py
|
||||
├── db.sqlite3 # Base de datos SQLite
|
||||
├── don_confiao/ # App principal
|
||||
│ ├── models.py # Modelos: Customer, Product, Sale, SaleLine, Payment, ReconciliationJar, AdminCode
|
||||
├── db.sqlite3 # Base de datos SQLite (desarrollo)
|
||||
├── don_confiao/ # App principal
|
||||
│ ├── models.py # Modelos: Customer, Product, Sale, SaleLine, Payment, ReconciliationJar, AdminCode
|
||||
│ ├── views.py
|
||||
│ ├── api_views.py
|
||||
│ ├── serializers.py
|
||||
@@ -27,16 +29,20 @@ don_confiao_backend/
|
||||
│ ├── admin.py
|
||||
│ ├── urls.py
|
||||
│ ├── export_csv.py
|
||||
│ ├── tests/ # Tests
|
||||
│ ├── tests/ # Tests
|
||||
│ └── migrations/
|
||||
├── users/ # App de usuarios
|
||||
├── users/ # App de usuarios
|
||||
│ ├── models.py
|
||||
│ ├── views.py
|
||||
│ ├── serializers.py
|
||||
│ ├── urls.py
|
||||
│ └── tests/
|
||||
└── tienda_ilusion/ # Configuración Django
|
||||
├── settings.py
|
||||
└── config/ # Configuración Django
|
||||
├── settings/ # Settings por ambiente
|
||||
│ ├── __init__.py # Detección automática de ambiente
|
||||
│ ├── base.py # Configuración compartida
|
||||
│ ├── development.py # Configuración desarrollo
|
||||
│ └── production.py # Configuración producción
|
||||
├── urls.py
|
||||
├── wsgi.py
|
||||
└── asgi.py
|
||||
@@ -48,6 +54,9 @@ don_confiao_backend/
|
||||
- django-cors-headers
|
||||
- djangorestframework-simplejwt
|
||||
- sabatron-tryton-rpc-client==7.4.0 (integración con Tryton ERP)
|
||||
- psycopg2-binary (driver PostgreSQL para producción)
|
||||
- gunicorn (servidor WSGI para producción)
|
||||
- python-decouple (gestión de variables de entorno)
|
||||
|
||||
## Modelos Principales (don_confiao/models.py)
|
||||
- **Customer**: Clientes (name, address, email, phone, external_id)
|
||||
@@ -73,22 +82,50 @@ don_confiao_backend/
|
||||
|
||||
El proyecto se ejecuta con docker-compose. Todos los comandos `manage.py` deben ejecutarse dentro del contenedor:
|
||||
|
||||
### Desarrollo (Development)
|
||||
|
||||
```bash
|
||||
# Ejecutar tests
|
||||
docker-compose run --rm django python manage.py test
|
||||
docker-compose -f docker-compose.dev.yml run --rm django python manage.py test
|
||||
|
||||
# Migraciones
|
||||
docker-compose run --rm django python manage.py makemigrations
|
||||
docker-compose run --rm django python manage.py migrate
|
||||
docker-compose -f docker-compose.dev.yml run --rm django python manage.py makemigrations
|
||||
docker-compose -f docker-compose.dev.yml run --rm django python manage.py migrate
|
||||
|
||||
# Servidor desarrollo
|
||||
docker-compose up
|
||||
docker-compose -f docker-compose.dev.yml up
|
||||
|
||||
# Shell Django
|
||||
docker-compose run --rm django python manage.py shell
|
||||
docker-compose -f docker-compose.dev.yml run --rm django python manage.py shell
|
||||
|
||||
# Crear superuser
|
||||
docker-compose run --rm django python manage.py createsuperuser
|
||||
docker-compose -f docker-compose.dev.yml run --rm django python manage.py createsuperuser
|
||||
```
|
||||
|
||||
### Producción (Production)
|
||||
|
||||
```bash
|
||||
# Primero, copiar .env.production.example a .env.production y configurar variables
|
||||
cp .env.production.example .env.production
|
||||
# Editar .env.production con valores reales
|
||||
|
||||
# Iniciar servicios (PostgreSQL + Django con Gunicorn)
|
||||
docker-compose -f docker-compose.prod.yml up -d
|
||||
|
||||
# Migraciones
|
||||
docker-compose -f docker-compose.prod.yml run --rm django python manage.py migrate
|
||||
|
||||
# Colectar archivos estáticos
|
||||
docker-compose -f docker-compose.prod.yml run --rm django python manage.py collectstatic --noinput
|
||||
|
||||
# Crear superuser
|
||||
docker-compose -f docker-compose.prod.yml run --rm django python manage.py createsuperuser
|
||||
|
||||
# Ver logs
|
||||
docker-compose -f docker-compose.prod.yml logs -f django
|
||||
|
||||
# Detener servicios
|
||||
docker-compose -f docker-compose.prod.yml down
|
||||
```
|
||||
|
||||
Nota: El volumen monta `tienda_ilusion/` en `/app/`, por lo que el path correcto es `python manage.py` (no `python tienda_ilusion/manage.py`).
|
||||
@@ -96,13 +133,255 @@ Nota: El volumen monta `tienda_ilusion/` en `/app/`, por lo que el path correcto
|
||||
## Tests
|
||||
- Framework: Django unittest
|
||||
- Directorio: don_confiao/tests/
|
||||
- Ejecutar: `docker-compose run --rm django python manage.py test`
|
||||
- Ejecutar: `docker-compose -f docker-compose.dev.yml run --rm django python manage.py test`
|
||||
|
||||
## Comandos Útiles (dentro del contenedor)
|
||||
- Migraciones: `docker-compose run --rm django python manage.py makemigrations && docker-compose run --rm django python manage.py migrate`
|
||||
- Servidor desarrollo: `docker-compose up`
|
||||
- Shell Django: `docker-compose run --rm django python manage.py shell`
|
||||
- Superuser: `docker-compose run --rm django python manage.py createsuperuser`
|
||||
- Migraciones: `docker-compose -f docker-compose.dev.yml run --rm django python manage.py makemigrations && docker-compose -f docker-compose.dev.yml run --rm django python manage.py migrate`
|
||||
- Servidor desarrollo: `docker-compose -f docker-compose.dev.yml up`
|
||||
- Shell Django: `docker-compose -f docker-compose.dev.yml run --rm django python manage.py shell`
|
||||
- Superuser: `docker-compose -f docker-compose.dev.yml run --rm django python manage.py createsuperuser`
|
||||
|
||||
## Configuración de Ambientes
|
||||
|
||||
El proyecto soporta dos ambientes diferentes mediante la variable `DJANGO_ENV`:
|
||||
|
||||
### Development (desarrollo local)
|
||||
- **Variable de ambiente**: `DJANGO_ENV=development`
|
||||
- **Archivo de configuración**: `.env.development`
|
||||
- **Base de datos**: SQLite (db.sqlite3)
|
||||
- **DEBUG**: True
|
||||
- **CORS**: Permisivo para desarrollo local
|
||||
- **Docker Compose**: `docker-compose.dev.yml`
|
||||
|
||||
### Production (producción)
|
||||
- **Variable de ambiente**: `DJANGO_ENV=production`
|
||||
- **Archivo de configuración**: `.env.production` (crear desde `.env.production.example`)
|
||||
- **Base de datos**: PostgreSQL
|
||||
- **DEBUG**: False
|
||||
- **Seguridad**: HTTPS, HSTS, secure cookies, CSRF protections
|
||||
- **Docker Compose**: `docker-compose.prod.yml`
|
||||
- **Servidor**: Gunicorn con 4 workers
|
||||
|
||||
### Cambiar entre ambientes
|
||||
|
||||
La detección de ambiente es automática mediante la variable `DJANGO_ENV`. Docker Compose configura esta variable automáticamente según el archivo usado:
|
||||
|
||||
- `docker-compose.dev.yml` → usa `.env.development` → carga `settings/development.py`
|
||||
- `docker-compose.prod.yml` → usa `.env.production` → carga `settings/production.py`
|
||||
|
||||
### Variables de entorno requeridas
|
||||
|
||||
**Desarrollo** (`.env.development`):
|
||||
- `DJANGO_ENV=development`
|
||||
- `DEBUG=True`
|
||||
- `TRYTON_HOST`, `TRYTON_DATABASE`, `TRYTON_USERNAME`, `TRYTON_PASSWORD`
|
||||
|
||||
**Producción** (`.env.production`):
|
||||
- `DJANGO_ENV=production`
|
||||
- `DEBUG=False`
|
||||
- `SECRET_KEY` (generar una nueva y segura)
|
||||
- `ALLOWED_HOSTS` (dominios separados por comas)
|
||||
- `CORS_ALLOWED_ORIGINS` (URLs separadas por comas)
|
||||
- `CSRF_TRUSTED_ORIGINS` (URLs separadas por comas)
|
||||
- `DB_NAME`, `DB_USER`, `DB_PASSWORD`, `DB_HOST`, `DB_PORT`
|
||||
- `EMAIL_HOST`, `EMAIL_PORT`, `EMAIL_HOST_USER`, `EMAIL_HOST_PASSWORD`
|
||||
- `TRYTON_HOST`, `TRYTON_DATABASE`, `TRYTON_USERNAME`, `TRYTON_PASSWORD`
|
||||
|
||||
Ver `.env.production.example` para todos los detalles.
|
||||
|
||||
## Scripts Útiles
|
||||
|
||||
El proyecto incluye scripts para facilitar operaciones comunes:
|
||||
|
||||
### Health Check
|
||||
Verifica el estado de todos los servicios:
|
||||
```bash
|
||||
# Verificar ambiente de desarrollo
|
||||
./scripts/health-check.sh dev
|
||||
|
||||
# Verificar ambiente de producción
|
||||
./scripts/health-check.sh prod
|
||||
```
|
||||
|
||||
### Backup de Base de Datos (Producción)
|
||||
Crea un backup comprimido de la base de datos PostgreSQL:
|
||||
```bash
|
||||
./scripts/backup-db.sh
|
||||
```
|
||||
|
||||
Los backups se guardan en `backups/` y se mantienen por 7 días automáticamente.
|
||||
|
||||
### Restore de Base de Datos (Producción)
|
||||
Restaura un backup de la base de datos:
|
||||
```bash
|
||||
./scripts/restore-backup.sh <archivo_backup.sql.gz>
|
||||
```
|
||||
|
||||
**ADVERTENCIA**: Esto reemplazará la base de datos actual. Se crea un backup de seguridad antes de restaurar.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Errores Comunes
|
||||
|
||||
#### 1. Error: "database 'tienda_ilusion_user' does not exist"
|
||||
**Síntoma**: Aparece en los logs de PostgreSQL
|
||||
```
|
||||
FATAL: database "tienda_ilusion_user" does not exist
|
||||
```
|
||||
|
||||
**Causa**: Este es un comportamiento normal de PostgreSQL. Cuando te conectas sin especificar una base de datos, PostgreSQL intenta conectarse a una base con el mismo nombre del usuario.
|
||||
|
||||
**Solución**: Este error NO afecta el funcionamiento de Django. Para verificar que la base de datos correcta existe:
|
||||
```bash
|
||||
docker exec tienda_ilusion_postgres_prod psql -U tienda_ilusion_user -d tienda_ilusion_prod -c '\l'
|
||||
```
|
||||
|
||||
#### 2. Error: "required variable DB_PASSWORD is missing a value"
|
||||
**Síntoma**: Docker Compose falla al iniciar con error de variable faltante
|
||||
|
||||
**Causa**: El archivo `.env.production` no existe o tiene valores placeholder
|
||||
|
||||
**Solución**:
|
||||
1. Copiar el archivo de ejemplo: `cp .env.production.example .env.production`
|
||||
2. Editar `.env.production` y reemplazar todos los valores `CHANGE-ME-...` con valores reales
|
||||
3. Generar SECRET_KEY segura:
|
||||
```bash
|
||||
python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
|
||||
```
|
||||
|
||||
#### 3. Error: "ModuleNotFoundError" o importación fallida
|
||||
**Síntoma**: Django no puede importar módulos después de cambiar configuración
|
||||
|
||||
**Causa**: Dependencias no instaladas o contenedor con caché viejo
|
||||
|
||||
**Solución**:
|
||||
```bash
|
||||
# Reconstruir contenedores
|
||||
docker-compose -f docker-compose.dev.yml build --no-cache
|
||||
docker-compose -f docker-compose.dev.yml up
|
||||
|
||||
# Para producción
|
||||
docker-compose -f docker-compose.prod.yml build --no-cache
|
||||
docker-compose -f docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
#### 4. Error: "django.db.utils.OperationalError: could not connect to server"
|
||||
**Síntoma**: Django no puede conectarse a PostgreSQL
|
||||
|
||||
**Causa**: PostgreSQL aún no está listo cuando Django intenta conectar
|
||||
|
||||
**Solución**: El healthcheck en `docker-compose.prod.yml` maneja esto automáticamente. Si el problema persiste:
|
||||
```bash
|
||||
# Verificar que PostgreSQL esté corriendo
|
||||
docker ps | grep postgres
|
||||
|
||||
# Ver logs de PostgreSQL
|
||||
docker logs tienda_ilusion_postgres_prod
|
||||
|
||||
# Reiniciar servicios en orden
|
||||
docker-compose -f docker-compose.prod.yml restart postgres
|
||||
docker-compose -f docker-compose.prod.yml restart django
|
||||
```
|
||||
|
||||
#### 5. Error: "CSRF verification failed"
|
||||
**Síntoma**: Errores CSRF en producción
|
||||
|
||||
**Causa**: `CSRF_TRUSTED_ORIGINS` no configurado correctamente
|
||||
|
||||
**Solución**: En `.env.production`, asegurar que `CSRF_TRUSTED_ORIGINS` incluya el protocolo:
|
||||
```bash
|
||||
CSRF_TRUSTED_ORIGINS=https://tudominio.com,https://www.tudominio.com
|
||||
```
|
||||
|
||||
#### 6. Static files no se sirven en producción
|
||||
**Síntoma**: CSS/JS no cargan, errores 404 para archivos estáticos
|
||||
|
||||
**Causa**: `collectstatic` no ejecutado o configuración de nginx incorrecta
|
||||
|
||||
**Solución**:
|
||||
```bash
|
||||
# Ejecutar collectstatic
|
||||
docker-compose -f docker-compose.prod.yml exec django python manage.py collectstatic --noinput
|
||||
|
||||
# Verificar que los archivos existen
|
||||
docker exec tienda_ilusion_django_prod ls -la /app/staticfiles
|
||||
```
|
||||
|
||||
#### 7. Migraciones pendientes después de deployment
|
||||
**Síntoma**: Errores de base de datos o tablas faltantes
|
||||
|
||||
**Causa**: Migraciones no aplicadas en producción
|
||||
|
||||
**Solución**:
|
||||
```bash
|
||||
# Ver estado de migraciones
|
||||
docker-compose -f docker-compose.prod.yml exec django python manage.py showmigrations
|
||||
|
||||
# Aplicar migraciones pendientes
|
||||
docker-compose -f docker-compose.prod.yml exec django python manage.py migrate
|
||||
```
|
||||
|
||||
### Comandos de Diagnóstico
|
||||
|
||||
```bash
|
||||
# Ver todos los contenedores
|
||||
docker ps -a
|
||||
|
||||
# Ver logs en tiempo real
|
||||
docker-compose -f docker-compose.prod.yml logs -f
|
||||
|
||||
# Ver logs solo de Django
|
||||
docker logs -f tienda_ilusion_django_prod
|
||||
|
||||
# Ver logs solo de PostgreSQL
|
||||
docker logs -f tienda_ilusion_postgres_prod
|
||||
|
||||
# Ejecutar shell en contenedor Django
|
||||
docker-compose -f docker-compose.prod.yml exec django bash
|
||||
|
||||
# Ejecutar Django shell
|
||||
docker-compose -f docker-compose.prod.yml exec django python manage.py shell
|
||||
|
||||
# Conectar a PostgreSQL
|
||||
docker exec -it tienda_ilusion_postgres_prod psql -U tienda_ilusion_user -d tienda_ilusion_prod
|
||||
|
||||
# Verificar variables de entorno en contenedor
|
||||
docker-compose -f docker-compose.prod.yml exec django env | grep DJANGO
|
||||
```
|
||||
|
||||
### Performance y Optimización
|
||||
|
||||
Si experimentas problemas de rendimiento:
|
||||
|
||||
1. **Verificar recursos del contenedor**:
|
||||
```bash
|
||||
docker stats
|
||||
```
|
||||
|
||||
2. **Ajustar workers de Gunicorn** (editar `docker-compose.prod.yml`):
|
||||
```yaml
|
||||
command: gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers 8 --timeout 120
|
||||
```
|
||||
Regla general: `workers = (2 x CPU cores) + 1`
|
||||
|
||||
3. **Habilitar persistent connections**: Ya configurado en `settings/production.py` con `CONN_MAX_AGE = 600`
|
||||
|
||||
4. **Considerar agregar Redis para caché**: Descomentar sección de Redis en `settings/production.py`
|
||||
|
||||
### Seguridad
|
||||
|
||||
Antes de ir a producción, verificar:
|
||||
|
||||
- [ ] `DEBUG=False` en `.env.production`
|
||||
- [ ] `SECRET_KEY` único y seguro generado
|
||||
- [ ] `ALLOWED_HOSTS` configurado con dominios reales
|
||||
- [ ] `CORS_ALLOWED_ORIGINS` limitado a orígenes confiables
|
||||
- [ ] `CSRF_TRUSTED_ORIGINS` configurado correctamente
|
||||
- [ ] Contraseñas de base de datos seguras
|
||||
- [ ] `.env.production` NO commiteado a git
|
||||
- [ ] HTTPS habilitado (certificados SSL/TLS configurados)
|
||||
- [ ] Firewall configurado (solo puertos necesarios abiertos)
|
||||
- [ ] Backups automáticos configurados
|
||||
|
||||
## Integraciones
|
||||
- **Tryton ERP**: Integración mediante sabatron-tryton-rpc-client para sincronización de clientes, productos y ventas
|
||||
|
||||
Reference in New Issue
Block a user