RoR: Required ruby-2.4.2 is not installed

La síntesis:

– Se actualizo la version de ruby de la app a la 2.7.5
– En el archivo Gemfile se tiene:

ruby '2.7.5'


– En el archivo deploy.rb (capistrano) se tiene:

set :rvm_ruby_version, '2.7.5'

Pero al hacer el despliegue aun se tiene el siguiente mensaje de error:

Required ruby-2.4.2 is not installed

Para solucionar simplemente editar el archivo .ruby-version y cambiar el contenido por

2.7.5

Capistrano: Operation not permitted (Errno::EPERM)

Al ejecutar el deploy se tiene

/application.rb:383:in `kill': Operation not permitted (Errno::EPERM)
bundler: failed to load command: bin/delayed_job (bin/delayed_job)

Esto es debido a que se reinicio el servidor y quedaron algunos archivos pids residuales, basta con borrar estos archivos:

rm shared/tmp/pids/delayed_job.pid 

Y ejecutar de nuevo…

Ruby On Rails: llamadas GET, POST …

Existe una variedad de librerías para hacer estas llamadas, entre las mas conocidas

Todas funcionan «casi» igual, en este tiempo descubrí una pequeña diferencia con Typhoeus, y es la mantención de los headers o encabezados, por ejemplo si tengo el header «x-amz-access», se envía de la siguiente manera:

HTTPartyX-Amz-Access
FaradayX-Amz-Access
Typhoeusx-amz-access

En algunos servicios se necesita un header en especifico, esto no quiere decir que en HTTParty y Faraday no se puedan crear funciones extras para mantener los headers.

También en la salida de Typhoeus se muestran todos los headers y el body enviado, un detalle más que se tiene que tener en cuenta con esta librería es que agrega un header extra:

user-agent: Typhoeus – https://github.com/typhoeus/typhoeus

Pero esto se puede cambiar facilmente seteando el header de la siguiente manera:

Typhoeus::Config.user_agent = ‘Custom header’

Ruby on Rails: hash binario sin formato

Usando la función hash_hmac de PHP, tenemos:

<?php
    $string = hash_hmac('sha256', 'message', 'secret', true);
    echo $string;

En este caso el ultimo valor true, establece que los datos de salida serán binarios y sin formato, teniendo la salida:

�t|P*�����!�Ɓ6����z�p�����U�

Ahora el equivalente en RoR seria:

require 'digest'

string = OpenSSL::HMAC.digest('sha256', 'secret', 'message')
puts string

Ruby on Rails: puma en producción con SSL

Los detalles:

Servidor de producción: Centos 7

Servidor web: Apache 2.4.6

Ruby: 2.4.2

Esta guía es un compendio de varias guías que se pueden encontrar en internet.

Assets

Este archivo es importante para poder cargar los assets.

#/etc/httpd/conf.d/puma.conf

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RequestHeader unset X-Forwarded-Proto
<locationmatch "^/assets/.*$">
	Header unset ETag
	FileETag None
	ExpiresActive On
	ExpiresDefault "access plus 1 year"
</locationmatch>

<locationmatch "^/assets/.*\.(css|js)$">
	RewriteEngine on
	RewriteCond %{HTTP:Accept-Encoding} \b(x-)?gzip\b
	RewriteCond %{REQUEST_FILENAME}.gz -s
	RewriteRule ^(.+)$ $1.gz
</locationmatch>

<locationmatch "^/assets/.*\.css\.gz$">
	ForceType text/css
	Header set Content-Encoding gzip
	Header add Vary Accept-Encoding
</locationmatch>

<locationmatch "^/assets/.*\.js\.gz$">
	ForceType application/javascript
	Header set Content-Encoding gzip
	Header add Vary Accept-Encoding
</locationmatch>

AddOutputFilterByType DEFLATE text/html

Apache

Configuramos el archivo /etc/httpd/conf/httpd.conf:

<VirtualHost 111.222.333.444:80>
ServerName puma.web.com
DocumentRoot /home/puma/public_html/puma/public

include /etc/httpd/conf.d/puma.conf
Redirect permanent / https://puma.web.com/

<Directory /home/puma/public_html/puma/public>
AllowOverride All Options=FollowSymLinks,MultiViews
Order deny,allow
Allow from all
</Directory>
</VirtualHost>


<VirtualHost 111.222.333.444:443>
ServerName puma.web.com
DocumentRoot /home/puma/public_html/puma/public

include /etc/httpd/conf.d/puma.conf
RewriteRule ^/(.*)$ https://0.0.0.0:9294%{REQUEST_URI} [P]

<Directory /home/puma/public_html/puma/public>
AllowOverride All Options=FollowSymLinks,MultiViews
Order deny,allow
Allow from all
</Directory>

SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off

SSLEngine on
SSLCertificateFile /home/puma/public_html/puma/FILE.cert
SSLCertificateKeyFile /home/puma/public_html/puma/FILE.key
SSLProtocol +TLSv1.2
SSLCACertificateFile /home/puma/public_html/puma/FILE.crt
</VirtualHost>

Puma

Se tiene que iniciar usando dos puertos uno para http y el otro para https, de la siguiente manera:

puma -d -b "ssl://127.0.0.1:9294?key=FILE.key&cert=FILE.cert&verify_mode=none&ca=FILE.crt" -b "tcp://127.0.0.1:9293" -e production

Cambiando los nombres de los archivo FILE.* por los de su certificado

Los puertos pueden ser cualquiera que no estén siendo usandos, podrían ser el 3000 y 3001 no hay problema.