0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: postgresql, asp.net core, cloud.yandex</p>
1
<p>Теги: postgresql, asp.net core, cloud.yandex</p>
2
<p>Итак друзья, у вас приложение asp.net core 2, 3 на Linux и вы хотите подключиться к кластеру Postgresql на базе Cloud.Yandex. Я, как и многие из нас, не люблю возиться с настройками среды, поэтому поспешил глянуть инструкцию в Яндекс-облаке. Но, увы, не нашел инструкции подключения для нашего asp.net core.</p>
2
<p>Итак друзья, у вас приложение asp.net core 2, 3 на Linux и вы хотите подключиться к кластеру Postgresql на базе Cloud.Yandex. Я, как и многие из нас, не люблю возиться с настройками среды, поэтому поспешил глянуть инструкцию в Яндекс-облаке. Но, увы, не нашел инструкции подключения для нашего asp.net core.</p>
3
<p>Я даже писал в поддержку, мол, "ваш клиент, может, расскажете, как подключиться по бысрому?" На что мне ответили - "спасибо", а потом -"ваша заявка выполнена". Но инструкции так и не появилось.</p>
3
<p>Я даже писал в поддержку, мол, "ваш клиент, может, расскажете, как подключиться по бысрому?" На что мне ответили - "спасибо", а потом -"ваша заявка выполнена". Но инструкции так и не появилось.</p>
4
<h3>Итак, как подключиться к кластеру postgresql, используя asp.net core и Ubuntu?</h3>
4
<h3>Итак, как подключиться к кластеру postgresql, используя asp.net core и Ubuntu?</h3>
5
<p>Для начала установите на своем сервер сертификат. Выполните следующую команду:</p>
5
<p>Для начала установите на своем сервер сертификат. Выполните следующую команду:</p>
6
mkdir -p ~/.postgresql && \ wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" -O ~/.postgresql/root.crt && \ chmod 0600 ~/.postgresql/root.crt<p>Данная команда добавит в папку /home/username/ .postgresql сертификат root.crt.</p>
6
mkdir -p ~/.postgresql && \ wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" -O ~/.postgresql/root.crt && \ chmod 0600 ~/.postgresql/root.crt<p>Данная команда добавит в папку /home/username/ .postgresql сертификат root.crt.</p>
7
<p>Для работы с базой Postgresql я использую библиотеку "Npgsql.EntityFrameworkCore.PostgreSQL", которая заточена под ORM Entity Framework.</p>
7
<p>Для работы с базой Postgresql я использую библиотеку "Npgsql.EntityFrameworkCore.PostgreSQL", которая заточена под ORM Entity Framework.</p>
8
<p>Моя строка соединения. Для читабельности добавил переносы. Подробнее про строку соединения можно почитать<a>тут</a>.</p>
8
<p>Моя строка соединения. Для читабельности добавил переносы. Подробнее про строку соединения можно почитать<a>тут</a>.</p>
9
Host=rc4c-blablablablabla.mdb.yandexcloud.net;Port=6432; SSLMode=Require; // TrustServerCertificate=true; Database=YOUR_DB_NAME; Username=YOUR_DB_USERNAME; Password=*******; Pooling=true;<p>Чтобы соединение работало, надо в option builder-е проставить делегаты.</p>
9
Host=rc4c-blablablablabla.mdb.yandexcloud.net;Port=6432; SSLMode=Require; // TrustServerCertificate=true; Database=YOUR_DB_NAME; Username=YOUR_DB_USERNAME; Password=*******; Pooling=true;<p>Чтобы соединение работало, надо в option builder-е проставить делегаты.</p>
10
RemoteCertificateValidationCallback и ProvideClientCertificatesCallback public async Task<ActionResult<bool>> CanConnect() { const string host = "rc4c-blablablablabla.mdb.yandexcloud.net"; var connection = $"Host={host};Port=6432;SSLMode=Require;TrustServerCertificate=true;Database=YOUR_DB_NAME;Username=YOUR_DB_USERNAME;Password=*******;Pooling=true;"; var optionsBuilder = new DbContextOptionsBuilder<DbAppContext>(); optionsBuilder.UseNpgsql(connection, builder => { builder.RemoteCertificateValidationCallback((s, c, ch, sslPolicyErrors) => { if (sslPolicyErrors == SslPolicyErrors.None) { return true; } _logService.Error($@"Certificate error: {sslPolicyErrors}, Do not allow this client to communicate with unauthenticated servers"); return false; }); builder.ProvideClientCertificatesCallback(clientCerts => { var clientCertPath = "/home/username/.postgresql/root.crt"; // To avoid permission ex run: "sudo chmod -R 777 /home/username/.postgresql/root.crt" var cert = new X509Certificate2(clientCertPath); clientCerts.Add(cert); }); }); using (var ctx = new DbAppContext(optionsBuilder.Options)) { return await ctx.Database.CanConnectAsync(); } }<h3>Error:2006D002:BIO routines:BIO_new_file:system</h3>
10
RemoteCertificateValidationCallback и ProvideClientCertificatesCallback public async Task<ActionResult<bool>> CanConnect() { const string host = "rc4c-blablablablabla.mdb.yandexcloud.net"; var connection = $"Host={host};Port=6432;SSLMode=Require;TrustServerCertificate=true;Database=YOUR_DB_NAME;Username=YOUR_DB_USERNAME;Password=*******;Pooling=true;"; var optionsBuilder = new DbContextOptionsBuilder<DbAppContext>(); optionsBuilder.UseNpgsql(connection, builder => { builder.RemoteCertificateValidationCallback((s, c, ch, sslPolicyErrors) => { if (sslPolicyErrors == SslPolicyErrors.None) { return true; } _logService.Error($@"Certificate error: {sslPolicyErrors}, Do not allow this client to communicate with unauthenticated servers"); return false; }); builder.ProvideClientCertificatesCallback(clientCerts => { var clientCertPath = "/home/username/.postgresql/root.crt"; // To avoid permission ex run: "sudo chmod -R 777 /home/username/.postgresql/root.crt" var cert = new X509Certificate2(clientCertPath); clientCerts.Add(cert); }); }); using (var ctx = new DbAppContext(optionsBuilder.Options)) { return await ctx.Database.CanConnectAsync(); } }<h3>Error:2006D002:BIO routines:BIO_new_file:system</h3>
11
<p>В процессе настройки у меня вылетала вот такая ошибка: error:2006D002:BIO routines:BIO_new_file:system. Оказалось, для файла сертификата, который используется в классе X509Certificate2, не было прав на чтение. Пока пофиксил данную проблему, просто дав права файлу на сервере:</p>
11
<p>В процессе настройки у меня вылетала вот такая ошибка: error:2006D002:BIO routines:BIO_new_file:system. Оказалось, для файла сертификата, который используется в классе X509Certificate2, не было прав на чтение. Пока пофиксил данную проблему, просто дав права файлу на сервере:</p>
12
sudo chmod -R 777 /home/username/.postgresql/root.crt
12
sudo chmod -R 777 /home/username/.postgresql/root.crt