Найти в Дзене
Beget

Облачный PostgreSQL: Подключение к базе данных

В данной статье мы рассмотрим настройку внешнего доступа и подключение к облачной базе данных PostgreSQL с помощью psql, PHP, Python, Go, NodeJS, Java, а также графических IDE DataGrip, DBeaver и pgAdmin4. Настроить внешний доступ к облачной базе данных вы можете в панели управления, в разделе “Настройки”. По умолчанию доступ к базе данных разрешен только из приватной сети. Чтобы настроить доступ к базе данных из внешней сети, укажите IP адреса или подсети в формате ip/subnet в поле “Доступ по внешнему IP-адресу”.
Если необходимо разрешить доступ с любого IP, укажите в поле подсеть 0.0.0.0/0. Обратите внимание! Невозможно указать пересекающиеся подсети либо IP-адрес, который входит в уже добавленную подсеть. Для подключения к облачной базе данных PostgreSQL через защищенное соединение необходимо установить SSL-сертификат: Linux/MacOS Сертификат будет сохранен в файле ~/.postgresql/root.crt. Windows (PowerShell) Сертификат будет сохранен в файле $HOME\.postgresql\root.crt. Для использо
Оглавление

В данной статье мы рассмотрим настройку внешнего доступа и подключение к облачной базе данных PostgreSQL с помощью psql, PHP, Python, Go, NodeJS, Java, а также графических IDE DataGrip, DBeaver и pgAdmin4.

Настройка внешнего доступа

Настроить внешний доступ к облачной базе данных вы можете в панели управления, в разделе “Настройки”.

По умолчанию доступ к базе данных разрешен только из приватной сети. Чтобы настроить доступ к базе данных из внешней сети, укажите IP адреса или подсети в формате ip/subnet в поле “Доступ по внешнему IP-адресу”.

Если необходимо разрешить доступ с любого IP, укажите в поле подсеть 0.0.0.0/0.

Обратите внимание!

Невозможно указать пересекающиеся подсети либо IP-адрес, который входит в уже добавленную подсеть.

Получение SSL-сертификата

Для подключения к облачной базе данных PostgreSQL через защищенное соединение необходимо установить SSL-сертификат:

Linux/MacOS

-2

Сертификат будет сохранен в файле ~/.postgresql/root.crt.

Windows (PowerShell)

-3

Сертификат будет сохранен в файле $HOME\.postgresql\root.crt.

Для использования графических IDE сохраните сертификат в локальную папку и укажите путь к нему в настройках подключения.

Графические IDE

pgAdmin4

Создайте новое подключение к серверу:

  • Выберите в меню ObjectRegisterServer.
  • На вкладке General в поле Name укажите имя, под которым облачный PostgreSQL будет отображаться в интерфейсе pgAdmin 4. Имя может быть любым.
  • На вкладке Connection укажите параметры подключения:Host name/address — технический домен облачной базы данных PostgreSQL;
    Port — 5432;
    Maintenance database — имя базы данных для подключения;
    Username — имя пользователя, от имени которого выполняется подключение;
    Password — пароль пользователя.
  • На вкладке Parameters:Установите параметр SSL mode в значение verify-full.
    Добавьте новый параметр
    Root certificate и укажите в нем путь к сохраненному файлу SSL-сертификата.
  • Нажмите кнопку Save, чтобы сохранить настройки подключения к серверу.

Облачный PostgreSQL появится в списке серверов в навигационном меню.

DataGrip

  • Выберите в меню FileNewData SourcePostgreSQL.
  • Укажите параметры подключения на вкладке General:User, Password — имя и пароль пользователя БД;
    URL — строка подключения: jdbc:postgresql://<технический_домен>:5432>/<имя_БД>
    Нажмите кнопку
    Download, чтобы загрузить драйвер соединения;
  • На вкладке SSH/SSL:Включите настройку Use SSL.
    В поле
    CA file укажите путь к файлу SSL-сертификата для подключения.
  • Нажмите кнопку Test Connection для проверки подключения. При успешном подключении будет выведен статус подключения, информация о СУБД и драйвере.
  • Нажмите кнопку OK, чтобы сохранить источник данных.

DBeaver

  • Выберите в меню База данных пункт Новое соединение.
  • Выберите из списка БД PostgreSQL.
  • Нажмите кнопку Далее.
  • Укажите параметры подключения на вкладке Главное:Хост — технический домен;
    Порт — 5432;
    База данных — имя БД для подключения;
    В блоке
    Аутентификация укажите имя и пароль пользователя БД.
  • На вкладке SSL:Включите настройку Использовать SSL.
    В поле
    Корневой сертификат укажите путь к сохраненному файлу SSL-сертификата.
  • Нажмите кнопку Тест соединения для проверки подключения. При успешном подключении будет выведен статус подключения, информация о СУБД и драйвере.
  • Нажмите кнопку Готово, чтобы сохранить настройки соединения с БД.

psql и языки программирования

psql

Перед подключением установите зависимости:

-4

psql без SSL

Подключитесь к базе данных:

-5

После выполнения команды введите пароль пользователя.

Для проверки успешности подключения выполните запрос:

-6

psql с SSL

Подключитесь к базе данных:

-7

После выполнения команды введите пароль пользователя.

Для проверки успешности подключения выполните запрос:

-8

Python

Перед подключением необходимо установить зависимости:

-9

Python без SSL

В качестве примера используем скрипт connect.py, который выводит версию PostgreSQL:

-10

Результат запуска скрипта:

python3 connect.py
('PostgreSQL 15.5 (Ubuntu 15.5-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit',)

Python с SSL

В качестве примера используем скрипт connect.py, который выводит версию PostgreSQL:

-11

Результат запуска скрипта:

python3 connect.py
('PostgreSQL 15.5 (Ubuntu 15.5-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit',)

PHP

Перед подключением необходимо установить зависимости:

-12

PHP без SSL

В качестве примера используем скрипт connect.php, который выводит версию PostgreSQL:

-13

Результат запуска скрипта:

php connect.php
PostgreSQL 15.5 (Ubuntu 15.5-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit

PHP с SSL

В качестве примера используем скрипт connect.php, который выводит версию PostgreSQL:

-14

Результат запуска скрипта:

php connect.php
PostgreSQL 15.5 (Ubuntu 15.5-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit

Java

Перед подключением необходимо установить зависимости:

sudo apt update && sudo apt install --yes default-jdk maven

Создать директорию для проекта Maven:

cd ~/ && mkdir -p project/src/java/com/example && cd project/

Создать конфигурационный файл для Maven pom.xml:

pom.xml

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>app</artifactId>
<packaging>jar</packaging>
<version>0.1.0</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.16</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}-${project.version}</finalName>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>src</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>attached</goal>
</goals>
<phase>package</phase>
<configuration>
<descriptorRefs>
<descriptorRef>
jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.example.App</mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

Актуальная версия зависимости для Maven: postgresql

Java без SSL

В качестве примера используем код App.java (файл необходимо создать в директории project/src/java/com/example), который выводит версию PostgreSQL:

package com.example;

import java.sql.*;

public class App {
public static void main(String[] args) {
String DB_URL = "jdbc:postgresql://<FQDN_хоста_PostgreSQL>:5432/<имяБД>?targetServerType=master&ssl=false&sslmode=disable";
String DB_USER = "<имя_пользователя>";
String DB_PASS = "<пароль_пользователя>";

try {
Class.forName("org.postgresql.Driver");

Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
ResultSet q = conn.createStatement().executeQuery("SELECT version()");
if(q.next()) {System.out.println(q.getString(1));}

conn.close();
}
catch(Exception ex) {ex.printStackTrace();}
}
}

Сборка проекта:

mvn clean package

Результат запуска проекта:

java -jar target/app-0.1.0-jar-with-dependencies.jar
PostgreSQL 15.5 (Ubuntu 15.5-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit

Java с SSL

В качестве примера используем код App.java (файл необходимо создать в директории project/src/java/com/example), который выводит версию PostgreSQL:

package com.example;

import java.sql.*;

public class App {
public static void main(String[] args) {
String DB_URL = "jdbc:postgresql://<FQDN_хоста_PostgreSQL>:5432/<имя_БД>?targetServerType=master&ssl=true&sslmode=verify-full";
String DB_USER = "<имя_пользователя>";
String DB_PASS = "<пароль_пользователя>";

try {
Class.forName("org.postgresql.Driver");

Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
ResultSet q = conn.createStatement().executeQuery("SELECT version()");
if(q.next()) {System.out.println(q.getString(1));}

conn.close();
}
catch(Exception ex) {ex.printStackTrace();}
}
}

Сборка проекта:

mvn clean package

Результат запуска проекта:

java -jar target/app-0.1.0-jar-with-dependencies.jar
PostgreSQL 15.5 (Ubuntu 15.5-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit

NodeJS

Перед подключением необходимо установить зависимости:

sudo apt update && sudo apt install --yes nodejs npm && npm install pg

NodeJS без SSL

В качестве примера используем скрипт app.js, который выводит версию PostgreSQL:

"use strict";
const pg = require("pg");

const config = {
connectionString:
"postgres://<имя_пользователя>:<пароль_пользователя>@<FQDN_хоста_PostgreSQL>:5432/<имя_БД>"
};

const conn = new pg.Client(config);

conn.connect((err) => {
if (err) throw err;
});
conn.query("SELECT version()", (err, q) => {
if (err) throw err;
console.log(q.rows[0]);
conn.end();
});

Результат запуска скрипта:

node app.js
{
version: 'PostgreSQL 15.5 (Ubuntu 15.5-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit'
}

NodeJS с SSL

В качестве примера используем скрипт app.js, который выводит версию PostgreSQL:

"use strict";
const fs = require("fs");
const pg = require("pg");

const config = {
connectionString: "postgres://<имя_пользователя>:<пароль_пользователя>@<FQDN_хоста_PostgreSQL>:5432/<имя_БД>",
ssl: {
rejectUnauthorized: true,
ca: fs
.readFileSync("/home/<домашняя_директория>/.postgresql/root.crt")
.toString(),
},
};

const conn = new pg.Client(config);

conn.connect((err) => {
if (err) throw err;
});
conn.query("SELECT version()", (err, q) => {
if (err) throw err;
console.log(q.rows[0]);
conn.end();
});

Результат запуска скрипта:

node app.js
{
version: 'PostgreSQL 15.5 (Ubuntu 15.5-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit'
}

Go

Перед подключением необходимо установить зависимости:

sudo apt update && sudo apt install --yes golang git && go mod init example && go get github.com/jackc/pgx/v4

Go без SSL

В качестве примера используем скрипт connect.go, который выводит версию PostgreSQL:

package main

import (
"context"
"fmt"
"os"

"github.com/jackc/pgx/v4"
)

const (
host = "<FQDN_хоста_PostgreSQL>"
port = 5432
user = "<имя_пользователя>"
password = "<пароль_пользователя>"
dbname = "<имя_БД>"
)

func main() {

connstring := fmt.Sprintf(
"host=%s port=%d dbname=%s user=%s password=%s target_session_attrs=read-write",
host, port, dbname, user, password)

connConfig, err := pgx.ParseConfig(connstring)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to parse config: %v\n", err)
os.Exit(1)
}

conn, err := pgx.ConnectConfig(context.Background(), connConfig)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)
os.Exit(1)
}

defer conn.Close(context.Background())

var version string

err = conn.QueryRow(context.Background(), "select version()").Scan(&version)
if err != nil {
fmt.Fprintf(os.Stderr, "QueryRow failed: %v\n", err)
os.Exit(1)
}

fmt.Println(version)
}

Результат запуска скрипта:

go run connect.go
PostgreSQL 15.5 (Ubuntu 15.5-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4

Go с SSL

В качестве примера используем скрипт connect.go, который выводит версию PostgreSQL:

package main

import (
"context"
"crypto/tls"
"crypto/x509"
"fmt"
"io/ioutil"
"os"

"github.com/jackc/pgx/v4"
)

const (
host = "<FQDN_хоста_PostgreSQL>"
port = 5432
user = "<имя_пользователя>"
password = "<пароль_пользователя>"
dbname = "<имя_БД>"
ca = "/home/<домашняя_директория>/.postgresql/root.crt"
)

func main() {

rootCertPool := x509.NewCertPool()
pem, err := ioutil.ReadFile(ca)
if err != nil {
panic(err)
}

if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
panic("Failed to append PEM.")
}

connstring := fmt.Sprintf(
"host=%s port=%d dbname=%s user=%s password=%s sslmode=verify-full target_session_attrs=read-write",
host, port, dbname, user, password)

connConfig, err := pgx.ParseConfig(connstring)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to parse config: %v\n", err)
os.Exit(1)
}

connConfig.TLSConfig = &tls.Config{
RootCAs: rootCertPool,
InsecureSkipVerify: true,
}

conn, err := pgx.ConnectConfig(context.Background(), connConfig)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)
os.Exit(1)
}

defer conn.Close(context.Background())

var version string

err = conn.QueryRow(context.Background(), "select version()").Scan(&version)
if err != nil {
fmt.Fprintf(os.Stderr, "QueryRow failed: %v\n", err)
os.Exit(1)
}

fmt.Println(version)
}

Результат запуска скрипта:

go run connect.go
PostgreSQL 15.5 (Ubuntu 15.5-1.pgdg22.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~2

Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “Помощь и поддержка”), а если вы захотите обсудить эту статью или наши продукты с коллегами по цеху и сотрудниками Бегета – ждем вас в нашем сообществе в Telegram.