====== Deploy ====== Este manual parte de la base que el administrador de sistema tiene capacidad para hacer un despliegue de Django en producción tal como se describe en la documentación de Django https://docs.djangoproject.com/en/dev/howto/deployment/ El stack de esta configuración se basa en supervisor, uwsgi y nginx. Componentes de la aplicación ============================ .. image:: _static/images/arch_sabios.png Despliegue de la aplicación =========================== Configuración inicial --------------------- Para desplegar correctamente la aplicación es necesario tener como base un sistema compatible con los modulos y tecnologias utilizadas en el proyecto. .. note:: Todos estos comandos son ejecutados en un sistema Ubuntu Linux, la versión desplegada es 13.04 Paquetes básicos ^^^^^^^^^^^^^^^^ Algunas librerias del sistema son necesarias para compilar algunos componentes necesarios del proyecto, estos paquetes ya pueden estar instalados en el sistema operativo donde se hace el despliegue, sin embargo es bueno confirmar antes de continuar. .. code-block:: bash $ sudo apt-get install build-essential $ sudo apt-get install python2.7-dev $ sudo apt-get install libxslt1-dev $ sudo apt-get install libxml2-dev $ sudo apt-get install python-dev $ sudo apt-get install libpq-dev $ sudo apt-get install postgresql-server-dev-9.1 $ sudo apt-get install libjpeg62-dev zlib1g-dev libfreetype6-dev $ sudo apt-get install nodejs nodejs-dev npm $ sudo apt-get install ruby1.9.1 cloc $ gem install compass .. note:: Si es un sistema diferente a Ubuntu los nombres de los paquetes pueden variar. COMPRESIÓN ^^^^^^^^^^ Es necesario contar con nodejs para instalar unos requerimientos especiales que son utilizados por los scripts para manejo de archivos estaticos. Para compilar e instalar se siguen los pasos descritos en: https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager Luego como root se deben instalar los siguientes paquetes: .. code-block:: bash $ npm -g install yuglify uglify-js jshint@0.9.1 GIT ^^^ Lo primero que se necesita es GIT en caso que se quiera realizar una copia del proyecto desde el repositorio. Este paso no es necesario si ya se cuenta con los fuentes del proyecto en un archivo empaquetado. .. code-block:: bash $ sudo apt-get install git-core $ git --version .. note:: Se debe comprobar que GIT sea version 1.7 o superior. PIP ^^^ PIP es una utilidad que permite instalar paquetes de python de una manera mas sencilla y compatible con multiples sistemas y requerimientos de paquetes, es una mejora al sistema anterior llamado *easy_install*. .. code-block:: bash $ sudo apt-get install python-setuptools $ sudo easy_install pip Sudo ^^^^ Configuración de sudo .. code-block:: bash # Cmnd alias specification Cmnd_Alias CELERYD_RESTART = /usr/bin/supervisorctl restart celeryd Cmnd_Alias CELERYCAM_RESTART = /usr/bin/supervisorctl restart celerycam # User privilege specification deploy ALL=(ALL:ALL) ALL # Restart celery as deploy with no password deploy ALL= NOPASSWD: CELERYD_RESTART deploy ALL= NOPASSWD: CELERYCAM_RESTART Virtualenv ^^^^^^^^^^ *Virtualenv* es utilidad que permite crear entornos virtuales para la ejecucion controlada de proyectos escritos en *Python*. .. code-block:: bash $ sudo pip install virtualenv Luego de tener instalada y configurada la herramienta para el manejo de los entornos virtuales, procedemos a crear uno para alojar el proyecto. .. code-block:: bash $ virtualenv sabios_app --no-site-packages --distribute Luego de creado el entorno virtual lo cargamos. .. code-block:: bash $ cd sabios_app $ source bin/activate El 'prompt' de la consola debe cambiar a algo similiar a: .. code-block:: bash (sabios_app)$ Ahora tenemos creado el entorno virtual que nos permite configurar un ambiente único de ejecución para nuestro proyecto. Creación de la base de datos ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Es necesario realizar la creación de la base de datos para el proyecto. Esto lo realizamos siguiendo los siguientes comandos: .. code-block:: bash $ sudo -i $ su - postgres $ psql => CREATE ROLE sabios LOGIN ENCRYPTED PASSWORD 'mi-clave' NOINHERIT VALID UNTIL 'infinity'; => CREATE DATABASE sabios WITH ENCODING='UTF8' OWNER=sabios TEMPLATE=template0; Luego autorizamos las conexiones locales a postgres: .. code-block:: bash $ vim /etc/postgresql/9.1/main/pg_hba.conf # Agregamos esta linea al archivo local sabios sabios md5 Cambiamos el parametro de encripcion de contraseñas: .. code-block:: bash $ vim /etc/postgresql/9.1/main/postgresql.conf # Quitamos el comentario de la linea password_encryption = on Reiniciamos postgresql para que tome los ultimos cambios: .. code-block:: bash $ service postgresql restart Probamos conectarnos con el usuario de la aplicación: .. code-block:: bash $ psql -d sabios -U sabios Con estos pasos comprobados ya podemos vincular la aplicación a esta base de datos. Despliegue de codigo fuente ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Ahora que tenemos configurada nuestra base de ejecución vamos a desplegar el codigo fuente del proyecto, bien sea por GIT o desde un archivo empaquetado. Esta carpeta debe llamarse **sabios** y debe estar en la raiz del entorno virtual. Luego ejecutamos lo siguiente: .. code-block:: bash (sabios_app)$ easy_install egenix-mx-base (sabios_app)$ pip install -r requirements.txt Con lo cual se comienza el proceso de instalación de las librerias necesarias por el proyecto, esto puede demorar varios minutos. Configuración avanzada ---------------------- A continuación se deben establecer los parámetros para que la aplicación funcione de forma local en el fichero **local_settings.py** que debe ser creado en la raiz del proyecto. Los parametros a configurar son: .. include:: base_files/local_settings.py :literal: Se deben configurar los datos según los parametros del servidor de producción. *Contacte a su administrador de plataforma si tiene dudas*. Base de datos ------------- Una vez configurado el proyecto, es necesario crear una base de datos de acuerdo con la especificación hecha en el fichero **local_settings.py**. Cuando esta base de datos exista, debe ser poblada con las tablas necesarias por la aplicación. .. code-block:: bash (sabios_app)$ ./manage.py syncdb --all --noinput (sabios_app)$ ./manage.py migrate --fake .. note:: Tenga en cuenta que debe tener el entorno virtual activo La ejecución de estos comandos le creará la base de datos con todas las tablas y la información base utilizada para el desarrollo de la aplicación, tenga en cuenta que estos comandos deben ser ejecutados solamente cuando se despliegue el proyecto por primera vez. Integración continua -------------------- Los pasos para la integración continua con jenkins son: .. include:: base_files/jenkins_production.sh :literal: Configuración de servidor PHP (Wiris) ------------------------------------- Para la integración con WIRIS (procesamiento de fórmulas matemáticas) es necesario que un directorio del proyecto se encuentre habilitado para procesamiento de scripts php. Para realizar esta configuración se recomienda el uso de php-fpm en conjunto con nginx, para ello se procede a realizar la instalación, como usuario root: .. code-block:: bash $ apt-get install php5-common php5-cli php5-fpm php5-gd Una vez se haya realizado la instalación, se procede a modificar el archivo de configuración de nginx, donde se encuentre configurada la aplicación, como se muestra a continuación: .. code-block:: bash location /wiris/pluginwiris/core/ { alias /ruta/aplicacion/wiris/pluginwiris/core/; #expires max; } location /wiris/pluginwiris/lang/ { alias /ruta/aplicacion/wiris/pluginwiris/lang/; #expires max; } location /wiris/ { alias /ruta/aplicacion/wiris/; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; } Antes de eso debe configurarse el servicio php-fpm para que escuche sobre el puerto 9000 en la dirección 127.0.0.1. Esto se realiza en el archivo www.conf sobre el directorio /etc/php5/fpm/pool.d incluyendo la instrucción: .. code-block:: bash listen = 127.0.0.1:9000 Una vez realizada esta verificación, reiniciar los servicios de nginx y php-fpm. Archivos de configuración ========================= Mantenemos copia de los archivos de configuración en doc/source/bas_files , en tal espacio están las versiones iniciales de los mismos para cada uno de los servicios. nginx y https ------------- El punto de entrada de archivos de configuración es ngnix, como ngnix.conf, la versión de producción se encuentra en /etc/nginx/sites-availables/ , en tal archivo se especifica la ruta al archivo crossdomain necesario para flash con permisos relajados de acuerdo a la solicitud del proveedor. Se encuentra el directorio de estáticos de wiris y también la referencia al servicio php que está corriendo para el funcionamiento de wiris, los archivos estáticos servidos por la plataforma y la conexión con el servidor de aplicaciones. En nginx también está configurado el certificado SSL. Servidor de aplicaciones y tareas en background ----------------------------------------------- Las tareas programadas tanto como las tareas en background junto con el servidor de aplicaciones están gestionados por supervisor, los archivos de configuración de supervisor para celery, celerycam y uwsgi están en /etc/uwsgi/sites-available , adicionalmente el servidor de aplicaciones está configurado a través del archivo uwsgi.ini. Archivos en Amazon ------------------ Los archivos en Amazon está configurados con django-storages y las variables de configuración necesaria están en local_settings.py Otras configuraciones --------------------- Sentry, correo electrónico, Google Analytics y New Relic son configurados en local_settings.py para colocar las llaves correspondientes, la configuración del lado de las integraciones están más allá del alcance del presente manual y es necesario consultar las librerías y los manuales del proveedor en cuestión. Actualización del servidor -------------------------- El script que se debe ejecutar cada vez que se ejecuta el despliegue es jenkins_production.sh , las labores de actualización del Sistema Operativo pueden en algún momento afectar el funcionamiento de la aplicación, por lo tanto se requiere que las actualizaciones a nivel de sistema operativo y librerías sea ejecutada por un administrador de sistema que conozca las labores básicas de despliegue de una aplicación Django. Versiones ========= Las versiones mayores se llevarán controladas en el archivo releases.rst en donde se especificará en cada una de ellas los cambios notables que requerirán ejecución de scripts, evolución en el modelo o la arquitectura de todo el sistema.