В данной статье мы рассмотрим настройку внешнего доступа и подключение к облачной базе данных 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
Сертификат будет сохранен в файле ~/.postgresql/root.crt.
Windows (PowerShell)
Сертификат будет сохранен в файле $HOME\.postgresql\root.crt.
Для использования графических IDE сохраните сертификат в локальную папку и укажите путь к нему в настройках подключения.
Графические IDE
pgAdmin4
Создайте новое подключение к серверу:
- Выберите в меню Object → Register → Server.
- На вкладке 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
- Выберите в меню File → New → Data Source → PostgreSQL.
- Укажите параметры подключения на вкладке 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
Перед подключением установите зависимости:
psql без SSL
Подключитесь к базе данных:
После выполнения команды введите пароль пользователя.
Для проверки успешности подключения выполните запрос:
psql с SSL
Подключитесь к базе данных:
После выполнения команды введите пароль пользователя.
Для проверки успешности подключения выполните запрос:
Python
Перед подключением необходимо установить зависимости:
Python без SSL
В качестве примера используем скрипт connect.py, который выводит версию PostgreSQL:
Результат запуска скрипта:
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:
Результат запуска скрипта:
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
Перед подключением необходимо установить зависимости:
PHP без SSL
В качестве примера используем скрипт connect.php, который выводит версию PostgreSQL:
Результат запуска скрипта:
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 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.