【问题标题】:Deploying to heroku with clojure project, production environment issues使用clojure项目部署到heroku,生产环境问题
【发布时间】:2014-04-05 13:38:49
【问题描述】:

我有一个从“使用 Clojure 进行 Web 开发”一书中制作的图片库应用程序,我正准备将它部署到 Heroku。我试过让它既可以作为独立的 uberjar 也可以作为蹦床使用。我一开始尝试使用 environ,但在“db-spec”上不断出现数据库值错误,所以我停止使用它以使其在本地运行良好。我尝试设置自己的环境变量,也尝试使用 main.clj 文件。我编辑了我的配置文件设置信息,可以让它部署但不能在 heroku 上正常运行。有时我会看到一个空白屏幕,并且可以导航到我的一些页面,然后有时我会在 GET 上遇到一个 h10 应用程序崩溃错误,该错误正在寻找一个网站图标,这很难解决。

有经验的人能否具体告诉我我需要写什么以及在哪些文件中才能使其在 Heroku 的生产环境中工作?如果您还可以使用 Heroku 中的 Postgres 为我揭开环境变量和数据库连接设置的神秘面纱,则可以加分。

我已经搜索了 heroku、environ 和 leiningen 文档。我还在堆栈上搜索了相同的问题,当然,三重处理了我书中的所有示例,这些示例由 luminus 文档反映,因为同一个人编写了它们。我的应用程序的链接如下。下面是我在 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 喊叫应用程序教程here 进行了部署,并没有大惊小怪。但是,基于这个项目,我无法弄清楚如何更改我的图片库应用程序中的代码。 Procfile 中的$JVM_OPTS 之类的东西对我来说很神秘。欢迎任何解释或推荐。请浏览 source-code 以获取 heroku 应用程序,并在我失败的地方成功。

【问题讨论】:

  • 你真的需要在这里展示一些细节。代码、准确的错误消息文本等
  • 我继续添加了一些代码。我知道 db 定义不正确,并且我的 main 没有做任何事情来处理环境。这就是我卡住的地方。我希望从我所展示的内容中,很容易指出需要改变的地方。
  • 您是否在 heroku 上托管您的 postgres 数据库?你在heroku上运行时使用什么数据库?
  • 我正在使用 heroku PostgreSQL 插件,我的数据库连接设置在我的 heroku 仪表板上。我什至将我的数据从我的计算机移动到 heroku db 并成功地从 CLI 查询它。我不知道在哪里放置这些连接设置。

标签: postgresql heroku deployment clojure environment-variables


【解决方案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,所以这有可能是问题的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2019-11-06
    相关资源
    最近更新 更多