如何在 Nestjs/Typeorm 中将 Heroku 与 Google Cloud SQL(本机 - GCP)集成?
How to integrate Heroku with Google Cloud SQL (native - GCP) in Nestjs/Typeorm?
我目前真的很沮丧,因为无法将我的应用程序部署到 Heroku 并将我的数据库连接到 Google 云 SQL。
我已经做了什么?
- 我已经设置了 SSL 来连接它们
- 我已经设置了 Cloud SQL Auth Proxy(+ 在 IAM Manager 中设置了 Cloud SQL CLient 角色)
- 我已经通过 Heroku 方法完成了构建包
等等
整体失败。
这是我在 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 方法。
非常感谢大家
我目前真的很沮丧,因为无法将我的应用程序部署到 Heroku 并将我的数据库连接到 Google 云 SQL。
我已经做了什么?
- 我已经设置了 SSL 来连接它们
- 我已经设置了 Cloud SQL Auth Proxy(+ 在 IAM Manager 中设置了 Cloud SQL CLient 角色)
- 我已经通过 Heroku 方法完成了构建包 等等
整体失败。
这是我在 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 方法。
非常感谢大家