Fork me on GitHub
#heroku
<
2021-03-23
>
Umar Daraz15:03:03

Hi fellow clojurians Im deploying clojure deps.edn app to heroku. and it deployed successful. But heroku dyno restart (happens once every day automatically ) fails with

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 150 seconds of launch
Here my Procfile command
web: java -cp ps.jar clojure.main -m reviews.system
and here is my main system file, Locally it takes around 30 seconds to start up server
(ns reviews.system
  (:require [integrant.core :as ig]
            [ring.adapter.jetty :as jetty]
            [reviews.server :as server]
            [migratus.core :as migratus]
            [migrations :as migrations]
            [reviews.db :as db]))

(def system-config
  {:shop/jetty {:handler (ig/ref :shop/handler)
           :port (Integer. (or (System/getenv "PORT") "3000"))}
   :shop/handler {:db (ig/ref :shop/postgres)}
   :shop/migrations {:db (ig/ref :shop/postgres)}
   :shop/postgres nil})

(defmethod ig/init-key :shop/jetty [_ {:keys [handler port] }]
  (println "server running on port 3000")
  (jetty/run-jetty handler {:port port :join? false}))



(defmethod ig/init-key :shop/migrations [_ {:keys [db] }]
  (let [config {:db {:datasource {:datasource db}}}]
    (migratus/migrate migrations/config)))

(defmethod ig/init-key :shop/handler [_ {:keys [db] }]
  (server/create-app db))

(defmethod ig/init-key :shop/postgres [_ _]
  db/spec)

(defmethod ig/halt-key! :shop/jetty [_  jetty]
  (.stop jetty))



(defn -main []
  (println "Running main!")
  (println "PORT: " (Integer. (or (System/getenv "PORT") "3000")))
  (ig/init system-config))

(comment 
  (def system (ig/init system-config))
  (ig/halt! system))

practicalli-john18:03:05

@umardaraz4747 Starting jetty by itself should be pretty instantaneous, so assume it must be due to the database or what you are doing to the database. If you are on a free plan for Heroku Postgres, check you are not exceeding the 10,000 row limit. Is there anything else in the heroku logs?

heroku logs --app your-heroku-app-name --tail
I would look at the logs and emulate a restart by using the following commands a suitable time apart
heroku ps:stop your-heroku-app-name
heroku ps:stop your-heroku-app-name
All the logs have timestamps, so you should be able to see how long its taking... I would look for issues connecting to the db or perhaps migrations. Perhaps add some printlin or logging expressions to the migrations to see how quickly that is doing something. I am unsure what the Integrant :shop/postgres is doing, perhaps its just defining the JDBC_DATABASE_URL environment variable to connection to the database. I assume its not trying to start/restart the Heroku Postgres database. I would also consider separating out Migrations into its own project and run that as an independant Heroku application, that way your web application server is not dependant on a potentially lengthy database migration step. If you are happy to share a repository of the code, I can try deploying it myself on Heroku and see if I can spot any issues.