Guía rápida

Ubuntu/Linux + Django

Pasos esenciales para crear un proyecto Django, con comandos claros y una vista rápida de las carpetas que se generan.

Comandos base

# 1) Crear entorno virtual
python3 -m venv venv
source venv/bin/activate

# 2) Instalar Django
pip install django

# 3) Crear proyecto
django-admin startproject mi_proyecto .

# 4) Crear app
python manage.py startapp mi_app

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