【问题标题】:How can I deploy Yesod using Keter?如何使用 Keter 部署 Yesod?
【发布时间】:2014-06-28 11:57:19
【问题描述】:

我正在尝试使用 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

此时,我认为我应该能够访问我的域并让应用程序正常运行,但我看到的是“欢迎使用 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

【问题讨论】:

    标签: haskell deployment yesod keter


    【解决方案1】:

    啊,所以根据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
    

    【讨论】:

    • 是的。 Haskell 通常编译为本机代码,因此在 OS X 上生成的二进制文件将无法在 Linux 上运行。
    【解决方案2】:

    为确保最大程度的成功,我强烈建议您在同一平台上编译和运行 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-build 容器中构建的keter 二进制文件在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 的启发。

    【讨论】:

    • 我看到 yesod-env 已从 repo 中删除。什么是替代方案。如果您还可以共享您运行的命令以获取 Keter 捆绑包,那就太好了(例如,我将如何从我的 Mac 使用它以使其最终在 Ubuntu 上运行)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2018-11-25
    相关资源
    最近更新 更多