Как получить текущее имя хоста в Heroku

Я играю с развертыванием приложений Clojure / Noir на Heroku, и у меня в основном работает приложение. Однако, последний кусок мне нужно выяснить имя моего приложения при развертывании на Heroku. В идеале я хочу сделать это динамически, а не жестко кодировать.

Итак, если, например, URL моего приложения'http://freez-windy-1800.herokuapp.com', я хочу иметь возможность динамически получать это в моем коде clojure.

Я знаю, что могу посмотреть на входящий запрос, чтобы понять это, но в идеале я хотел бы иметь какую-то "настройку", где я оцениваю выражение один раз и сохраняю значение в переменной, которую я могу использовать (исходя из мира Python/Django, я думаю о settings.py эквивалент в Clojure).

Для справки, код я развертывание доступна на https://github.com/rmanocha/cl-short.

3 ответов


вы можете установить переменную окружения в Heroku с помощью

heroku config:add BASE_IRI=http://freez-windy-1800.herokuapp.com

и прочитайте его обратно в Clojure

(defn- base-iri []
  (or (System/getenv "BASE_IRI") "http://localhost/"))

Heroku уже устанавливает порт, который вы можете использовать

(defn -main []
  (let [port (Integer. (or (System/getenv "PORT") 8080))]
    (run-jetty #'app {:port port})))

работает для меня в разных средах.


вы обычно делаете это с InetAddress из стандартной библиотеки Java.

(.getCanonicalHostName (java.net.InetAddress/getLocalHost))

это, однако, не выполняет поиск DNS.


3 способа получить имя хоста. Используйте, как хотите.

(ns service.get-host-name
  (require [clojure.java.shell :as shell]
           [clojure.string :as str])
  (:import [java.net InetAddress]))

(defn- hostname []
  (try
    (-> (shell/sh "hostname") (:out) (str/trim))
    (catch Exception _e
      (try
        (str/trim (slurp "/etc/hostname"))
        (catch Exception _e
          (try
            (.getHostName (InetAddress/getLocalHost))
            (catch Exception _e
              nil)))))))