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 dymmer, 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!