# Запуск PostgreSQL 18 в Docker

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

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

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

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

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

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

```bash
docker login docker.1forma.ru
```

## Запуск PostgreSQL в Docker Compose

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

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

```bash
sudo mkdir -p /opt/postgres
cd /opt/postgres
```

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

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

```yaml
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 default_text_search_config='pg_catalog.russian'

     -c timezone='Europe/Moscow'

     -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 для хранения переменных окружения:

```bash
touch .env
```

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

```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 выполните загрузку образа и запуск сервисов:

```bash
# Загрузка образа
docker compose pull

# Запуск сервисов
docker compose up -d

# Просмотр логов
docker compose logs -f
```

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

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

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

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

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

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

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

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

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

```bash
docker exec -it PG18 /bin/bash
psql -U postgres -d postgres
```

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

```sql
CREATE DATABASE d10task

   TEMPLATE template0

   OWNER dbo

   ENCODING 'utf8'

   LC_COLLATE 'ru_RU.utf8'

   LC_CTYPE 'ru_RU.utf8';
```

```sql
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

```sql
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)

);
```


```sql
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

```sql
-- Загрузка 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

```sql
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 и готов к работе с приложением "Первая Форма".
