§部署到 Heroku
Heroku 是雲端應用程式平台,一種建置和部署網路應用程式的途徑。
開始使用
有兩種部署到 Heroku 的方法
- 推送到遠端 Git 儲存庫。
- 使用 sbt-heroku 外掛程式。
§部署到遠端 Git 儲存庫
§將您的應用程式儲存在 git
$ git init
$ git add .
$ git commit -m "init"
§在 Heroku 上建立新應用程式
$ heroku create
Creating warm-frost-1289... done, stack is cedar-14
http://warm-frost-1289.herokuapp.com/ | [email protected]:warm-frost-1289.git
Git remote heroku added
此動作會為您的應用程式提供一個新的應用程式,其中包含 HTTP(和 HTTPS)端點和 Git 端點。Git 端點會設定為您 Git 存放庫設定中名為 heroku
的新遠端。
§部署您的應用程式
若要在 Heroku 上部署您的應用程式,請使用 Git 將其推送到 heroku
遠端存放庫
$ git push heroku main
Counting objects: 93, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (84/84), done.
Writing objects: 100% (93/93), 1017.92 KiB | 0 bytes/s, done.
Total 93 (delta 38), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Play 2.x - Scala app detected
remote: -----> Installing OpenJDK 1.8... done
remote: -----> Priming Ivy cache (Scala-2.11, Play-2.4)... done
remote: -----> Running: sbt compile stage
...
remote: -----> Dropping ivy cache from the slug
remote: -----> Dropping sbt boot dir from the slug
remote: -----> Dropping compilation artifacts from the slug
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing... done, 93.3MB
remote: -----> Launching... done, v6
remote: https://warm-frost-1289.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/warm-frost-1289.git
* [new branch] main -> main
Heroku 會執行 sbt stage
來準備您的應用程式。在第一次部署時,所有相依性都會下載,這需要一段時間才能完成(但它們會快取以供將來部署使用)。
如果您正在使用 RequireJS,而且發現您的應用程式在此步驟中掛起
[info] Optimizing JavaScript with RequireJS
然後請嘗試按照 Heroku Dev Center 上使用 Node.js 為 Play 和 Scala 應用程式執行 JavaScript 最佳化中的步驟進行操作。這將大幅提升 Javascript 引擎的效能。
§檢查您的應用程式是否已部署
現在,讓我們檢查應用程式程序的狀態
$ heroku ps
=== web (Free): `target/universal/stage/bin/sample-app -Dhttp.port=${PORT}`
web.1: up 2015/01/09 11:27:51 (~ 4m ago)
網路程序已啟動並執行中。我們可以檢視記錄檔以取得更多資訊
$ heroku logs
2015-07-13T20:44:47.358320+00:00 heroku[web.1]: Starting process with command `target/universal/stage/bin/myapp -Dhttp.port=${PORT}`
2015-07-13T20:44:49.750860+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx384m -Xss512k -Dfile.encoding=UTF-8
2015-07-13T20:44:52.297033+00:00 app[web.1]: [warn] application - Logger configuration in conf files is deprecated and has no effect. Use a logback configuration file instead.
2015-07-13T20:44:54.960105+00:00 app[web.1]: [info] p.a.l.c.ActorSystemProvider - Starting application default Pekko system: application
2015-07-13T20:44:55.066582+00:00 app[web.1]: [info] play.api.Play$ - Application started (Prod)
2015-07-13T20:44:55.445021+00:00 heroku[web.1]: State changed from starting to up
2015-07-13T20:44:55.330940+00:00 app[web.1]: [info] p.c.s.PekkoHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
...
我們也可以像對待一般檔案一樣,對記錄檔執行 tail。這對於除錯很有用
$ heroku logs -t --app warm-frost-1289
2015-07-13T20:44:47.358320+00:00 heroku[web.1]: Starting process with command `target/universal/stage/bin/myapp -Dhttp.port=${PORT}`
2015-07-13T20:44:49.750860+00:00 app[web.1]: Picked up JAVA_TOOL_OPTIONS: -Xmx384m -Xss512k -Dfile.encoding=UTF-8
2015-07-13T20:44:52.297033+00:00 app[web.1]: [warn] application - Logger configuration in conf files is deprecated and has no effect. Use a logback configuration file instead.
2015-07-13T20:44:54.960105+00:00 app[web.1]: [info] p.a.l.c.ActorSystemProvider - Starting application default Pekko system: application
2015-07-13T20:44:55.066582+00:00 app[web.1]: [info] play.api.Play$ - Application started (Prod)
2015-07-13T20:44:55.445021+00:00 heroku[web.1]: State changed from starting to up
2015-07-13T20:44:55.330940+00:00 app[web.1]: [info] p.c.s.PekkoHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
...
看起來不錯。我們現在可以透過執行下列動作來拜訪應用程式
$ heroku open
§疑難排解
如果您的應用程式包含 build.gradle
檔案,Heroku 會偵測它,並嘗試將您的應用程式建置為 Gradle 專案,而不是 Scala sbt 專案。您可以透過執行下列指令,強制 Heroku 使用 sbt
$ heroku buildpacks:set heroku/scala
Scala buildpack 將使用儲存庫中的 build.sbt
檔案來建置應用程式。
§部署使用最新 Java 版本的應用程式
Heroku 預設使用 OpenJDK 8 來執行 Java 應用程式。它無法自動判斷是否需要其他版本,因此部署使用較新 Java 版本的應用程式會導致伺服器上發生編譯錯誤。如果您使用較 Java 8 更新的版本,您應該在專案根目錄的 system.properties
檔案中宣告它,例如
java.runtime.version=11
請參閱 Heroku 文件 以取得更多詳細資料。
§使用 sbt-heroku 外掛程式進行部署
Heroku sbt 外掛程式使用 API 來提供預先封裝的獨立式 Web 應用程式到 Heroku 的直接部署。對於編譯需要很長時間或需要從持續整合伺服器(例如 Travis CI 或 Jenkins)部署的應用程式,這可能是較佳的方法。
§新增外掛程式
若要將 Heroku sbt 外掛程式包含在您的專案中,請將下列內容新增到您的 project/plugins.sbt
檔案
addSbtPlugin("com.heroku" % "sbt-heroku" % "2.0.0")
接下來,我們必須設定外掛程式將部署到的 Heroku 應用程式名稱。但首先,請建立一個新的應用程式。安裝 Heroku Toolbelt 並執行建立指令。
$ heroku create
Creating obscure-sierra-7788... done, stack is cedar-14
http://obscure-sierra-7788.herokuapp.com/ | [email protected]:obscure-sierra-7788.git
現在,將類似下列內容新增到您的 build.sbt
,但請將 “obscure-sierra-7788” 替換為您建立的應用程式名稱(如果您在本地使用 Git,則可以略過此步驟)。
Compile / herokuAppName := "obscure-sierra-7788"
sbt-heroku 專案的文件包含有關 設定外掛程式執行 的詳細資料。
§使用外掛程式進行部署
新增外掛程式後,您可以透過執行此指令來部署到 Heroku
$ sbt stage deployHeroku
...
[info] -----> Packaging application...
[info] - app: obscure-sierra-7788
[info] - including: target/universal/stage/
[info] -----> Creating build...
[info] - file: target/heroku/slug.tgz
[info] - size: 30MB
[info] -----> Uploading slug... (100%)
[info] - success
[info] -----> Deploying...
[info] remote:
[info] remote: -----> Fetching custom tar buildpack... done
[info] remote: -----> sbt-heroku app detected
[info] remote: -----> Installing OpenJDK 1.8... done
[info] remote: -----> Discovering process types
[info] remote: Procfile declares types -> console, web
[info] remote:
[info] remote: -----> Compressing... done, 78.9MB
[info] remote: -----> Launching... done, v6
[info] remote: https://obscure-sierra-7788.herokuapp.com/ deployed to Heroku
[info] remote:
[info] -----> Done
[success] Total time: 90 s, completed Aug 29, 2014 3:36:43 PM
而且您可以透過執行此指令來拜訪您的應用程式
$ heroku open -a obscure-sierra-7788
你可以執行此指令來查看應用程式的記錄
$ heroku logs -a obscure-sierra-7788
請注意,如果你使用 Git,你可以省略上述的 -a
選項,因為應用程式
名稱會從你執行 heroku create
時新增到組態的 Git 遠端偵測到。
ran heroku create
.
§連線到資料庫
Heroku 透過 Heroku Add-ons 提供許多關係型和 NoSQL 資料庫。Heroku 上的 Play 應用程式會自動配置 Heroku Postgres 資料庫。若要設定你的 Play 應用程式使用 Heroku Postgres 資料庫,請先將 PostgreSQL JDBC 驅動程式新增到你的應用程式相依性 (build.sbt
)
libraryDependencies += "org.postgresql" % "postgresql" % "9.4-1201-jdbc41"
然後在專案的根目錄建立一個名為 Procfile
(大寫「P」) 的新檔案,其中包含以下內容 (用你的專案名稱取代 myapp
)
web: target/universal/stage/bin/myapp -Dhttp.port=${PORT} -Dplay.evolutions.db.default.autoApply=true -Ddb.default.driver=org.postgresql.Driver -Ddb.default.url=${DATABASE_URL}
這會指示 Heroku,對於名為 web
的程序,它將執行 Play 並覆寫 play.evolutions.db.default.autoApply
、db.default.driver
和 db.default.url
組態參數。請注意,Procfile
指令長度最多為 255 個字元。或者,使用 生產組態 頁面中提到的 -Dconfig.resource=
或 -Dconfig.file=
。
此外,請注意 DATABASE_URL
採用平台非相依格式
vendor://username:password@host:port/db
如果你使用內建的資料庫連線池之一,Play 會自動將其轉換為 JDBC URL。但其他資料庫函式庫和架構,例如 Slick 或 Hibernate,可能不支援此格式。
如果是這樣,你可以嘗試使用 動態 JDBC_DATABASE_URL
取代組態中的 DATABASE_URL
,如下所示
db.default.url=${?JDBC_DATABASE_URL}
db.default.username=${?JDBC_DATABASE_USERNAME}
db.default.password=${?JDBC_DATABASE_PASSWORD}
請注意,Heroku 實際上不需要建立 Procfile,因為 Heroku 會在你的 Play 應用程式的 conf 目錄中尋找 application.conf
檔案,以確定它是 Play 應用程式。
§進一步的學習資源
- 在 Heroku 上開始使用 Scala 和 Play
- 使用 Heroku sbt 外掛部署 Scala 和 Play 應用程式
- 使用 Node.js 為 Play 和 Scala 應用程式執行 JavaScript 最佳化
- 從 Travis CI 將 Scala 和 Play 應用程式部署到 Heroku
- 從 Jenkins CI 將 Scala 和 Play 應用程式部署到 Heroku
- 為 Scala 或 Play 應用程式執行遠端 sbt 控制台
- 使用 Java 和 Play Framework 在 Heroku 上使用 WebSocket
- Play 和 Heroku 的種子專案
- Play 的 Java 教學課程
- 使用 Play、Heroku 和 CloudFront 進行邊緣快取
- 針對資料庫驅動應用程式最佳化 Play
- 在 Heroku 上使用 Play 應用程式和排程工作
- 使用 Java 和 Play 將檔案上傳至 Amazon S3
在這個文件裡發現錯誤了嗎?這個頁面的原始碼可以在 這裡 找到。在閱讀 文件指南 後,歡迎您貢獻一個 pull request。有問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開對話。