Arhn - архитектура программирования

Получение правильного socketPath для конфигурации TypeORM

Я пытаюсь подключить службу Cloud Run к экземпляру Postgres Cloud SQL. Кажется, я почти у цели, но у меня возникли проблемы с правильным подключением развернутого экземпляра. Моя локальная среда может подключаться (через SSL) к базе данных, предназначенной для производства, но развернутая версия не может...

Я использую TypeORM, и все правильно настроено в конфигурации...

@Module({
    imports: [
        TypeOrmModule.forRootAsync({
            imports: [ConfigModule],
            inject: [ConfigService],
            useFactory: (configService: ConfigService) => {
                const socketPath = configService.get('DB_SOCKET_PATH');
                const extra = socketPath ? {
                    socketPath: socketPath,
                    ssl: {
                        rejectUnauthorized: false,
                        ca: Buffer.from(process.env.DB_SSL_CA, 'base64').toString('ascii'),
                        cert: Buffer.from(process.env.DB_SSL_CERT, 'base64').toString('ascii'),
                        key: Buffer.from(process.env.DB_SSL_KEY, 'base64').toString('ascii'),
                    }
                } : { };

                return ({
                    type: 'postgres',
                    host: socketPath || configService.get('DB_HOST'),
                    port: configService.get('DB_PORT'),
                    username: configService.get('DB_USER'),
                    password: configService.get('DB_PASS'),
                    database: configService.get('DB_NAME'),
                    extra: extra,
                    entities: [__dirname + '/../../modules/**/*.entity{.ts,.js}'],
                    namingStrategy: new SnakeNamingStrategy(),
                    synchronize: true,
                });
            }
        })
    ]
})
export class DatabaseModule { }

Несмотря на это, я получаю сообщение об ошибке, когда пытаюсь использовать socketPath в качестве хоста, а не фактическую переменную хоста (необходимую для GCP). Кажется, что TypeORM добавляет дополнительные символы /.s.PGSQL.5432 в конец моей строки подключения, которые мне не нужны. И просто чтобы уточнить, путь к сокету имеет форму /cloudsql/<PROJECT_ID>:<REGION>:<INSTANCE>.

[Nest] 28532   - 02/15/2021, 2:25:07 PM   [ExceptionHandler] connect ENOENT <DB_SOCKET_PATH>/.s.PGSQL.5432 +3ms
Error: connect ENOENT <DB_SOCKET_PATH>/.s.PGSQL.5432
    at PipeConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)

Раньше это работало для меня, но я предполагаю, что что-то изменилось в библиотеке TypeORM. У кого-нибудь есть идеи по этому поводу? Спасибо!

РЕДАКТИРОВАТЬ: На данный момент я получил его для правильного подключения к серверу, но теперь он выдает мне ошибку, в которой говорится, что сервер не поддерживает SSL-соединения, что не имеет смысла, учитывая, что я могу нормально подключаться через SSL на моем локальном компьютере. машина...?


Ответы:


1

РЕШЕНИЕ. Похоже, проблема связана не с кодом, а с некоторыми сетевыми проблемами на стороне GCP. Я настроил службу и базу данных для запуска через VPC, а затем просто использовал частный IP-адрес для хоста.

16.02.2021

2

Кажется, что TypeORM добавляет дополнительные символы, /.s.PGSQL.5432

Это на самом деле предназначено - спецификация Postgres требует, чтобы сокеты unix заканчивались этим суффиксом.

[Nest] 28532 - 15.02.2021, 14:25:07 [ExceptionHandler] connect ENOENT ‹DB_SOCKET_PATH›/.s.PGSQL.5432 +3 мс

Ошибка означает, что сокет не найден — обычно из-за неправильной конфигурации и невозможности запуска прокси-сервера Cloud SQL. Вы можете проверить свои журналы при запуске экземпляра, чтобы увидеть, оставил ли прокси какие-либо ошибки, но обычно это сводится к следующему:

  1. Cloud SQL Admin API должен быть включен
  2. У вашего сервисного аккаунта должна быть роль Cloud SQL Connect IAM (или эквивалентная)
  3. Службу необходимо настроить для работы с Cloud SQL.

Полный список инструкций см. на странице Подключение из Cloud Run к Cloud SQL< /а>.

16.02.2021
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..