Перейти к содержанию

Запуск PostgreSQL 18 в Docker

Использование Docker-образа

Для работы с приложением "Первая Форма" можно использовать готовый Docker-образ с преднастроенной СУБД PostgreSQL 18:

docker.1forma.ru/1f/postgres:18.1-zfs-2

В данной инструкции описан процесс развертывания PostgreSQL 18 в Docker.

Авторизация в приватном Docker Registry

Перед загрузкой образа получите учётные данные для авторизации в Docker Registry "Первой Формы" и выполните вход:

docker login docker.1forma.ru

Запуск PostgreSQL в Docker Compose

Шаг 1: Создание каталога для сервиса

Создайте каталог для сервиса (или используйте уже существующий):

sudo mkdir -p /opt/postgres

cd /opt/postgres

Шаг 2: Создание docker-compose.yml

Создайте файл docker-compose.yml и добавьте в него следующую конфигурацию:

services:

 db:

   image: docker.1forma.ru/1f/postgres:18.1-zfs-2

   restart: unless-stopped

   container_name: ${PG_CLONE_NAME}

   ulimits:

     nofile:

       soft: 65536

       hard: 65536

   command: >

     postgres

     -p 5432

     -c shared_buffers=1GB

     -c effective_cache_size=3GB

     -c work_mem=16MB

     -c maintenance_work_mem=512MB

     -c random_page_cost=1.1

     -c effective_io_concurrency=200

     -c min_wal_size=1GB

     -c max_wal_size=4GB

     -c lc_messages='en_US.UTF-8'

     -c lc_monetary='en_US.UTF-8'

     -c lc_numeric='en_US.UTF-8'

     -c lc_time='en_US.UTF-8'

     -c jit=off

     -c io_method=io_uring


     -c shared_preload_libraries='pg_stat_statements,pg_hint_plan,pg_qualstats'

   environment:

     POSTGRES_PASSWORD:

     POSTGRES_USER:

     POSTGRES_DB:

     PGPORT:

     TZ:

     DBO_PASS:

     D10TASKUSER_PASS:

     MIGRATIONSDAEMON_PASS:

     REBUS_PASS:

     IMPLEMENTER_PASS:

     D10TASKREADER_PASS:

     PGDATA:

     PG_CLONE_NAME:

     MOUNT_DIR:

     BACKUP_DIR:

   ports:

     - "${PG_PORT}:5432"

   volumes:

     - ${MOUNT_DIR}:${PGDATA}

     - ${BACKUP_DIR}:/backups

     - ${SCRIPT_DIR}:/tmp

Примечания:

  • В конфигурации открыт порт 5432 для подключения

  • Данные PostgreSQL хранятся в локальном volume (./pgdata), что предотвращает их потерю при перезапуске контейнера

  • Настройки сервера выставлять исходя из серверных мощностей

  • Параметр security_opt: seccomp:unconfined необходим для работы io_method=io_uring

Шаг 3: Создание файла .env

Создайте файл .env для хранения переменных окружения:

touch .env

Заполните его следующими параметрами:

Общие настройки

TZ=Europe/Moscow

PGDATA=/var/lib/postgresql/18/data

POSTGRES_USER=postgres

POSTGRES_PASSWORD=pass_postgres

Директории

MOUNT_DIR=./pgdata/18-main

BACKUP_DIR=./pgdata/backups

Пароли пользователей приложения

DBO_PASS=pass_dbo

D10TASKUSER_PASS=pass_d10taskuser

MIGRATIONSDAEMON_PASS=pass_migrationsdaemon

REBUS_PASS=pass_rebus

IMPLEMENTER_PASS=pass_implementer

D10TASKREADER_PASS=pass_d10taskreader

Важно: При первом запуске контейнера с пустым каталогом данных автоматически:

1. Активируются необходимые расширения PostgreSQL

2. Создаются пользователи и назначаются пароли из .env

Внимание: Инициализационные скрипты выполняются только при запуске контейнера с пустым каталогом данных. Если база уже создана, повторное восстановление не будет выполнено.

Внимание: Если при первом запуске контейнер завершился сбоем, но каталог данных уже был инициализирован, PostgreSQL не запустит повторное восстановление. В таком случае удалите каталог данных (pgdata), но убедитесь, что там нет важных данных!

Запуск контейнера

После настройки .env и docker-compose.yml выполните загрузку образа и запуск сервисов:

Загрузка образа

docker compose pull

Запуск сервисов

docker compose up -d

Просмотр логов

docker compose logs -f

Восстановление базы данных из дампа

База данных d10task создается пустой. Для работы приложения Первая Форма ее необходимо восстановить из дампа.

Шаг 1: Получение дампа

Запросите актуальный дамп у сотрудников компании "Первая Форма" (техническое сопровождение или отдел DevOps). Скопируйте дамп на сервер.

Шаг 2: Размещение дампа

Добавьте файл дампа в директорию, которая подключена в /backups через volume:

cp /path/to/d10task.dump ./pgdata/backups/

Шаг 3: Создание баз данных

Подключитесь к контейнеру:

docker exec -it PG18 /bin/bash

psql -U postgres -d postgres

Создайте базы данных d10task и d10task_file:

CREATE DATABASE d10task

   TEMPLATE template0

   OWNER dbo

   ENCODING 'utf8'

   LC_COLLATE 'ru_RU.utf8'

   LC_CTYPE 'ru_RU.utf8';
CREATE DATABASE d10task_file

   TEMPLATE template0

   OWNER dbo

   ENCODING 'utf8'

   LC_COLLATE 'ru_RU.utf8'

   LC_CTYPE 'ru_RU.utf8';

\q

Шаг 4: Создание схемы в базе d10task_file

psql -U postgres -d d10task_file

CREATE SCHEMA IF NOT EXISTS dbo AUTHORIZATION dbo;

CREATE TABLE dbo.UploadFiles
(

   id INT NOT NULL GENERATED BY DEFAULT AS IDENTITY,

   FileContent BYTEA,

   Ext VARCHAR,

   UserID INT,

   FileName VARCHAR,

   Compressed BOOL CONSTRAINT DF_UploadFiles_Compressed DEFAULT FALSE,

   CONSTRAINT PK_UploadFiles PRIMARY KEY (id)

);
alter user d10taskuser set search_path = "dbo";

grant select, insert, update, delete, truncate on all tables in schema dbo to d10taskuser;

grant usage, select on all sequences in schema dbo to d10taskuser;

grant execute on all functions in schema dbo to d10taskuser;

alter default privileges in schema dbo grant select, insert, update, delete, truncate on tables to d10taskuser;

alter default privileges in schema dbo grant usage, select on sequences to d10taskuser;

alter default privileges in schema dbo grant execute on functions to d10taskuser;

alter default privileges in schema dbo grant usage on types to d10taskuser;

grant usage on schema dbo to d10taskuser;

\q

Шаг 5: Активация расширений в базе d10task

psql -U postgres -d d10task

-- Загрузка pg_hint_plan

LOAD 'pg_hint_plan';

-- Создание расширений

CREATE EXTENSION IF NOT EXISTS plpgsql SCHEMA pg_catalog;

CREATE EXTENSION IF NOT EXISTS rum SCHEMA public;

CREATE EXTENSION IF NOT EXISTS pgcrypto SCHEMA public;

CREATE EXTENSION IF NOT EXISTS pg_buffercache SCHEMA public;

CREATE EXTENSION IF NOT EXISTS btree_gin SCHEMA public;

CREATE EXTENSION IF NOT EXISTS pg_stat_statements SCHEMA public;

CREATE EXTENSION IF NOT EXISTS pg_trgm SCHEMA public;

CREATE EXTENSION IF NOT EXISTS pg_qualstats SCHEMA public;

CREATE EXTENSION IF NOT EXISTS vector SCHEMA public;

CREATE EXTENSION IF NOT EXISTS pg_background SCHEMA public;

\q

Шаг 6: Восстановление из дампа

Выполните restore внутри контейнера:

pg_restore -U dbo -d d10task -v /backups/d10task.dump

Шаг 7: Создание ролей и назначение прав

После успешного восстановления выполните настройку прав.

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

psql -U postgres -d d10task

alter role D10TaskUser set search_path = "dbo", "public";

alter role dbo set search_path = "dbo", "public";

alter user MigrationsDaemon set search_path = "dbo", "public";

alter user rebus set search_path = "rebus", "public";

grant usage on schema dbo to d10taskuser;

grant dbo, rebus to MigrationsDaemon;

grant all on all tables in schema dbo, sys to dbo, MigrationsDaemon;

grant all on all sequences in schema dbo, sys to dbo, MigrationsDaemon;

grant all on all functions in schema dbo, sys to dbo, MigrationsDaemon;

grant all on schema dbo, sys to dbo, MigrationsDaemon;

alter default privileges in schema dbo, sys, SignalR grant all on tables to dbo, MigrationsDaemon;

alter default privileges in schema dbo, sys, SignalR grant all on sequences to dbo, MigrationsDaemon;

alter default privileges in schema dbo, sys, SignalR grant all on functions to dbo, MigrationsDaemon;

alter default privileges in schema dbo, sys, SignalR grant all on types to dbo, MigrationsDaemon;

grant usage on schema dbo, sys, SignalR to role_D10TaskReader;

grant select on all tables in schema dbo, sys, SignalR to role_D10TaskReader;

grant usage, select on all sequences in schema dbo, sys, SignalR to role_D10TaskReader;

grant execute on all functions in schema dbo, sys, SignalR to role_D10TaskReader;

alter default privileges in schema dbo, sys, SignalR  grant select  on tables to role_D10TaskReader;

alter default privileges in schema dbo, sys, SignalR  grant execute on functions to role_D10TaskReader;

alter default privileges in schema dbo, sys, SignalR  grant usage, select on sequences to role_D10TaskReader;

grant all on all tables in schema custom to role_D10TaskReader;

grant all on all sequences in schema custom to role_D10TaskReader;

grant all on all functions in schema custom to role_D10TaskReader;

alter default privileges in schema custom grant all on tables to role_D10TaskReader;

alter default privileges in schema custom grant all on sequences to role_D10TaskReader;

alter default privileges in schema custom grant all on functions to role_D10TaskReader;

alter default privileges in schema custom grant all on types to role_D10TaskReader;

grant all on schema custom to role_D10TaskReader;

grant all on all tables in schema rebus to role_D10TaskReader;

grant all on all sequences in schema rebus to role_D10TaskReader;

grant all on all functions in schema rebus to role_D10TaskReader;

alter default privileges in schema rebus grant all on tables to role_D10TaskReader;

alter default privileges in schema rebus grant all on sequences to role_D10TaskReader;

alter default privileges in schema rebus grant all on functions to role_D10TaskReader;

alter default privileges in schema rebus grant all on types to role_D10TaskReader;

grant all on schema rebus to role_D10TaskReader;

grant usage on language plpgsql, sql to role_D10TaskReader;

GRANT USAGE ON SCHEMA dbadmin TO d10taskuser;

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA dbadmin TO d10taskuser;

GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA dbadmin TO d10taskuser;

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA dbadmin TO d10taskuser;

GRANT EXECUTE ON FUNCTION pg_background_launch(text, int4) TO dbo;

GRANT EXECUTE ON FUNCTION pg_background_result(int4) TO dbo;

GRANT EXECUTE ON FUNCTION pg_background_detach(int4) TO dbo;

\q

Проверка работоспособности

После завершения настройки выполните проверку:

psql -U postgres -d d10task -c "SELECT version();"

psql -U postgres -d d10task -c "\dx"

psql -U postgres -d d10task -c "SHOW io_method;"

Ожидаемые результаты:

Версия PostgreSQL 18.x

Список установленных расширений:

io_method = io_uring

Настройка завершена. Сервер PostgreSQL 18 запущен в Docker и готов к работе с приложением "Первая Форма".