
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.