,

Migrando uma aplicação Haskell para o Google Cloud Run

Screenshots do projeto de sistema de gerenciamento de hemocentro
Sistema de gerenciamento de hemocentro foi desenvolvido usando o framework Yesod

A aplicação de controle de hemocentro em Haskell, feito durante as aulas na FATEC, está agora dentro do ecossistema do Google Cloud. Era o único projeto que restava da hospedagem no Heroku.

Logo depois a extinção do Heroku Dynos Free, a intenção inicial era deixar o projeto apenas com o código-fonte no GitHub. Mas mudei de ideia depois de ver que o post sobre o sistema no framework Yesod vem recebendo atenção nos últimos meses.

Adaptações e desafios

Originalmente, o sistema usava o banco de dados PostgreSQL. O primeiro desafio foi adaptar tudo para o uso em MariaDB, que é o padrão utilizado por aqui. Não faria sentido instalar um outro sistema de gerenciamento de banco de dados só para um projeto.

Para isso usei como base o template do Yesod para MySQL, e precisei fazer apenas algumas alterações em importações e dependências. Configurei o banco de dados também com eventos de manutenção para resetar o sistema ao estado inicial.

O código-fonte da versão final desenvolvida com PostgreSQL continua disponível no GitHub. Também aproveitei para fazer alguns pequenos ajustes na UI, e utilizar mais de variáveis de ambiente para configurações como as de acesso ao banco de dados.

Além disso, o procedimento para o deploy da aplicação Haskell no Google Cloud foi outro desafio. Se no Heroku era necessário um buildpack, no Cloud Run foi necessário criar uma imagem no Docker e fazer upload ao Container Registry.

Diferentemente do Java, o Cloud Run não lida com implantação baseada em origem para a Haskell, que cria o contêiner seguindo as práticas recomendadas para a linguagem que você está usando.

Depois de várias tentativas, o código das instruções do Docker que utilizei são estas:

# Use the official Haskell image to create a build artifact.
# https://hub.docker.com/_/haskell/
FROM haskell as builder

# Copy local code to the container image.
WORKDIR /app
COPY . .

# Build our code, then build the “haskell-blood-bank” executable.
RUN stack setup
RUN stack build --copy-bins

# Move the "haskell-blood-bank" executable to the working directory.
RUN mv "$(stack path --local-install-root)/bin/haskell-blood-bank" .

# Run the web service on container startup.
CMD ["./haskell-blood-bank"]
EXPOSE 8080

Ao contrário de outras aplicações, não foi possível implantar o acesso via proxy reverso para que o projeto seguisse o padrão de endereço pelo subdomínio projects. Assim sendo, o usuário não utilizaria o endereço aleatório gerado pelo Google Cloud. A alternativa foi usar o recurso de mapeamento de domínios e subdomínios do Cloud Run.

O projeto de controle de hemocentro em Haskell/Yesod está acessível neste link, com o usuário de demonstração user@user.com e o código user. As alterações são resetadas periodicamente de forma automática pelo banco de dados.

Avatar de Matheus Misumoto