Exrm: Liberando Proyectos Phoenix

Hace unos días comencé a realizar un par de páginas web en Phoenix Framework para tomar un poco más de soltura en el sistema. Son las páginas corporativas de altenwald.com y origamicall, no hay mucho código realmente, pero aprovecho el código para dejar el HTML algo más pequeño y poder realizar la i18n más fácilmente. ¿Cómo realizamos la liberación a producción?

Las liberaciones que he realizado hasta el momento usando docker han consistido en lanzar el comando:

MIX_ENV=prod PORT=4000 iex -S mix phoenix.server

Este comando es suficiente para tener Phoenix Server ejecutándose (obviamente hay que tener instaladas las dependencias, todo compilado y generados los assets en priv/static).

Instalando Exrm

En la página oficial de Phoenix Framework recomiendan el uso de exrm. Esta nueva dependencia agrega una serie de nuevos comandos a mix que facilitan mucho la generación de un nuevo paquete y su puesta en producción. Al más puro estilo Erlang.

Lo primero, según vemos en la página de exrm es instalar la dependencia. Voy a poner la última versión según el repositorio:

{:exrm, "~> 1.0.4"},

Después volvemos a tomar las dependencias, compilamos y ahora sí, generamos el paquete:

MIX_ENV=prod mix do deps.get, compile, release

Como se puede ver, lo hacemos todo en el entorno prod. Es posible que obtengamos algunos errores, como los siguientes:

==> relx (compile)
ERROR:
===============================================
 You need to install neotoma to compile PEG grammars
 Download the latest tarball release from github
    https://github.com/seancribbs/neotoma
 and install it into your erlang library dir
===============================================

Esto es debido a que relx requiere de neotoma (un compilador de gramática PEG), pero no lo tiene como dependencia. Desafortunadamente, la versión 1.7.3 (la última publicada a día de hoy) no es compatible con relx, hay que recurrir al último commit y agregarlo como dependencia:

# neotoma 1.7.4
{:neotoma, override: true,
           git: "https://github.com/seancribbs/neotoma.git",
           commit: "9e57d8e"},

Con este cambio (haciendo de nuevo mix deps.get) ya podremos compilar sin problemas y debería generar la primera liberación del proyecto en rel.

Liberando a producción

El release agrega todo lo necesario (incluso la máquina virtual de Erlang) dentro del directorio del proyecto en rel. Para llevar a producción solo hay que comprimir el directorio del proyecto y llevarlo al servidor de producción.

Además, el directorio del proyecto dispone de una serie de scripts en bin que nos permiten lanzar el proyecto de la siguiente forma (suponiendo que el proyecto se llame altenwald):

altenwald/bin/altenwald console

El comando console lanzará la consola con el proyecto en ejecución. Es ideal para lanzar en un entorno como docker. También podemos lanzarlo en el propio servidor de la siguiente forma:

altenwald/bin/altenwald start

El comando start lanza en segundo plano el servidor. Su opuesto stop nos sirve para detener la ejecución. Además también disponemos de ping para comprobar si está funcionando (responderá pong en caso afirmativo) y remote_console para abrir una consola en el servidor que se está ejecutando.

Aún mucho más

Exrm no solo nos permite hacer todo lo anterior, sino mucho más. Tiene plugins que nos permiten empaquetar el proyecto en formato DEB, RPM o incluso Docker. Además de un plugin que trae por defecto que nos permite generar appups para realizar actualizaciones (upgrades) en caliente de la web y sus dependencias y downgrades o la posibilidad de volver a una versión anterior.

¿Has usado exrm en tus proyectos de Phoenix Framework? ¿te interesa saber más sobre cómo realizar proyectos en este framework? ¡Comenta o contacta con nosotros!