Nest.js + Postgres + Docker的最小生产设置

3htmauhk  于 2022-11-28  发布在  Docker
关注(0)|答案(1)|浏览(285)

在搜索How to search the exact cause "[TypeOrmModule] Unable to connect to the database." error in NestJS + TypeORM + Docker case?的解决方案时,我被建议检查ECONNREFUSED for Postgres on nodeJS with dockers主题。首先,我注意到Posgres/TypeORM的生产设置与本地开发的不同之处不仅在于值,还在于添加了额外的属性。
在我的情况下,下面的设置在本地工作正常:

import { Module as NestJS_Module } from "@nestjs/common";
import { TypeOrmModule, TypeOrmModule as TypeORM_Module } from "@nestjs/typeorm";
import type { TypeOrmModuleOptions } from "@nestjs/typeorm";
import ConfigurationRepresentative from "./Configuration/ConfigurationRepresentative";

@NestJS_Module({
  imports: [
    TypeORM_Module.forRootAsync({
      useFactory: (): TypeOrmModuleOptions => ({
      type: "postgres",
      host: "localhost",
      port: 5432,
      username: "postgres",
      password: "pass1234"
        autoLoadEntities: true,
        synchronize: ConfigurationRepresentative.isLocalExecutionEnvironment
      })
    }),
  ]
})
export default class NestJS_ApplicationRootModule {}

因此,用于本地开发情况的docker-compose.yml是:

version: "3"

services:

  Database:

    image: postgres
    container_name: LocalDatabase
    restart: always
    ports:
      - "5432:5432"

    volumes:
      - DataBaseData:/var/lib/postgresql/data

volumes:
  DataBaseData:
    driver: local

ECONNREFUSED for Postgres on nodeJS with dockers中的预设为

web:
  image: node
  command: npm start
  ports:
    - "8000:4242"
  links:
    - db
  working_dir: /src
  environment:
    SEQ_DB: mydatabase
    SEQ_USER: username
    SEQ_PW: pgpassword
    PORT: 4242
    DATABASE_URL: postgres://username:pgpassword@127.0.0.1:5432/mydatabase
  volumes:
    - ./:/src
db:
  image: postgres
  ports:
  - "5432:5432"
  environment:
    POSTGRES_USER: username
    POSTGRES_PASSWORD: pgpassword

有什么东西我们可以安全地移除吗?我想:

  • mydatabase已经在SEQ_DB中定义了,为什么还要在DATABASE_URL中复制?
  • 对于SEQ_USERSEQ_PW也是如此。
  • 为什么我们需要显式定义DATABASE_URL?它不能自动计算吗?

目前,我的docker-compose.yaml用于生产:

version: "3"

services:

  node_js:

    container_name: FrontServer
    build: .
    ports: [ "3000:3000" ]
    depends_on: [ "database" ]

  database:

    container_name: Database

    image: postgres
    ports: [ "5432:5432" ]

    environment:
      - POSTGRES_PASSWORD=pass1234
      # - POSTGRES_PASSWORD=${DATABASE_PASSWORD} It should work too but first I need to connect

    volumes:
      - Database:/data/example.com

volumes:
  Database: {}

还有,TypeORM_Module.forRootAsync将如何改变?我想,它将是不同的主机(db而不是localhost?),当然,不同的密码和一些额外的选项。

2vuwiymt

2vuwiymt1#

有什么东西我们可以安全地移除吗?我想:mydatabase已经在SEQ_DB中定义了。为什么我们需要在DATABASE_URL中复制它?SEQ_USER和SEQ_PW也一样。为什么我们需要显式定义DATABASE_URL?它不能自动计算吗?
因为你从一个例子中复制了这个,我认为它向你展示了你可以使用的两个选项,这取决于你的代码。因为这两个选项都是有效的,但通常不会组合使用。有些人喜欢使用数据库URL连接到数据库,有些人喜欢使用单变量。你可以决定,尽管你也应该在开发中使用同样的方法。
有些公司只把密码当作一个秘密,有些公司还把用户名甚至主机名当作一个秘密。越多的部分被视为秘密,就越需要使用数据库URL,因为这样你就可以把整个事情变成一个秘密而不是三个秘密。
此外,对于较大的项目,例如具有50个配置变量的项目,您可能需要考虑减少这些变量,并将连接合并到数据库。
还有,TypeORM_Module.forRootAsync将如何改变?我想,它将是不同的主机(db而不是localhost?),当然,不同的密码和一些额外的选项。
几乎正确。在您的生产docker-compose.yaml中,您调用的是服务database而不是db。因此,您需要将localhost更改为database

相关问题