如何在 Nestjs/Typeorm 中将 Heroku 与 Google Cloud SQL(本机 - GCP)集成?

How to integrate Heroku with Google Cloud SQL (native - GCP) in Nestjs/Typeorm?

我目前真的很沮丧,因为无法将我的应用程序部署到 Heroku 并将我的数据库连接到 Google 云 SQL。

我已经做了什么?

整体失败。

这是我在 Nestjs 中通过 Typeorm 配置的数据库。

    import { TypeOrmModuleOptions } from "@nestjs/typeorm"
    const fs = require("fs");
    require('dotenv').config()

    export class OrmConfig {
        // Config TypeOrm
        getConfig() {
             const ormConfig: TypeOrmModuleOptions = {
                 type: 'postgres',
                 url: 'postgres://myusername:mypassword@myhostincloudsql(publicip):5432/mydb',
                 // host: 'myhostincloudsql(public ip)',
                 // port: 5432,
                 // username: 'myusername',
                 // password: 'mypassword',
                 // database: 'mydb',
                 entities: ['dist/**/*.entity{.js,.ts}'],
                 synchronize: false,
                 migrationsRun: true,
                 logging: false,
                 logger: 'file',
                 migrations: [
                     'dist/database/migrations/**/*{.js, .ts}'
                 ],
                 cli: {
                     migrationsDir: 'database/migrations'
                 },
                 ssl: true,
                 extra: {
                      ssl: {
                           ca: fs.readFileSync('./src/config/server-ca.pem'),
                           cert: fs.readFileSync('./src/config/client-cert.pem'),
                           key: fs.readFileSync('./src/config/client-key.pem'),
                           // rejectUnauthorized: false
                      }
                 }
            }

            return ormConfig
        }
    }

    export default new OrmConfig().getConfig()

这是我的app.module.ts

    import { SendGridModule } from '@anchan828/nest-sendgrid';
    import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
    import { ConfigModule } from '@nestjs/config';
    import { TypeOrmModule } from '@nestjs/typeorm';
    // import { BlogModule } from './blog/blog.module';
    import OrmConfig from './config/ormConfig';
    import { BusinessContactModule } from './contact/business/business.module';
    import { InvestorNotificationController } from './contact/investor/investment-recommendation/investor-notification.controller';
    import { InvestmentRecommendationModule } from './contact/investor/investment-recommendation/investor-notification.module';
    import { InvestorContactModule } from './contact/investor/angel-investor/investor.module';
    import { EmitenCampaignModule } from './emiten-campaign/emiten-campaign.module';
    import { EmitenModule } from './emiten/emiten.module';
    import { FlashMobileModule } from './flash-mobile/flash-mobile.module';
    import { CoreModule } from './global/core.module';
    import { Agent } from './middleware/agent';
    import { AuthModule } from './middleware/auth.module';
    import { TekenajaModule } from './tekenaja/tekenaja.module';
    import { UserModule } from './user/user.module';
    require('dotenv').config();

    @Module({
       imports: [
         /**
         * ================================
         * Typeorm Config
         * ================================
         */
         SendGridModule.forRoot({
           apikey: process.env.SENDGRID_API_KEY,
         }),
         TypeOrmModule.forRoot(OrmConfig), // This is I call it
         ConfigModule.forRoot(),
         AuthModule,
         TekenajaModule,
         FlashMobileModule,
         CoreModule,
         EmitenModule,
         EmitenCampaignModule,
         // InvestorContactModule,
         // BusinessContactModule,
         UserModule,
         // BlogModule
         InvestmentRecommendationModule
       ]
     })
     export class AppModule implements NestModule { 
       configure(consumer: MiddlewareConsumer) {
         consumer
         .apply(Agent)
         .forRoutes('/');
       }
     }

注意:无论如何,我在 Google Cloud SQL

中使用 public ip

我已经尝试从 Heroku Postgres 连接它,并且可以正常工作。我尝试使用 Cloud SQL 字段,得到类似这样的错误

现在,我应该怎么做才能将它们连接起来?我希望回复我的问题伙计们。非常感谢。

尝试 运行 Cloud SQL 代理以及您在同一个发电机中的应用程序。

例如:

web: trap '' SIGTERM; ./cloud_sql_proxy -credential_file sa.json -instances=INSTANCE_CONN_NAME=tcp:5432 & npm start & wait -n; kill -SIGTERM -$$; wait

请注意,您需要确保云 SQL 代理二进制文件和凭据文件包含在您的应用中。而且您不想将它们签入源代码管理。

参见https://help.heroku.com/CTFS2TJK/how-do-i-run-multiple-processes-on-a-dyno

在 CloudSQL 中 - 您的实例必须具有 Public IP 地址(连接部分),并且您需要授权网络中的 IP 地址,您将尝试从该网络进行连接。 Ofc 你可以设置 0.0.0.0 但不要这样做。更好的方法是设置 ssh 连接。

我的问题已经解决了。如@Sebastian Pietrzak 所述,我应该在连接菜单的授权网络中实施 0.0.0.0/0。对于额外的,您必须设置 SSL 方法。

非常感谢大家