miércoles, 2 de octubre de 2013

Django Implementación (Deployment) Ubuntu + NGINX + uWSGI + MySQL en 10 pasos (Actualizado)

Bien ya me toco instalar django sobre apache, pero mucha gente me ha referido a nginx como un gran servidor para equipos con bajos recursos ( quiero ponerlo dentro de una maquina virtual -_- ), que pueden levantar con mayor velocidad, así que me dispuse a probarlo dentro de una maquina virtual aquí el procedimiento:


PASO 1

Instalar el Ubuntu, en este caso no hubo mayor problema descargue virtualbox versión 4.2.18 y la versión de ubuntu 12.04.3 LTS. Te recomiendo que durante el proceso de instalación cuando te pregunte por instalar un servidor Open SSH, si lo actives, te será más facil lo siguiente realizando una conexión ssh (Sobre todo si estas utilizando un maquina virtual).


PASO 2

Como siguiente paso instalaremos mysql usando las instrucciones:
$ sudo apt-get upgrade
$ sudo apt-get install mysql-server

NOTA: Ojo con el password que se requerirá posteriormente. Que bonito funciona ubuntu todo con línea de comandos y casi sin problema :) ...


PASO 3

Ahora instalamos pip ( Generalmente python ya viene instalado por defecto a menos que desees otra instalación de python ) para instalarlo usamos:
$ sudo apt-get install python-setuptools
$ mkdir setup 
$ cd setup
$ wget http://python-distribute.org/distribute_setup.py
$ sudo python distribute_setup.py
$ sudo easy_install pip

NOTA: Es increíble lo bien que funciona, todo desde el terminal si hay errores solo es buscar un poco en internet.


PASO 4

Instalar Django hacemos lo siguiente
$ sudo pip install Django


PASO 5

Ahora bien empezamos con el enlace mysql-python para eso debemos instalar la herramienta de mysqldb usando los siguientes comandos:

Ese comando actualiza las referencias.
$ sudo easy_install -U distribute 
$ sudo apt-get install libmysql++-dev
# Ese comando evita los errores relacionados a - gcc -
$ sudo apt-get install python-dev   
$ sudo apt-get install python-mysqldb


PASO 6

Copiamos o creamos nuestro proyecto:
$ django-admin.py startproyect mi_proyecto

NOTA: Esta guía es solo es para la implementación por lo que supongo que ya tienen algo desarrollado o bien pueden colocar dentro de alguna vista un Hola Mundo para realizar pruebas.


PASO 7

Empezamos ahora con la parte interesante, para instalar nginx seguimos con lo genial de ubuntu usando la línea de comandos:
$ sudo apt-get install nginx
$ sudo apt-get install build-essential python
# Este comando actualiza las referencias de pip.
$ sudo easy_install -U pip
# Este comando actualiza las referencias de uwsgi.
$ sudo easy_install -U uwsgi      
$ sudo pip install uwsgi

NOTA: La segunda herramienta se utiliza para el control de uwsgi, que es la que posibilita a django enlazar con nginx previamente había un fastcgi pero al parecer django esta por darlo de baja en la versión Django 1.7.


PASO 8

Necesitaremos crear el archivo ini que utilizará uwsgi para manejar nuestra aplicación, la ubicación del archivo puede ser dentro del directorio del proyecto, en mi caso generalmente lo pongo dentro de una carpeta que se llama deploy, y el nombre puede ser: mi_proyecto_uwsgi.ini y le añadimos el siguiente contenido:

[uwsgi]
     chdir = /ruta/a/tu/proyecto/ 
     module = mi_proyecto.wsgi
     master = true
     processes = 10
     socket  = /ruta/a/tu/proyecto/mi_proyecto.sock 
     chmod-socket  = 666
     vacuum  = true


PASO 9

Ahora necesitaremos indicarle a nginx donde buscar los datos del uwsgi para esto dentro del mismo directorio de deploy que tenemos dentro de nuestro proyecto creamos un archivo con nombre mi_proyecto_nginx.conf con el siguiente contenido:


upstream django{
        server unix:///ruta/a/tu/proyecto/mi_proyecto.sock;
}

server {
        listen   80;
     
        server_name mi_server;
        charset utf-8;

        # Max upload size
        client_max_body_size 10M;

        access_log /ruta/a/tu/proyecto/mi_proyecto.access.log;
        error_log /ruta/a/tu/proyecto/mi_proyecto.error.log;

        location /static {
                gzip_static on;
                alias /ruta/a/tu/proyecto/static/;
        }

        location / {
                include /etc/nginx/uwsgi_params;   # verificar la ruta en tu implementación
                uwsgi_pass django;
        }
}

NOTA IMPORTANTE:
Como lo hicimos con la configuración de uwsgi también es necesario indicarle esta configuración a nginx y de igual forma lo mejor es crear un enlace símbolico:

$ sudo ln -s  /ruta/a/tu/proyecto/deploy/mi_proyecto_nginx.conf   /etc/nginx/sites-enabled/ 


PASO 10

Hasta el paso anterior ya podriamos hacer algunas pruebas reiniciando el nginx ...
$ sudo /etc/init.d/nginx restart

... y corriendo el comando:
$ uwsgi --ini mi_proyecto.ini

Sin embargo lo que seguro vamos a necesitar, es que el servidor, cargue automáticamente el proyecto al iniciar el equipo, para esto necesitaremos los siguientes comandos:

# Creando el servicio
$ sudo vi /etc/rc.local

# Agregar la siguiente línea al archivo antes del exit 0 
/usr/bin/uwsgi --emperor /ruta/a/tu/proyecto/deploy/mi_proyecto_uwsgi.ini --uid mi_usuario --gid www-data --daemonize /ruta/a/tu/proyecto/mi_proyecto.uwsgi.log

NOTA: Se debe verificar la ubicación del archivo uwsgi.


Realizado lo anterior al reiniciar la maquina virtual o el servidor debería de cargarlo correctamente.

Espero te sea de utilidad !


Referencias y links consultados:
https://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html?highlight=django
http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html#deploying-django
http://eth0.pro/post/1
http://www.ubuntu-es.org/node/172656#.UcDqY5WWRhY
https://www.digitalocean.com/community/articles/how-to-install-nginx-on-ubuntu-12-04-lts-precise-pangolin
http://www.howtogeek.com/howto/ubuntu/install-mysql-server-5-on-ubuntu/
https://gist.github.com/panuta/3075882
http://stackoverflow.com/questions/11094718/error-command-gcc-failed-with-exit-status-1-while-installing-eventlet
http://askubuntu.com/questions/157840/why-does-apt-get-fail-to-resolve-the-mirror
http://skuarch.blogspot.mx/2010/02/crear-un-servicio-en-ubuntu.html
http://stackoverflow.com/questions/11425106/python-pip-install-fails-invalid-command-egg-info

martes, 10 de septiembre de 2013

Guía rápida para los comandos de Git

Implementando Git en la empresa donde trabajo hicimos un resumen de los comandos que más utilizamos ...

Bajar repositorio ...
$ git clone https://github.com/usuario/repo.git

Entrar al repositorio ...
$ cd mlog

Ver los branch ocultos ...
$ git branch -a

Trabajar con los branches de manera local ...
$ git checkout -b stage origin/pruebas
$ git checkout -b master origin/produccion


Para cambiar de branch ...
$git checkout pruebas

Revisar cambios de los archivos ...
$ git status

Actualizar archivos nuevos y eliminados ...
$ git add -u

Realizar el commit en el equipo de forma local ...
$ git commit -m "Mensaje"

Bajar o actualizar el branch...
$ git pull https://github.com/usuario/repo.git pruebas

Subir información...
$ git push https://github.com/usuario/repo.git desarrollo

Combinar ramas ...
Rama Origen: desarrollo
Rama Destino: pruebas
(desarrollo) $ git checkout pruebas
(pruebas) $ git merge desarrollo


Actualización :: 24/Sep/2013

Ver el autor de cada una de las líneas de código de un archivo ...
$ git blame miarchivo.py

En caso de que tengas varios archivos que git marca como modificados y quieres deshacerte de todo utiliza:
$ git clean -df & git checkout .



Espero te sea de utilidad !

Créditos
Elaborada en equipo con - Carmen Gutierrez Perez - Miguel Velazco - Gonzalo Morales -

Referencias:
http://git-scm.com/book/en/Git-Branching-Basic-Branching-and-Merging


PHP Error Log desde el terminal (OSX)

Como fan de la terminal, me tope con la siguiente opción para ver los errores en tiempo real del php_error.log y es utilizando el siguiente comando:

$ tail -f /ruta/al/logs/php_error.log

En mi caso utilizo MAMP como herramienta de pruebas por lo que con la siguiente instrucción puedo estar viendo los errores que se generan desde el terminal:

$ tail -f /Applications/MAMP/logs/php_error.log

Si es muy largo el comando siempre podemos acudir al ~/.bash_profile para crear un alias por ejemplo:

-- Abrimos el archivo .bash_profile:
$ vi ~/.bash_profile

-- Añadimos la línea:
alias phplog="tail -f /Applications/MAMP/logs/php_error.log"

-- Guardamos el archivo y salimos
usando ESC + [Presionar :] + [Presionar w] + [Presionar q]

-- Debemos reiniciar el terminal para que los cambios tengan efecto, y posteriormente solo utilizamos:
$ phplog


Espero te sea de utilidad !


Referencias:
http://magp.ie/2011/03/10/debugging-php-by-monitoring-errors-in-terminal/

sábado, 31 de agosto de 2013

Agregar nombre de la rama (branch) de git al prompt de OSX o Linux

Este proceso en realidad es muy sencillo si se esta utilizando alguna interfaz gráfica pero en ocasiones puede ser útil para los que nos gusta mucho usar el terminal el poder ver en todo momento en cuál rama (branch) estamos actualmente o tenemos activa.

Para dicho fin debemos editar el archivo .bash_profile lo cuál podemos hacerlo desde el terminal usando vim o el editor de su preferencia:

$ vi ~/.bash_profile

Añadimos la siguientes líneas:

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ [\1]/'
}
export PS1="\W\[\033[34m\]\$(parse_git_branch)\[\033[00m\] $ "

La parte donde se agrega la rama es en $(parse_git_branch), la sección [\033[34m\]\ es para agregar color a esa sección, el color que tengo seleccionado actualmente es el azul, para modificar el color solo es modificando el 34m por alguno de los valores válidos:

30m # Regular
31m # Rojo
32m # Verde
33m # Amarillo
34m # Azul
35m # Purpura
36m # Cian
37m # Blanco

Espero te sea de utilidad !



Referencias:
https://github.com/mfitzp/golifescience/blob/master/content/computing/add-git-branch-name-to-terminal-prompt-mac.md
https://news.ycombinator.com/item?id=2089285

miércoles, 12 de junio de 2013

Enviar correo con stunnel y gmail para impresoras Dell

En este caso me toco realizar una tarea de configuración algo interesante con el programa stunnel, como de costumbre dejo aqui como me funciono. Creo que este proceso puede servir aunque no se trate de configurar un cliente de correo de una impresora.

El detalle es que el cliente de correo de una impresora que tenemos la Dell 2335 dn no tiene soporte para conexiones encriptadas (o al menos la versión de firmware que tenemos instalada), por lo anterior fue necesario instalar un servidor de stunnel.

Puedes descargar el stunnel desde aquí:
http://www.stunnel.org/

Una vez instalado si tienes el programa corriendo es recomendable que lo cierres o dando click sobre el icono que queda a lado del reloj hagas click en salir.


Posteriormente abriremos el archivo stunnel.conf en mi caso como quedo instalado lo puedes abrir desde la misma carpeta del programa.


Dentro de ese archivo deberá tener lo siguiente (Ojo las líneas con - ; - son comentarios):
cert = stunnel.pem
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
debug = 7
client=yes
[gmail]
accept=5000
connect=smtp.gmail.com:465

Guardamos posteriormente y luego volvemos abrir el stunnel utilizando la opción -Run stunnel- que se encuentra dentro de las opciones de Todos los programas/stunnel/Run stunnel

NOTA: Es mejor cerrar el programa y abrirlo ya que estaba utilizando antes la opción reload y no funcionaba.

A partir de ese momento ya debemos poder utilizar ese equipo como tunel esto es, para configurar el correo electrónico deberemos utilizar las siguientes opciones:
-------
servidor de correo: [IP del servidor que tiene instalado el stunnel]

puerto de conexión: [ En este caso siguiendo el ejemplo es 5000 ]

usuario: [ Nuestro correo de gmail ]

contraseña: [ La contraseña del correo ]
-------
Con lo anterior debería funcionar, en mi caso colocando esos parametros en la configuración de la impresora Dell 2335 dn ya logre que enviará correos desde una cuenta de gmail.


Saludos, Espero te sea de utilidad !


Referencias:
http://www.charmedquark.com/vb_forum/showthread.php?t=7943
http://www.projectpier.org/manual/installation/gmail-for-smtp

viernes, 31 de mayo de 2013

Firebird isql terminal

Como ven me he hecho muy aficionado a la terminal, esta vez le toca el turno a una base de datos que utilizó mucho en mi trabajo Firebird.

Para hacer una conexión se debe utilizar:

$ isql
SQL> connect "192.168.1.2:c:\bases\mibase.gdb" user "miUsuario" password "laClave";
Database:  "192.168.1.2:c:\bases\mibase.gdb", User: miUsuario

Con la instrucción anterior se hace la conexión al servidor remoto 192.168.1.2 utilizando miUsuario y laClave. Hasta aqui todo facil.

Para ver un listado de las tablas podemos utilizar el siguiente comando:

SQL> show tables;

Por otro lado si deseamos ver los campos de una tabla utilizamos:

SQL> show table miTabla;

Para salir de isql sin realizar un commit de las transacciones se debe utilizar:

SQL> quit;

En caso contrario para salir y aplicar todos los cambios utilizar:

SQL> exit;

De aquí podemos utilizar las instrucciones de SQL que ya conocemos. En particular empece a revisar como conectarme por que estaba interesado en algo en particular exportar información.

Para exportar información utilizamos:

SQL> output "miarchivo.txt"
SQL> select * from miTabla;
SQL> output;

Con lo anterior en miarchivo.txt quedará almacenado el resultado de la consulta de miTabla.


Más información:
http://www.firebirdsql.org/pdfmanual/Firebird-isql.pdf


Espero te sea de utilidad !

lunes, 20 de mayo de 2013

Conectar la terminal con los recordatorios (OSX terminal or applescript and reminders)

Como de costumbre ahora otro pendiente conectar la terminal de OSX con la aplicación de Recordatorios de Mountain Lion, he iniciado un proyecto en github que se llama task (https://github.com/omaryahir/task), ya puedes marcar como concluida alguna tarea, crearla o eliminarla, incluso puede conectarse a la aplicación de Calendario también.


Referencias