Paso a paso (Ubuntu/Linux)
1
Preparar entorno
Crear y activar el entorno virtual para aislar dependencias.
python3 -m venv venv
source venv/bin/activate
2
Instalar Django
Instalar el framework dentro del entorno.
pip install django
3
Crear proyecto
Generar el esqueleto principal del sitio.
django-admin startproject mi_proyecto .
4
Crear app
Separar funcionalidades en una aplicación.
python manage.py startapp mi_app
Carpetas que se crean
Estructura principal
mi_proyecto/
├─ manage.py
├─ mi_proyecto/
│ ├─ __init__.py
│ ├─ settings.py
│ ├─ urls.py
│ ├─ asgi.py
│ └─ wsgi.py
└─ mi_app/
├─ migrations/
├─ __init__.py
├─ admin.py
├─ apps.py
├─ models.py
├─ tests.py
└─ views.py
¿Qué es cada cosa?
- manage.py: comandos del proyecto.
- settings.py: configuración general.
- urls.py: rutas del sitio.
- views.py: lógica de las vistas.
- models.py: modelos de datos.
- migrations/: historial de cambios en BD.
Comandos para VPS y despliegue Django
Copiar archivos desde terminal a un VPS
Opciones rápidas para subir carpetas o archivos al servidor.
# Copiar un archivo con scp
scp archivo.zip usuario@tu-vps:/var/www/mi_proyecto/
# Copiar una carpeta completa
scp -r mi_proyecto/ usuario@tu-vps:/var/www/mi_proyecto/
# Alternativa eficiente con rsync
rsync -avz --delete mi_proyecto/ usuario@tu-vps:/var/www/mi_proyecto/
Migraciones y collectstatic
Comandos clave para aplicar cambios y generar archivos estáticos.
# Aplicar migraciones en el servidor
python manage.py migrate
# Crear nuevas migraciones (cuando cambias modelos)
python manage.py makemigrations
# Recolectar archivos estáticos
python manage.py collectstatic
# En settings.py para producción
STATIC_ROOT = BASE_DIR / "staticfiles"
STATIC_URL = "/static/"
Copiar usando claves SSH
Evita pedir contraseña en cada conexión.
# Crear clave
ssh-keygen -t ed25519 -C "tu_correo@example.com"
# Enviar clave al VPS
ssh-copy-id usuario@tu-vps
# Usar scp/rsync sin password
scp -r mi_proyecto/ usuario@tu-vps:/var/www/mi_proyecto/
rsync -avz mi_proyecto/ usuario@tu-vps:/var/www/mi_proyecto/
Staticfiles con Nginx
Sirve estáticos desde una carpeta dedicada.
# /etc/nginx/sites-available/mi_dominio
server {
listen 80;
server_name midominio.com www.midominio.com;
location /static/ {
alias /var/www/mi_proyecto/staticfiles/;
}
location / {
proxy_pass http://127.0.0.1:8000;
}
}
Nginx en puerto 80 y dominios
Dominio apuntando a carpeta (sitio estático)
Ideal para HTML/CSS/JS sin backend.
# /etc/nginx/sites-available/mi_dominio
server {
listen 80;
server_name midominio.com www.midominio.com;
root /var/www/mi_sitio;
index index.html;
}
Dominio apuntando a Django (proxy a Gunicorn)
Nginx recibe el tráfico y lo envía al backend.
# /etc/nginx/sites-available/mi_dominio
server {
listen 80;
server_name midominio.com www.midominio.com;
location /static/ {
alias /var/www/mi_proyecto/staticfiles/;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Levantar Django con Gunicorn
Ejecución directa (rápida)
Útil para pruebas en el VPS.
# Instalar gunicorn
pip install gunicorn
# Ejecutar el WSGI del proyecto
gunicorn mi_proyecto.wsgi:application --bind 127.0.0.1:8000
Servicio systemd (recomendado)
Mantiene el proceso activo y reinicia si falla.
# /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/mi_proyecto
ExecStart=/var/www/mi_proyecto/venv/bin/gunicorn \
mi_proyecto.wsgi:application --bind 127.0.0.1:8000
[Install]
WantedBy=multi-user.target