使用clojure项目部署到heroku,生产环境问题

时间:2014-04-05 13:38:50

标签: postgresql heroku deployment clojure environment-variables

我有一个图片库应用程序,我使用Clojure" Web开发#34;本书,我正在将它部署到Heroku。我试过把它作为一个独立的uberjar和蹦床工作。我尝试在开始时使用environ,但在" db-spec"上继续获取数据库值错误。所以我停止使用它使它在本地运行良好。我尝试设置自己的环境变量,并使用main.clj文件。我编辑了我的配置文件设置信息,可以让它部署但在heroku上运行不正常。有时我得到一个空白的屏幕,可以导航到我的一些页面,然后有时我在GET上遇到一个h10应用程序崩溃错误,正在寻找一个很难排除故障的图标。

有经验的人能否具体告诉我我需要写什么以及在Heroku上生产哪些文件?如果您还可以为Heroku中的Postgres揭开环境变量和数据库连接设置的神秘面纱,那么可以获得奖励积分。

我已经搜索了heroku,environ和leiningen文档。我也在堆栈上搜索了同样的问题,当然三重工作在我的书中的所有例子,由luminus docs镜像,因为同一个人写了他们。我的应用程序链接如下。下面是我在github上放置的项目的一个版本的链接。

https://github.com/gamma235/picture-gallery

这就是我定义数据库的方式:

(def db 
  {:subprotocol "postgresql"
   :subname "//localhost/gallery"
   :user "admin"
   :password "admin"})

这是我的main.clj文件:

(ns picture-gallery.main
  (:use picture-gallery.handler
        [org.httpkit.server :only [run-server]]
        [ring.middleware file-info file])
  (:gen-class))

(defn -main [& [port]]
  (let [port (if port (Integer/parseInt port) 3000)]
    (run-server app {:port port})
    (println (str "You can view the site at http://localhost:" port)))))

我正在使用[org.clojure/java.jdbc "0.2.3"]来满足我的数据库需求。这是旧版本,但我跟随着这本书。

以下是我的project.clj文件的重要部分:

...    
:main picture-gallery.main
      :min-lein-version "2.0.0"
      :plugins [[lein-ring "0.8.7"]]
      :ring {:handler picture-gallery.handler/app
             :init picture-gallery.handler/init
             :destroy picture-gallery.handler/destroy}
      :profiles
      {:uberjar {:main picture-gallery.main, :aot :all}}
      )

我按照heroku shouter应用程序教程here进行了部署并毫不费力地进行了部署。但是,根据这个项目,我无法弄清楚如何改变我的图片库应用程序中的代码。 Proc文件中$JVM_OPTS之类的东西对我来说很神秘。欢迎任何解释或推荐。请浏览source-code以获取heroku应用,并在失败的地方取得成功。

1 个答案:

答案 0 :(得分:1)

我重构了代码以用Korma包装我的数据库:

(ns picture-gallery.models.db
  (:require [clojure.java.jdbc :as sql]
            [korma.db :refer [defdb transaction]]
            [korma.core :refer :all]))

(def db (or (System/getenv "DATABASE_URL")
             "postgresql://localhost:5432/gallery"))

(defdb korma-db db)

重新部署它并且工作正常。我仍然不知道为什么它之前没有工作,它只在我使用Korma之后才开始工作,将db定义单独更改为DATABASE_URL并没有这样做。我认为它要么与Heroku有关,只支持最新版本的JDBC(我使用0.2.3)或连接池。由于我不知道为什么会发生这种情况,我觉得这个问题仍然存在,但对于那些追随我并遇到同样问题的人来说,请使用Korma。作为最后一点,我还将模板从Hiccup改为Selmer,因此这可能是导致问题的原因。