Pasos basicos para hacer deploy de una App en Django con EC2 y AWS
Requisitos
- Cuenta en AWS ya activada
- Terminal con ssh (Linux,MacOs) y Putty (Windows) Video para mas info con putty
- Instalar python-dotenv (Libreria para crear variables de entorno)
$ pip install -U python-dotenv
#WSGI.py
from dotenv import load_dotenv
try:
dotenv_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), '.env')
load_dotenv(dotenv_path)
except:
pass
#manage.py
from dotenv import load_dotenv
try:
dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
load_dotenv(dotenv_path)
except:
pass
- Dentro del Proyecto al mismo nivel del manage.py crear documento requirements de dependencias de python
$ pip freeze > requeriments.txt
- Configurar settings.py y local_settings.py (click para ver ejemplo)
- Crear .gitignore con gitignore.io
- Subimos nuestro proyecto al repositorio remoto que tenemos en github
- En el dashboard de AWS seleccionar la opcion EC2 en la pestaña de de "services"
- Ubicados "EC2 Dashboard" seleciona "Launch Instance"
- Selecciona la distribucion del servidor NOTA: Para este ejemplo utilizaremos "Ubuntu server 16.04 LTS"
- Seleccionamos la opcion "t2.micro" y damos click en "Review and Launch"
- En la ventana de "Review Instance Launch" dar click en "Launch"
- Aparece un dialogo para seleccionar o crear "Key pair", escogemos la opcion de "Create a new key pair" y agregamos un nombre, por ultimo damos click en "Download Key Pair" NOTA: No perder el archivo "nombre.pem" ya que es la unica forma de entrar al servidor
- Por ultimo damos click en "launch instance"
- En la pantalla de "Launch Status" selecionamos la opcion de "View instance"
- Finalmente seremos enviados de nuevo al dashboard y se vera corriendo nuestra nueva instancia
-
En el dashboard de la intancia selecionamos la opcion de "Connect" aparacera un dialogo con algunas instrucciones:
- Mac y Linux:
- Copiar el "archivo.pem" en la carpeta ".ssh" que se encuentra en su directorio raiz
- cambiar los permisos del archivo con
*Para conectarse utlizar el ejemplo que aparece en el dialogo de "connect" por ejemplo:$ chmod 400 archivo.pem
$ ssh -i "prueba.pem" [email protected]
- Windows:
- Seguir el siguiente tutorial para usar Putty -> https://www.youtube.com/watch?v=0PtBREh74r4
- Mac y Linux:
-
Sabremos si estamos conectados si aparece una pantalla como sigue:
- En la consola escribimos los siguentes comandos para catualizar los repositorio y dependencias de ubuntu:
$ sudo apt-get update
$ sudo apt-get upgrade
- Tendremos que configurara los "locale" atravez de los siguientes pasos:
- ejecutamos el siguiente comando
$ sudo nano /etc/environment
- agregamos la siguientes lines abajo de PATH
LC_ALL="en_US.utf8" LANGUAGE="en_US.utf8"
- Guardamos el archivo y reiniciamos la instancia con:
sudo reboot
- La conexion se perdera y esperamos unos minutos para reestablecer la conexion
- Para instalar Postgres 9.5 en nuestra instancia corremos los siguientes comandos:
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'
$ wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add
$ sudo apt-get update
$ sudo apt-get install postgresql postgresql-contrib
- Para instalar nginx se tiene que realizar los siguiente:
$ sudo apt-get install nginx
- instalaremos PIP y Virtualenv es:
$ sudo apt-get install python-virtualenv python-pip
- Regresamos al dashboard de AWS y seleccionamos "Security groups" que se encuentra en el menu izquierdo en la parte inferior
- Seleccionamos la opcion que diga "launch-wizard-XXXX" en la parte de "Group name"
- Ya con la opcion señalada ,damos clic en "Actions">"Edit inbound rules"
- Aparecera un dialogo como el siguiente, damos click en "Add rule"
- Se crea una nueva opción llamada "Custom TCP Rule", seleccionamos la opcion y elegimos "HTTP", damos en "Save"
- Por ultimo volvemos "Instances" (la opcion se encuentra en el menu izquierdo en la parte superior), copiamos el "Public DNS (IPv4)" que se encuentra en la parte inferir de nuestra pantalla y lo pegamos en una nueva pestaña del navegador, como resultado tendremos el "Welcome to Nginx" en el navegador
- Iniciamos nuestra consola de ssh
- Una vez dentro creamos una carpeta Ex : "Proyecto"
mkdir proyecto
- Entramos a la nueva carpeta y creamos un entorno virtual con python 3
$ cd proyecto
$ virtualenv entorno -p python3
- Clonamos nuestro repositorio remoto
git clone https://github.com/LigorioSalgado/Ejemplo
- Nota: Entes de empezar necesitamos intsalar lo siguiente:
$ sudo apt-get install libpq-dev python3-dev build-essential
- Activamos nuestro entorno y Entramos en la carpeta de nuestro proyecto he instalamos las dependencias con :
$ pip install -r requirements.txt
- Para ingresar a la linea de comandos de postgres se debe ejecutar lo siguiente:
$ sudo su - postgres
- Creamos la BD para nuestro proyecto
$ createdb (nombre de la BD)
$ createuser (nombre del usuario de la BD)
*Despues tendremos que ingresar a psql
$ psql
*una vez en psql damos los siguientes comandos
postgres=# ALTER DATABASE (Nombre de la BD) OWNER TO (Nombre del usuario de la BD);
postgres=# ALTER USER (nombre del usuario BD) WITH PASSWORD (password para el usuario)
postgres=# \l #lista las bd
postgres=# \q #sale de psql
- damos el siguiente comando para regresar a nuestro proyecto
$ exit
- Antes de empezar debemos crear un archivo llamado .env al mismo nivel que el manage.py con lo siguiente
Nota:el archivo .env tambien se agrega al gitignore
DBNAME = "nombre de la BD"
DBUSER = "nombre del usuario de la BD"
DBPASSWORD = "password de la BD"
# Tambien se pueden poner otros valores como api keys o secret keys
- Hacemos la migraciones de nuestro proyecto, recogemos los staticos del proyecto y por ultimo creamos un superusuario
$ python manage.py migrate
$ python manage.py collectstatic
$ python manage.py createsuperuser
*Por ultimo corremos check para comprobar errores como sigue:
$ python manage.py check
- Se crea un archivo llamado gunicorn.service (ver ejemplo) con el comando
sudo nano /etc/systemd/system/gunicorn.service
- Despues se ejecutan los siguientes comandos para activar el servicio
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
$ sudo systemctl status gunicorn
- Una vez activado gunicorn procedemos a configurar nginx como lo muestra este archivo con el siguiente comando
$ sudo nano /etc/nginx/sites-available/<nombre-del-proyecto>
- creamos un link simbolico :
$ sudo ln -s /etc/nginx/sites-available/<nombre-del-proyecto> /etc/nginx/sites-enabled
- corremos un test para comprobar que no hay errores de sintaxis:
$ sudo nginx -t
- Reiniciamos nginx con:
$ sudo systemctl restart nginx
*Por ultimo nos dirigimos a la-public-dns-de-la-instancia.amazonaws.com/admin/ y comprobamos que el server ya esta corriendo y ya podemos usar el admin