如何使用Keter部署Yesod?

时间:2014-05-10 21:50:46

标签: haskell deployment yesod keter

我尝试使用Keter将Yesod应用程序部署到Ubuntu服务器。到目前为止,这就是我所做的:

  1. 使用提供的安装脚本在服务器上安装Keter
    • wget -O - https://raw.github.com/snoyberg/keter/master/setup-keter.sh | bash
  2. 运行yesod keter在我的开发机器上创建一个捆绑包(运行OS X Mavericks)
  3. scp*.keter文件放入服务器上的/opt/keter/incoming
  4. 此时,我认为我应该可以访问我的域并让应用程序正常运行,但我看到了#34;欢迎使用nginx"而是页面。此外,/opt/keter/log/keter/current.log中的所有内容都是:

    2014-05-10 18:21:01.48: Unpacking bundle '/opt/keter/etc/../incoming/DoDeployTest.keter'
    

    我认为我应该对启动流程和加载应用程序有所了解。

    使用Keter部署Yesod需要做什么?是否有一个很好的教程涵盖了这一点(到目前为止,很多我阅读的内容似乎有点过时,因为没有提到有用的东西,如yesod keter;很难说但是。)

    我对Haskell / Yesod / Keter / Sysadmin工作很陌生,所以感谢任何帮助。

    附录

    Yesod项目的

    Github repo(其香草yesod init w / postgres +配置keter.yaml文件)

    Keter.yaml文件:

    exec: ../dist/build/DoDeployTest/DoDeployTest
    args:
        - production
    host: "http://www.yesodonrails.com"
    postgres: true
    root: ../static
    

2 个答案:

答案 0 :(得分:4)

为了确保最大程度的成功,我强烈建议您在同一平台上编译和运行Keter和Yesod应用程序。建议还要在与您部署的计算机不同的计算机上编译应用程序,因为GHC编译非常耗费资源。看起来你已经在做这个了(尽管在OS X上进行编译并在Ubuntu服务器上进行部署,这不会起作用,如回复你自己的答案所述)。

我的建议是使用Docker容器来确保一致的环境。我有一个GitHub project包含了一些Dockerfiles我一直在努力解决这个问题,我将大致描述他们在这里所做的事情。请注意,这个GitHub项目仍在进行中,我还没有完美的一切。这也与我给this question的答案相似。

keter-build

FROM haskell:latest
RUN apt-get update && apt-get install -y \
  git
RUN mkdir /src
RUN cd src && \
  git clone https://github.com/snoyberg/keter && \
  cd keter && \
  git checkout e8b5a3fd5e14dfca466f8acff2a02f0415fceeb0
WORKDIR /src/keter
RUN cabal update
RUN cabal install keter

这将配置一个容器,该容器可用于在Keter GitHub项目的给定修订版本中构建keter二进制文件。

keter-host

FROM debian
RUN apt-get update && apt-get install -y \
  ca-certificates \
  libgmp-dev \
  nano \
  postgresql
COPY artifacts/keter /opt/keter/bin/
COPY artifacts/keter-config.yaml /opt/keter/etc/
EXPOSE 80
CMD ["/opt/keter/bin/keter", "/opt/keter/etc/keter-config.yaml"]

此容器是一个独立的Keter主机。您应确保keter容器中内置的keter-build二进制文件在artifacts目录中可用,以便COPY artifacts/keter /opt/keter/bin/指令将其复制到映像中。

yesod-env

FROM haskell:latest
RUN apt-get update && apt-get install -y \
  ca-certificates \
  git \
  nano \
  wget
RUN echo 'deb http://download.fpcomplete.com/debian/jessie stable main' > /etc/apt/sources.list.d/fpco.list
RUN wget -q -O- https://s3.amazonaws.com/download.fpcomplete.com/debian/fpco.key | apt-key add -
RUN apt-get update && apt-get install -y \
  stack

这是用于构建Yesod应用程序的容器。请注意,此Dockerfile不完整,并且还没有克隆应用程序的源代码并构建它。但是,这可能会让你开始。

请注意,所有三个容器最终都基于相同的debian Docker基础映像,因此每个容器中生成的二进制文件很有可能在其他容器中有效。我的一些作品受到thoughtbot设计的Dockerfiles的启发。

答案 1 :(得分:2)

啊,基于blog post introducing Keter的建议,我试图手动在*.keter文件中运行可执行文件。这样做产生了“无法执行二进制文件”的消息。我怀疑这是因为我最初在Mac上进行编译,并部署到Ubuntu实例(我在尝试部署到Heroku时遇到同样的问题)。

发现这个的过程(可能稍微不准确):

cp /opt/keter/incoming/DoDeployTest.keter /tmp
cd /tmp
mv DoDeployTest.keter DoDeployTest.tar.gz
gunzip DoDeployTest.tar.gz
tar xvf DoDeployTest.tar
# run executable
/dist/build/appname/appname