server

Como excluir servicios con Docker Compose ?

El comando docker-compose up inicia todos los servicios de nuestro proyecto. Incluso servicios que no deseamos como herramientas ( drush, por ejemplo ) o servicios de mantenimiento esporadicos ( docker-compose run –rm ). Entonces como podemos evitar que ciertos servicios se inicien con docker-compose up ?

Existe una opcion en nuestro archivo de configuracion docker-compose.yml con la cual podemos indicar que algun(nos) servicios no esten disponibles al levantar nuestro proyecto.

Profiles en Docker Compose

Cuando declaramos un servicio dentro de nuestro archivo docker-compose.yml podemos establecer la opcion profiles y establecer a que perfiles de ejecucion pertenecera ese servicio.

version: ‘2’

services:
node:
image : node:14
volumes:
– .:/var/www/html
command: “npm start”

db:
image: mysql:5.7
volumes:
– ./mysql:/etc/mysql/conf.d/
– ./db_init.sql:/docker-entrypoint-initdb.d/init.sql

puppeteer:
profiles: [“puppeteer”]
build: ./puppeteer/
volumes:
– ./puppeteer/:/var/www/html/
– ./config:/var/www/html/config
command: “npm start”

En este archivo de configuracion, estamos asignando al perfil puppeteer al servicio puppeteer. Por lo tanto cuando ejecutemos el comando:

docker-compose up -d

Solo se iniciaran los servicios node y db, excluyendo el servicio puppeteer.

Si quisieramos ejecutar el servicio puppeteer debemos indicar el nombre del servicio

docker-compose run –rm puppeteer npm start

Como generar o restaurar un backup de PostgreSQL ?

Realizar un backup de una base de datos ( en este caso PostgreSQL ) es un proceso obligatorio en cualquier sistema en produccion.

Diferentes eventos pueden generar la perdida de datos, como por ejemplo: falla de los discos duros, acceso no permitido a la base de datos, un bug en tus sistemas que corrompa los datos, error humano de gestion, etc. Sin una politica de backup adecuada, ese suceso podria ocasionar la perdida completa de tu proyecto.

En el caso de postgresql, son dos los comandos que nos van a permitir trabajar con backups:

  • pg_dump, se encarga de generar un archivo SQL con el estado actual de la base de datos
  • psql, se encarga de leer y procesar el archivo sql generado por pg_dump
pg_dump -U username -W db_database > db_database.sql

En el comando pg_dump le he indicado que se conecte a la base de datos db_database con el usuario username y genere el backup completo y lo guarde en el archivo db_database.sql

Este archivo db_database.sql puede ser almacenado en algun tipo de dispositivo para su posterior uso en caso de un emergencia, yo recomendaria un servicio como AWS S3

Para restaurar el backup en una base de datos podemos usar el comando psql:

psql -U username -W db_database < db_database.sql 

En el comando psql le indicamos que se conecte a la base de datos db_database con el usuario username y ejecute los comandos sql indicados en el archvio db_database.sql

IMAPCOPY, una herramienta para migrar cuentas de correo entre servidores

SPOILER, migrar cuentas de correo toma su tiempo. Depende de la cantidad de mails existentes en cada cuenta pero diria que entre 8 y 20 horas por cuenta de correo. Asi que preparense un cafe y relajense.

Cuando un cliente quiere salir de Godaddy y migrar a Bluehost, no solo hay que mover el sitio web … tambien debes mover todas sus cuentas de correo. Aca explicaremos como realizar esa migracion usando la herramienta IMAPCOPY.

Primero debemos instalar las herramientas:

sudo apt install imapcopy stunnel4

ImapCopy, no trabaja con protocolos cifrados. Es por eso que necesitaremos la herramienta stunnel4 para abrir un puerto de nuestra maquina y conectarlo con el puerto del servidor remoto. Durante este proceso stunnel4 es la que se encarga del cifrado de la comunicacion.

Editamos el archivo de configuracion /etc/stunnel/stunnel.conf

foreground = yes
debug = info 

[outlook-imap]
client = yes
accept = 127.0.0.1:9993
connect = outlook.office365.com:993
verifyChain = yes 
CApath = /etc/ssl/certs
checkHost = outlook.office365.com
OCSPaia = yes

Con esta configuracion estamos definiendo un servicio que abrira el puerto 9993 en nuestra PC local y lo conectara directamente con el puerto 993 de outlook.office365.com usando los certificados SSL definidos en nuestra PC.

Ejecutamos el servicio

sudo stunel /etc/stunnel/stunnel.conf

Dejamos el servicio corriendo en foreground y en otra terminal procedemos a realizar la configuracion de imapcopy. Creamos un archivo imapcopy.cfg

SourceServer 127.0.0.1
SourcePort 9993

DestServer box2024.bluehost.com
DestPort 143
DenyFlags "\Recent"


Copy "contabilidad@empresa.com" "passwordorigen" "contabilidad@empresa.com" "passworddestino"
Copy "info@empresa.com" "passwordorigen" "info@empresa.com" "passworddestino"

En esta configuracion indico que voy a copiar correos desde el servidor SourceServer ( que si recordamos esta apuntando a outlook.office365.com gracias a stunnel ) al servidor de bluehost.com

Y en las lineas Copy indicamos que cuentas de correo se van a copiar desde el servidor SourceServer hasta el servidor DestServer.

Y lo ejecutamos con el comando:

imapcopy -l 

ImapCopy leera cada carpeta del servidor de origen he ira copiando uno a uno los correos existentes. A una velocidad aproximada de 2 a 5 segundos por correo.

Yo tengo en mi cuenta personal, luego de varias limpiezas unos 15 mil correos. Eso es aproximadamente 21 horas.

ADVERTENCIA, el proceso no se puede cortar. No hay forma de continuar. Si se te va la luz, pierdes el internet, se te cuelga la PC debes borrar la cuenta destino y volver a empezar.

Como instalar una app ASPNETCore en Linux

ASPNET Core es un framework de desarrollo web OpenSource de Microsoft. En este articulo, vamos a detallar los pasos para configurar tu servidor Linux una aplicacion ASPNET Core.

Creacion del VPS

Creamos nuestros VPS en cualquiera de las plataformas disponibles actualmente ( DigitalOcean, Linode, AWS Ligthsail, etc ). En nuestro ejemplo en particular utilizamos Ubuntu 20.04

Instalacion del Framework ASPNET Core

Para instalar las librerias basicas del framework debemos ejecutar los siguientes pasos con permiso de root

snap install dotnet-sdk --classic --chanel=5.0
snap install dotnet-runtime-50 --classic

Creamos un alias del comando de ejecucion dotnet

snap alias dotnet-runtime-50.dotnet dotnet

Configuramos la variable de entorno DOTNET_ROOT. Esta variable indica donde estan instaladas las librerias de dotnet

export DOTNET_ROOT=/snap/dotnet-sdk/current

Publicacion de nuestra app

Una vez instalada el framework debemos levantar nuestra aplicacion usando el comando dotnet.

Para esto, debemos copiar nuestra aplicacion/bin/Release a una carpeta local, luego entramos a la carpeta donde copiamos el proyecto y ejecutamos nuestra aplicacion indicando en este caso el puerto donde se accedera.

cd webapp
dotnet webapp.dll --urls "http://*:3000"

🐳 Dockerfile – Instalar paquetes noninteractive

Al momento de crear una imagen personalizada usando dockerfile es necesario instalar paquetes de software y algunos de estos vienen con un set de preguntas para ti.

Hoy dia por ejemplo, tuve que instalar un apache sobre una imagen de ubuntu y queria saber en que Region / Ciudad vivia. Al ejecutar el comando docker-compose build … ahi quedaba mi intento por configurar mi sistema. No habia forma de saltar ese paso.

Para poder evitarlo, le indique al script de docker ( dockerfile ) que estableciera la variable de sistema DEBIAN_FRONTEND como noninteractive.

FROM ubuntu

ARG DEBIAN_FRONTEND=noninteractive
RUN \
apt-get update && \
apt-get install -qq -y php-pgsql postgresql-all libapache2-mod-php

Una vez realizado esto, ya disponia de mi entorno listo para trabajar.

#HappyCoding

⚙ Docker Compose: no module named ordered_dict

Hoy dia, fallo la ejecucion de docker-compose en uno de mis servidores.

El problema:

E ImportError: No module named ordered_dict

La solución ?

Asegurarnos de tener la version urllib3-1.22, actualmente la version en produccion es la 1.26

Para tal efecto ejecutamos los siguientes comandos

pip uninstall urllib3
pip install urllib3=1.22

#HappyCoding

Bash: Ejecutar un proceso en domingo

Tenemos un proceso configurado en CRON para ejecutar un script de bash. Sin embargo, ciertas partes de dicho proceso solo deben ejecutarse un dia a la semana.

Para eso vamos a programar nuestro script en bash para solo se ejecute en domingo.

day=`date +%u`
if [ $day eq 0 ]; then
# Proceso que se ejecuta solo en domingo
fi

El comando date +%u nos devuelve el numero de dia de la semana.
Siendo 0 domingo, 1 Lunes, 2 Martes, 3 Miercoles, 4 Jueves, 5 Viernes, 6 Sabado.

#HappyCoding

NGINX – Logging Country Access

Trabajando con NGINX para controlar el acceso de ciertos paises, encontre un modulo GeoIP Country, que nos permite determinar en funcion de la IP el pais de origen de un request.

Al agregarlo en nuestro nginx.conf podemos bloquear facilmente visitas de ciertos paises. Por ejemplo:

geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default yes;
RU no; #Rusia
UK no; #Ukrania
CN no; #China
}

Sin embargo, al tenerlo instalado en nginx, tambien podemos hacer uso de la variable $geoip_country para mapear en nuestro access log, de que pais vino el request. Asi el pais no este bloqueado.

Para esto definimos nuestro propio formato en log_format:

log_format main ‘$status $body_bytes_sent $geoip_country_code $sent_http_content_type “$request_method $scheme://$host$request_uri” $http_referer @$remote_addr $http_user_agent ‘;

Y lo aplicamos en la declaracion de access_log:

access_log /var/log/nginx/access.log main;

Y listo, ahora tendremos la informacion del pàis de nuestras peticiones:

200 8938 PE text/html; charset=UTF-8 “GET https://www.mariouriarte.com/?s=react” https://www.mariouriarte.com/?s=nginx @190.202.62.205 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/75.0.3770.90 Chrome/75.0.3770.90 Safari/537.36

Como cambiar la zona horaria desde el terminal

Si necesitas cambiar la zona horaria de tu computadora o servidor puedes hacerlo de la linea de comandos o terminal.

Para tal efecto existe el comando timedatectl.

Podemos consultar la zona horaria actual

$ timedatectl status

Este mismo comando nos sirve para cambiar nuestra zona horaria:

$ sudo timedatectl set-timezone America/Lima

Si deseas consultar la lista de zonas horarias que existentes:

$ timedatectl list-timezones

 

Script Backup MYSQL Databases

En todo servidor propio es necesario preocuparse por disponer de los backups necesarios para restaurar los sistemas.

Esto incluye:

  • Codigo fuente ( GIT, github, gitlab )
  • Archivos producidos por los usuarios ( AWS S3 )
  • Base de datos

Mantener seguras, optimizadas y perfectamente backupeadas ( existe esa palabra ? ) las base de datos no es una tarea facil ni despreciable, sino preguntenle a @gitlab.

Existe varias formas de pago para realizarlo todas super optimas, pero de pago “extra”

  • Microsoft Azure, empezando desde 80USD mensuales
  • AWS RDS, empezando desde 10.5USD mensuales
  • Google Cloud SQL, empezando desde 8USD mensuales

Todas estas opciones nos permiten tener varias bases de datos y nos aseguran disponibilidad, seguridad y actualizaciones.

Si por el contrario nuestra configuración no va por disponer de un servidor de base de datos separado pues bien necesitaremos ocuparnos nosotros mismos de las operaciones de rutina del servidor, sobre todo de los backups.

El siguiente script es un procedimiento de backup automatizado que suelo utilizar

databases=`mysql -e 'show databases;' | tr -d "| " | grep -v Database | grep -v information_schema | grep -v performance_schema`

fecha=` date +%Y%m%d`
mkdir -p /backup/$fecha

fechaold=`date -d "7 day ago" +%Y%m%d`

rm /backup/$fechaold -R

for db in $databases; do
 
 if [ -f /backup/$db.clear ]; then
 mysql $db < /backup/$db.clear
 fi
 mysqldump $db > /backup/$fecha/$db.sql
 tar -czf /backup/$fecha/$db.tar.gz backup/$fecha/$db.sql
 rm /backup/$fecha/$db.sql
done

Ahora debemos configurar el script para que se ejecute todos los dias a una hora especifica

crontab -e

0 5 * * * bash backup.sh

Aunque el script ubique los backups en el directorio de mayor seguridad de nuestro servidor ( root ), es recomendable ubicar una copia en otro lugar para evitar cualquier contingencia. Este otro lugar, podria ser otro servidor encargado de gestionar los backups de varios servidores o incluso una maquina personal local.

Para configurarlo deberemos habilitar el acceso por ssh de la maquina que guardara los backups

0 6 * * * scp -r backup@servidor.com:/backup/`date +%Y%m%d` .