【问题标题】:Configure PostgreSQL DB with Vapor 3 on Heroku在 Heroku 上使用 Vapor 3 配置 PostgreSQL 数据库
【发布时间】:2018-10-21 03:26:34
【问题描述】:

我已经构建了一个简单的 Vapor 3 API,我想将它部署在 Heroku 上。我希望它得到一个 PostgreSQL 数据库的支持,该数据库也连接到另一个 Heroku 应用程序(我已经成功地将数据库附加到 Heroku 仪表板中——并且数据库在另一个应用程序中正常工作)。但是,我的 Vapor 应用程序从未完成启动,并因以下错误而崩溃:

Fatal error: Error raised at top level: ⚠️ PostgreSQL Error: no pg_hba.conf entry for host "[the IP addr]", user "[heroku postgres username here]", database "[heroku psql db here]", SSL off
- id: PostgreSQLError.server.fatal.ClientAuthentication

我使用vapor heroku init 来设置 Heroku 应用程序。我用谷歌搜索,并尝试添加Procfile 并与configure.swift 混淆,但到目前为止还没有运气。以下是我能想到的所有相关文件:

过程文件:

web: Run serve --env production --hostname 0.0.0.0 --port $PORT --config:postgresql.url $DATABASE_URL

configure.swift:

import FluentPostgreSQL
import Vapor

/// Called before your application initializes.
public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws {
    /// Register providers first
    try services.register(FluentPostgreSQLProvider())

    var contentConfig = ContentConfig.default()

    /// Create custom JSON encoder
    let jsonEncoder = JSONEncoder()
    if #available(OSX 10.12, *) {
        jsonEncoder.dateEncodingStrategy = .iso8601
    } else {
        jsonEncoder.dateEncodingStrategy = .millisecondsSince1970
    }
//    jsonEncoder.keyEncodingStrategy = .convertToSnakeCase

    /// Register JSON encoder and content config
    contentConfig.use(encoder: jsonEncoder, for: .json)
    services.register(contentConfig)

    /// Register routes to the router
    let router = EngineRouter.default()
    try routes(router)
    services.register(router, as: Router.self)

    /// Register middleware
    var middlewares = MiddlewareConfig() // Create _empty_ middleware config
    /// middlewares.use(FileMiddleware.self) // Serves files from `Public/` directory
    middlewares.use(ErrorMiddleware.self) // Catches errors and converts to HTTP response
    services.register(middlewares)

    // Configure a database
    let dbConfig: PostgreSQLDatabaseConfig
    if let url = Environment.get("DATABASE_URL"), let psqlConfig = PostgreSQLDatabaseConfig(url: url) {
        dbConfig = psqlConfig
    } else {
        dbConfig = PostgreSQLDatabaseConfig(hostname: "localhost", port: 5432, username: "admin", database: "development", password: nil)
    }
    let postgresql = try PostgreSQLDatabase(config: dbConfig)

    /// Register the configured SQLite database to the database config.
    var databases = DatabasesConfig()
    databases.add(database: postgresql, as: .psql)
    services.register(databases)

    /// Configure migrations
    var migrations = MigrationConfig()
    migrations.add(model: Visit.self, database: .psql)
    services.register(migrations)
}

Package.swift:

// swift-tools-version:4.0
import PackageDescription

let package = Package(
    name: "SubwayNyc",
    dependencies: [
        // ???? A server-side Swift web framework.
        .package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"),

        // ???? Swift ORM (queries, models, relations, etc) built on PostgreSQL.
        .package(url: "https://github.com/vapor/fluent-postgresql.git", from: "1.0.0"),

        .package(url: "https://github.com/vapor/sql.git", from: "2.1.0")
    ],
    targets: [
        .target(name: "App", dependencies: ["FluentPostgreSQL", "Vapor"]),
        .target(name: "Run", dependencies: ["App"]),
        .testTarget(name: "AppTests", dependencies: ["App"])
    ]
)

如何让 PostgreSQL 连接到 Heroku 上的 Vapor 3 应用?

【问题讨论】:

  • 非工作环境中的heroku config 是否返回正确的DATABASE_URL
  • @davejagoda 是的,确实如此。

标签: swift heroku heroku-postgres vapor


【解决方案1】:

对于 Heroku,我们需要未经验证的 TLS 传输。

https://api.vapor.codes/postgresql/latest/PostgreSQL/Classes/PostgreSQLConnection/TransportConfig.html

let pgURL = Environment.get("DATABASE_URL") ?? "postgres://user:password@host:port/database"

let pgConfig = PostgreSQLDatabaseConfig(url: pgURL, transport: PostgreSQLConnection.TransportConfig.unverifiedTLS)!

:D

【讨论】:

    【解决方案2】:

    原来的错误是这里的关键,特别是:SSL off

    当客户端尝试在没有 SSL 的情况下进行连接时,Heroku Postgres 会引发此错误。我自己不熟悉 Vapor,但快速浏览一下就会发现 configure.swift 是您可以进行配置更改的地方。从客户端启用 SSL 后,您应该能够毫无问题地连接到此数据库实例。

    【讨论】:

    • 啊!太好了,不知道我怎么错过了。谢谢! (现在得到一个不同的错误,表明 SSL 无法连接,但是嘿,至少它在尝试!)
    • 是的,这可能是 Vapor 本身的问题(同样,我自己不是专家)。我确实注意到一些关于 SSL 支持的 PR/问题。您可能想在那里发表评论以确保它得到官方支持。
    • 404 在参考配置中找到。请您告知更新的解决方案/
    • @RajuyourPepe 我已经更新以指向更新的配置文件,但这个项目似乎仍然没有太多提及 SSL 支持。在自述文件中,看起来确实有另一个项目在后台使用了libpq,所以你可能会有更好的运气。
    • Heroku 端的 libpg 是什么?
    猜你喜欢
    • 2019-05-21
    • 2018-12-30
    • 2019-08-25
    • 2019-07-24
    • 2018-12-21
    • 2013-06-06
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多