Creando un servidor de MySQL local con Docker

Docker es un software de manejo de contenedores que permite exportar tu código junto con la configuración del entorno en donde se encuentra de manera sencilla y liviana sin preocuparse por los cambios que puedan haber en el sistema operativo, mientras que MySQL es la base de datos relacional Open Source más popular.

El objetivo de este POST es explicar el paso a paso de la creación de un contenedor de MySQL de manera local que se pueda acceder desde otras aplicaciones instaladas en la misma máquina. Se usa un computador con Ubuntu 18.04 LTS para el tutorial.

Requerimientos

  • Docker Instalado

Leer más

Crear un túnel SSH para acceder a un servidor MYSQL Remoto

Mysql Remoto a Través de Túnel SSH

Un túnel SSH consiste en una conexión segura creada a partir de una conexión SSH. En general puede asegurar cualquier transferencia o protocolo inseguro. Por ejemplo podríamos hacer una transferencia a través de FTP segura usando este tipo de túneles.

En este caso nuestro foco no será solo encriptar la comunicación con la base de datos, si no que será darle acceso a un computador, por ejemplo de escritorio, al servidor de base de datos a través de un servidor que tenga acceso a ella.

¿ Por que haremos esto ?

Si bien podríamos dar el acceso directamente a nuestro computador a través de nuestra dirección IP esto podría transformarse en una brecha de seguridad. En especial si compartimos la red con más personas en nuestras oficinas o en nuestro trabajo. En mi caso en este momento estoy trabajando en un apart hotel, por lo que agregar la dirección IP del apart hotel no es una opción para mi. ( Ojo, si se puede a costa de seguridad ).

¿ Cómo lo haremos ?

En este caso nos conectaremos desde nuestro computador linux a un servidor de características similares que es el cual tiene acceso a la Base de Datos MYSQL. En resumen lo que se hará es crear un puerto local por el cual nos conectaremos a la base de datos remota.  Ojo pestaña y ceja, esta base de datos no necesariamente está en el servidor al que nos conectaremos, si bien puedes estarlo este servidor solo debe tener acceso a ella.

Creamos el túnel desde consola.

En mi caso tengo un servidor mysql local, por lo que asignaremos el puerto 3307 a la base de datos que nos conectaremos. Necesitamos lo siguiente  :

  1. Dirección IP o Nombre de dominio de la BdD
  2. Dirección IP o Nombre de dominio del servidor con acceso a la BdD
  3. Obviamente los accesos correspondientes al servidor y a la base de datos !

El comando SSH con el que se genera el túnel quedaría de la siguiente manera.

ssh -L 3307:DIRECCIONBDD:3306 \
USUARIOSERVER@IPSERVER
  1. DIRECCIONBDD es la dirección de la BdD.
  2. USUARIOSERVER es el usuario del servidor que tiene el acceso a la BdD.
  3. IPSERVER es la dirección IP del servidor que tiene el acceso a la BdD.

Si todo sale bien ahora podremos conectarnos directamente a la BdD de manera local usando el puerto 3307. Existe la posibilidad que tu BdD no ocupe el puerto 3306, en ese caso simplemente la cambiar para el que corresponda.

Accediendo a la BdD

Para probar usaremos el cliente MySQL por consola, pero puedes usar MySQL Workbench, PHPMyAdmin o el que estimes conveniente.

mysql -u USUARIO -pPASSWD -h 127.0.0.1 -P 3307

Si tu usuario y passwords son correctos ya podrías acceder a la BdD aunque sea remota como se fuera local y aunque no tuvieras permisos de acceso a través de tu IP. Esto es para mantener la seguridad de tu BdD !

 

 

 

 

Cómo Tener la misma zona horaria en Mysql y PHP

Tener las hora del servidor MySQL y de PHP sincronizadas permite que no tengamos problemas en el análisis de los datos de nuestras aplicaciones y/o sistemas, en especial si uno de los factores de medición dependen de la diferencia de estos tiempos. Acá veremos como tener la misma zona horaria para ambos servicios.

Suele suceder que cuando usamos funciones de Mysql que retornan la hora y además otras por parte de PHP, la hora en ambas no es la misma. Esto es debido a que las configuraciones de ambas no son la misma.

Ambas horas vienen desde la configuración del servidor, pero por defecto ambas están en la zona horaria UTC, así que no importa la hora que tengamos en el servidor, la hora de estos servicios será distinta si no las configuramos de manera adecuada.

A continuación como configurar ambas.

Configurando la zona horaria en el servidor MySQL

Si bien podemos editar directamente el archivo de configuración de MySQL, lo que haremos es crear un archivo distinto que solo posea la definición de la zona horaria. De esta manera evitamos perder esta información por alguna actualización.

  1. Creamos el archivo de configuración en la carpeta conf.d de mysql. Todos los archivos con extensión .conf serán cargados desde aquí.
  2. Definimos el timezone del archivo. Acá puedes usar diferencias horarias, o zonas horarias. Las diferencias horarias son contra UTC que es el : +00:00 .
  3. Reiniciamos el servidor de mysql para actualizar la información.

Si bien puedes usar el editor que quieras, yo usaré  VIM por costumbre.

#vim /etc/mysql/conf.d/date.conf

y en el contenido definimos nuestra zona horaria. En mi caso además de «America/Santiago» podría haber puesto «-03:00».

default_time_zone='America/Santiago'

Ahora reiniciamos el servicio y debería estar funcionando.

# service mysql restart

Para corroborarlo, podemos loguearnos a mysql y ejecutar :

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2016-02-10 12:03:35 |
+---------------------+
1 row in set (0.00 sec)

Configurando la zona horaria en PHP

En este caso si editaremos directamente el archivo php.ini que se encarga de la configuración de php para apache. Si tienes otro servidor simplemente lo haces donde corresponda.

# vim /etc/php5/apache2/php.ini

Buscamos y editamos el siguiente contenido según corresponda :

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "America/Santiago"

Y en este caso reiniciamos el servidor de apache.

# sudo service apache2 restart

Eso sería todo, ahora tu BdD y aplicación web tienen la misma hora :).

MySQL con regiones, provincias y comunas de Chile

SQL Con la información de las regiones, provincias y comunas de Chile según Decreto Exento Nº 817

Origen: ctala/Regiones-Provincias-y-Comunas-de-Chile. · GitHub

Regiones, provincias y comunas de Chile

Al fin comencé con el desarrollo del nuevo sistema de Shipping / Envíos unificado, por lo que antes tenía que estandarizar las tablas con la información de las regiones, provincias y comunas en Chile.

Si bien encontré muchos códigos con esta información, ninguno era «Estándar». Buscando en Internet encontré un link de la «Subsecretaría de Desarrollo Regional y Administrativo» el cual incluía la información necesaria para mantener un orden en la información a utilizar. El código en GITHUB compartido incluye las regiones y provincias con sus respectivos números según el documento mensionado.

Leer más

Crear una Base de Datos MySQL remota para optimizar el rendimiento del sitio WordPress.

Cuando el sitio comienza a tener más tráfico tenemos que comenzar a pensar en como poder manejarlo. Lo más sencillo y lo que recomiendo es sacar la base de datos del servidor, en especial debido a que Mysql al no tener recursos suficientes simplemente deja de funcionar. Esto logra que cada servidor maneje su propia carga, además de ser el primer paso para tener un sitio con balanceador de carga.

En mi caso particular lancé un nuevo eCommerce con Woocommerce / WordPress en el cual no separé desde un inicio la BdD de datos debido a que pensé que el sitio tendría menos tráfico y carga asociada, me equivoqué, lo que es realmente bueno.

Sin embargo no puedo dejar que el eCommerce se caiga cada vez que tenga mucho tráfico, no sería muy agradable perder ventas por esto.

Este minitutorial está alojado en digital ocean, la verdad lo he probado hace un tiempo y funciona bastante bien. Sin embargo  se puede extrapolar para cualquier servidor linux, en mi caso Ububtu 14.04.

Entonces, lo que haremos :

  1. Crear un nuevo servidor ( Droplet ) al cual le instalaremos una base de datos Mysql.
  2. Instalar la base de datos Mysql.
  3. Configurar la BdD en modo seguro/ Producción.
  4. Crear un usuario / password para el acceso del sitio wordpress.
  5. ( Opcional ) – Configurar el firewall del servidor.

Creando el nuevo droplet

Esto ya es bastante sencillo, simplemente vamos a el panel de administración de Digital Ocean y hacemos click en crear un nuevo droplet. Asegurate que el servidor quede en el mismo datacenter donde se encuentra tu máquiba virtual que aloja tu servidor wordpress, de no ser así funcionará pero no a la velocidad esperada para nuestro sitio.

Digital Ocean Create Droplet
Digital Ocean Create Droplet

Por ahora el servidor MySQL no necesita ser más potente que la versión más sencilla, de ser necesario en un futuro simplemente hacemos el upgrade, pero recomiendo usar un caché en el servidor de wordpress.

Instalando Mysql

Ya teniendo nuestra máquina recién horneada, accedemos a ella para instalar el servidor mysql.

sudo apt-get install mysql-server

Debido a que estaremos en un servidor de producción, recomiendo poner una contraseña segura para el usuario root y solo acceder a él desde la máquina local y ninguna remota. Si es paranoia, aún no me ha pasado nada pero no esperaré a que me pase.

Ya teniendo el servicio de mysql andando, ahora simplemente ejecutemos un script que simplemente elimina las posibles vulnerabilidades de seguridad que tiene mysql en servidores de desarrollo.

sudo mysql_secure_installation

Ya que estamos acá, para probar que todo funciona accederemos a La bdD por consola y crearemos la base de datos para wordpress.

# mysql -u root -pMICLAVESINESPACIODESPUESDELAP

Ya habiendo ingresado la creamos.

mysql> create database wordpress;
 Query OK, 1 row affected (0.00 sec)

Configurando el acceso remoto.

Antes que todo, le debemos decir a Mysql cual es su IP, así que procedemos a editar el archivo:

sudo vim /etc/mysql/my.cnf

Y buscamos donde dice bind-address y lo cambiamos por nuestro IP :

bind-address        = TUIP

Si tu IP es pública, va esa. Si tienes una red interna, usas el IP de la red interna.

Ahora reiniciamos el servicio para ver que todo funcione bien.

sudo service mysql restart

Generando las credendiales para WordPress

Ya tenemos el servidor virtual, mysql instalado, y la capacidad de ser accedido de manera remota, lo que nos falta es un usuario que pueda acceder de manera  por este medio.  Recordar que ya creamos la BdD llamada wordpress en un punto anterior.

Creemos el usuario y le damos los accesos necesarios a nuestra base de datos para que wordpress pueda funcionar de manera correcta :

CREATE USER 'MIUSUARIO'@'localhost' IDENTIFIED BY 'MICLAVE';
CREATE USER 'MIUSUARIO'@'%' IDENTIFIED BY 'MICLAVE';
GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'MIUSUARIO'@'localhost';
GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'MIUSUARIO'@'%';

Con lo anterior creamos tanto el usuario remoto como el local. No olvides modificar la nueva información en el archivo de configuración de wordpress para que los cambios funcionen.

Asegurando el servidor

Si notaron, en este momento cualquier IP puede acceder a nuestro servidor. Dependiendo de la configuración esto puedo ser bueno o malo, si bien esto se puede bloquear directamente desde la configruación de acceso a mysql, lo que haremos es configurar el firewall para solo aceptar el tráfico de los IPs que nosotros permitamos.

Asumiendo que tenemos UFW ( Uncomplicated Firewall ) ya instalado, simplemente agregamos la siguiente regla :

# sudo ufw allow from MYIP to any port 3306

Lo que hace es que le permite acceder al puerto 3306 a la IP dada. Si no lo tienes instalado revisa este blog bost : Firewall usando UFW en un servidor Ubuntu / Debian.

Además recomiendo bloquear todas las conexiones que no estén permitidas. ( No hagas esto si no haz agregado ssh a la lista de permitidos ).

# sudo ufw default deny incoming

Y eso sería todo :D.

 

Origen: How To Set Up a Remote Database to Optimize Site Performance with MySQL | DigitalOcean