Сконфигурируйте БД PostgreSQL с Vapor 3 на Heroku - PullRequest
0 голосов
/ 21 октября 2018

Я создал простой API Vapor 3, который хотел бы развернуть на 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, но пока не повезло.Вот все соответствующие файлы, которые я могу придумать:

Procfile:

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 к моему приложению Vapor 3 на Heroku?

1 Ответ

0 голосов
/ 21 октября 2018

Первоначальная ошибка - вот ключ, в частности: SSL off.

Эта ошибка выдается Heroku Postgres, когда клиент пытается подключиться без SSL.Я сам не знаком с Vapor, но быстрый взгляд на это показывает, что configure.swift - это место, где вы можете вносить изменения в конфигурацию.Как только вы включите SSL с клиента, вы сможете без проблем подключиться к этому экземпляру базы данных.

...