Proyecto Laravel & MySQL con Heroku

Me encuentro trabajando desde hace unos días en un proyecto para una empresa de logística, que requiere una aplicación para Shopify.
Ésta aplicación requiere estar en un sitio público ya que autentica con OAuth y escucha una serie de webhooks emitidos desde Shopify.
Para esto se me vino a la mente el bendito Heroku, el cuál todavía no conozco profundamente, pero lo poco que lo usé me alcanzó para encariñarme.

La aplicación en cuestión es un proyecto basado en Laravel que tengo en un repositorio privado de GitLab.

Parado en el repositorio local, le quiero agregar el vínculo hacia Heroku, para eso ejecuto lo siguiente:

heroku login

Esto abrirá una ventana de heroku para realizar el login o registro, la cual obviamente debemos completar.
Luego desde la consola podemos crear la aplicación de Heroku:

heroku create nombre-aplicacion

Esto crea una aplicación en Heroku (de la cuál nos muestra la URL) y genera una rama remota llamada heroku, la cual estará sincronizada con la aplicación.

Para que Heroku sepa de que forma hacer un build del proyecto, debo setear el buildpack de heroku para php

heroku buildpacks:set heroku/php

También debo crear un archivo Procfile en el raiz del proyecto con el siguiente contenido:

web: vendor/bin/heroku-php-apache2 public/

Hago un commit y el push a la rama de heroku

git push heroku

Para configurar variables de entorno (.env) se puede usar el siguiente comando (o también desde el Dashboard de Heroku se puede hacer manualmente).
Para laravel es necesario agregar la siguiente variable:

heroku config:set APP_KEY=base64:xxxxxxxxx=

AGREGAR BASE DE DATOS

Para eso agrego el add-on de ClearDB que nos permite agregar bases de datos MySQL gratuitas

heroku addons:add cleardb

Para agregar éste add-on es necesario tener activada la cuenta de facturación por más que sea gratuito. Es necesario en este punto agregar una tarjeta de crédito a la cuenta de Heroku. Si ya la tenemos, al ejecutar el comando nos mostrará la URL de la base de datos.
De todos modos podemos ver esas credenciales ejecutando:

heroku config | grep CLEARDB_DATABASE_URL

Esta URL se forma de la siguiente manera:
mysql://user:pass@host/database?reconnect=true
Extrayendo la información de esa url podríamos configurar nuestras variables de entorno:

heroku config:set DB_HOST=us-cdbr-east-02.cleardb.com
heroku config:set DB_DATABASE=heroku_4727xxxx
heroku config:set DB_USERNAME=be0xxxxx93
heroku config:set DB_PASSWORD=e7xxxx39

Para ver los logs de la aplicación desde los logs del dashboard de heroku es necesario setear el canal de logs a errorlog:

heroku config:set LOG_CHANNEL=errorlog

Una de las utilidades que nos brinda el CLI de Heroku es que nos permite correr comandos en nuestra aplicación, por ejemplo para correr las migrations debemos correr:

heroku run php /app/artisan migrate

Servidor Counter Strike 1.6 gratis en AWS

Para pasar esta cuarentena, volvimos -junto con TODOS mis amigos- a agarrar nuestro antiguo vicio: el Counter Strike.

Para poder jugar es necesario un servidor -que viene con el juego- para permitir (con algunas configuraciones al router) levantar en tu propia PC y compartir con amigos.

Queriendo evitar depender de la PC de algún amigo (o peor aún: la mía), y nuestras conexiones a Internet, busqué la forma de levantar en un servidor, y acá la comparto.

Lo primero que necesitamos es, obviamente, una cuenta en AWS. Siguiendo los pasos es muy fácil crearla.

Desde la consola de administración de AWS, buscamos el servicio EC2 e ingresamos.

En la parte superior derecha nos da la opción de elegir la ubicación de nuestro servidor. Yo elegí Sao Paulo, porque al estar en Argentina es el que me ofrece menor latencia.

En la barra de la izquierda tenemos los distintos componentes de EC2, para este caso usaremos una instancia (Instance), asi que hacemos click sobre Instances, y una vez adentro ejecutamos Launch Instance.

En este paso tenemos que elegir la imagen a utilizar.

Seleccionamos la primera opción: Amazon Linux 2 AMI (HVM), SSD Volume Type – ami-0b032e878a66c3b68

Luego elegimos el tipo de instancia. Para que sea gratis debemos elegir t2.micro (Free tier elegible)

Hacemos click en Review and Launch, luego controlamos los datos que nos muestra y hacemos click en Launch.

Nos va a salir un cartel como el siguiente:

Como no tenemos claves creadas vamos a seleccionar en el primer select la opción Create a new key pair, y debajo seleccionamos un nombre para crearlo (elegir el que deseen).

Hacemos click en Download Key Pair, e inmediatamente se nos va a descargar un archivo de extensión .pem .

Ahora sí, hacemos click en Launch Instances.

Si todo salió bien veremos una pantalla con el estado que dirá algo así como: Your instances are now launching. Hacemos click en View Instances.

Desde la columna IPv4 Public IP podemos ver qué IP tiene nuestro servidor al cual nos conectaremos luego.

Para conectarnos desde Windows podemos seguir estas instrucciones.

Para el caso de Linux seguimos estas.

Una vez ya conectados a nuestra instancia comenzaremos con la instalación del servidor:

sudo su
yum install glibc.i686
useradd -d /home/hlds -s /bin/false hlds
cd /home/hlds
wget http://cdn01.counterstrike.com.pk/web/files/hlds4linux_cspak.zip
unzip hlds4linux_cspak.zip
cd hlds4linux_cspak
chown -R hlds:hlds /home/hlds
chmod +x ./hlds_run
chmod +x ./hlds_i486
chmod +x ./hlds_i686
screen -A -m -d -S hlds su -c "./hlds_run -game cstrike +ip 0.0.0.0 +port 27015 +maxplayers 32 +map de_dust2_long_short +sys_ticrate 1000" hlds -s /bin/sh

En este momento ya tenemos nuestro servidor funcionando. Lo único que nos falta es abrir los puertos a los cuales nos conectaremos para poder jugar.

Hacemos click en el nombre de nuestro security group (en este caso launch-wizard-1).

Ahora vamos a editar las reglas de ingreso.

Agregamos nuestra regla: Custom UDP – 27015 – 0.0.0.0/0

Click en Save rules.

Borrar maps.ini de cstrike/addons/amxmodx/configs/

cambiar rcon_password y hostname de server.cfg

Poner sv_password de ser necesario

EXTRA!
Para instalar PsychoStats debemos hacer lo siguiente:

En addons/amxmodx/configs/users.ini agregar tu usuario

modules ini

Descomentar en plugins stats_logging.amxx

;fun
;engine
;fakemeta
geoip
;sockets
;regex
;nvault
;hamsandwich
orpheu
csx

Ver plugins.ini

cstrike/motd.txt

yum install git

git clone https://github.com/d4fseeker/PsychoStats-extended.git

cd PsychoStats-extended/

mkdir /var/www/html/stats

cp -rf upload/* /var/www/html/stats/

chown -R apache:apache stats/

vi /etc/php.ini y configurar timezone

date.timezone = America/Argentina/Buenos_Aires

;error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_reporting = 0

en common/includes.php agregar ini_set(‘display_errors’, ‘0’);
y comentar //error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);

IR A LA WEB IP/stats/install

INSTALAR
Remover /var/www/html/stats/install

ir a http://18.230.11.70/stats/admin/conf.php y cambiar TRACK players por track by player name

Instalar PHP5.5

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install yum-utils
yum-config-manager --enable remi-php55
yum install php
yum install php-mysql php-gd

Instalar MySQL5.7

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
yum localinstall mysql57-community-release-el7-11.noarch.rpm
yum localinstall mysql57-community-release-el7-11.noarch.rpm --skip-broken

yum-config-manager --disable mysql80-community

yum localinstall mysql57-community-release-el7-11.noarch.rpm --skip-broken

rpm -ivh mysql57-community-release-el7-11.noarch.rpm

yum localinstall mysql57-community-release-el7-11.noarch.rpm

yum repolist enabled | grep "mysql.*-community.*"

yum install mysql-community-server

service mysqld start

service mysqld status

grep 'temporary password' /var/log/mysqld.log
sudo mysql

CREATE USER 'counter'@'localhost' IDENTIFIED BY 'XXXXXX';

CREATE DATABASE cs_db;

ALTER DATABASE cs_db CHARACTER SET utf8 COLLATE utf8_general_ci;

GRANT ALL PRIVILEGES ON cs_db.* TO 'counter'@'localhost';<br>FLUSH PRIVILEGES;

show variables like 'sql_mode' ;

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

Instalar Apache2

yum install httpd
sudo systemctl start httpd
sudo systemctl enable httpd.service
yum install perl-DBI
yum install "perl(DBD::mysql)"

Hacer lo mismo que hicimos para habilitar el puerto UDP, pero con el puerto TCP 80/443 para apache

vi stats.cfg (configurar base)

cd /home/hlds/Psyco

./stats.pl -v -log /home/hlds/hlds4linux_cspak/cstrike/logs

crontab -e

0,30 * * * * /home/hlds/PsychoStats-extended/stats.pl -log /home/hlds/hlds4linux_cspak/cstrike/logs

HTTPS en 5 minutos

Gracias al proyecto Let’s Encrypt, hoy es posible tener certificados en nuestros sitios en muy pocos pasos.

Básicamente debemos entrar en la web de CertBot y seguir los pasos que explican allí.

En mi caso yo lo realicé en un servidor Ubuntu 16.04 con un servidor nginx y lo primero que hice fue agregar el Certbot PPA a la lista de repositorios:

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

Una vez hecho esto instalé Certbot

sudo apt-get install certbot python-certbot-nginx

Luego corrí el comando que obtiene un certificado de Let’s Encrypt y edita la configuración de nginx automáticamente

sudo certbot certonly --nginx

Para asegurarme que los certificados se van a poder renovar automáticamente corrí el siguiente comando:

sudo certbot renew --dry-run

Unos segundos después ingresé a mi sitio pero esta vez con el https por delante.