Ищем решение Как найти точную причину "[TypeOrmModule] Не удалось подключиться к базе данных." ошибка в случае NestJS + TypeORM + Docker? , мне порекомендовали проверить ECONNREFUSED для Postgres на nodeJS с темами докеров. Первое, что я заметил, это то, что производственная установка 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 для Postgres на nodeJS с докерами есть
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:[email protected]:5432/mydatabase
volumes:
- ./:/src
db:
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_USER: username
POSTGRES_PASSWORD: pgpassword
Есть ли что-то, что мы можем безопасно удалить? Я предполагаю:
mydatabase
уже определено в SEQ_DB
. Зачем нам дублировать его в DATABASE_URL
?SEQ_USER
и SEQ_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
?), естественно, другой пароль и какие-то дополнительные опции.
Есть ли что-то, что мы можем безопасно удалить? Я предполагаю: База данных 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
Спасибо за ответ! В моем случае
SEQ_DB
,SEQ_USER
,DATABASE_URL
не требовалось. Кроме того, ваши последние указания («Поэтому вам нужно переодеться...») спасли мой день.