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

В данной статье мы рассмотрим настройку внешнего доступа и подключение к облачной базе данных 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
mkdir -p ~/.postgresql && \
wget "https://beget.com/cloud-ca.crt" --output-document ~/.postgresql/root.crt && \
chmod 0600 ~/.postgresql/root.crt

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

Windows (PowerShell)
mkdir $HOME\.postgresql; curl.exe -o $HOME\.postgresql\root.crt https://beget.com/cloud-ca.crt

Сертификат будет сохранен в файле $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

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

sudo apt update && sudo apt install --yes postgresql-client
psql без SSL

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

psql "host=c-<технический_домен> \
      port=5432 \
      sslmode=disable \
      dbname=<имя_БД> \
      user=<имя_пользователя> \
      target_session_attrs=read-write"

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

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

SELECT version();
psql с SSL

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

psql "host=c-<технический_домен> \
      port=5432 \
      sslmode=verify-full \
      dbname=<имя_БД> \
      user=<имя_пользователя> \
      target_session_attrs=read-write"

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

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

SELECT version();

Python

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

sudo apt update && sudo apt install -y python3 python3-pip && pip3 install psycopg2-binary
Python без SSL

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

import psycopg2

conn = psycopg2.connect("""
    host=<FQDN_хоста_PostgreSQL>
    port=5432
    sslmode=disable
    dbname=<имя_БД>
    user=<имя_пользователя>
    password=<пароль_пользователя>
    target_session_attrs=read-write
""")

q = conn.cursor()
q.execute('SELECT version()')

print(q.fetchone())

conn.close()

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

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:

import psycopg2

conn = psycopg2.connect("""
    host=<FQDN_хоста_PostgreSQL>
    port=5432
    sslmode=verify-full
    dbname=<имя_БД>
    user=<имя_пользователя>
    password=<пароль_пользователя>
    target_session_attrs=read-write
""")

q = conn.cursor()
q.execute('SELECT version()')

print(q.fetchone())

conn.close()

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

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

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

sudo apt update && sudo apt install --yes php php-pgsql
PHP без SSL

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

<?php
  $conn = pg_connect("
      host=<FQDN_хоста_PostgreSQL>
      port=5432
      sslmode=disable
      dbname=<имя_БД>
      user=<имя_пользователя>
      password=<пароль_пользователя>
      target_session_attrs=read-write
  ");

$q = pg_query($conn, "SELECT version()");
$result = pg_fetch_row($q);
echo $result[0];

pg_close($conn);
?>

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

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:

<?php
  $conn = pg_connect("
      host=<FQDN_хоста_PostgreSQL>
      port=5432
      sslmode=verify-full
      dbname=<имя_БД>
      user=<имя_пользователя>
      password=<пароль_пользователя>
      target_session_attrs=read-write
  ");

$q = pg_query($conn, "SELECT version()");
$result = pg_fetch_row($q);
echo $result[0];

pg_close($conn);
?>

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

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.0-1ubuntu1~22.04) 11.4.0, 64-bit
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~22.04) 11.4.0, 64-bit

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

316
8483