Перейти до змісту

07. PostgreSQL — мозок, який пам’ятає, де лежать файли

Work in progress

«Хто з вас жодного разу не поклав базу даних у продакшені, нехай першим кине камінь у сисадміна».

— За мотивами Євангелія від Івана, 8:7

Уявіть спільний диск із тисячами відеофайлів. Дані зберігаються в S3, але звідки StudioFS знає, які файли є на диску, як називаються папки та що змінили ваші колеги?

Для цього потрібен PostgreSQL — база спільних метаданих StudioFS. Налаштуємо її без зайвої серверної магії.

Навіщо StudioFS PostgreSQL?

У системі три основні складники:

  • S3 зберігає вміст файлів.
  • PostgreSQL координує спільну структуру диска та зміни між клієнтами.
  • Локальна база й кеш на кожному комп’ютері допомагають працювати з файлами без постійного звернення до сервера.

PostgreSQL — не файлове сховище й не посередник для кожного читання відео. Клієнти StudioFS працюють із локальними метаданими, а спільні зміни синхронізують у фоновому режимі.

Тому пам’ятайте: файл, збережений на одному комп’ютері, не обов’язково вже доступний на іншому. Для цього потрібні завантаження даних у S3 та синхронізація метаданих.

PostgreSQL також зберігає службові дані та ключовий матеріал тому. Отже, втрачати його так само небажано, як і самі файли. До резервного копіювання повернемося окремо.

Де розмістити PostgreSQL?

Найпростіші варіанти — власний VPS або керований PostgreSQL у хмарі.

На VPS ви контролюєте конфігурацію, доступ і резервні копії. У managed-сервісі частину обслуговування бере на себе провайдер, але потрібно перевірити доступ до службової бази postgres і право створювати об’єкти у базі studiofs. Поточна команда studiofs init працює саме з цими назвами.

Далі розглянемо просте розгортання на VPS через Docker Compose. Для невеликого проєкту або тестового середовища цього достатньо, щоб почати.

Практика: PostgreSQL 18 через Docker Compose

Нам потрібні Ubuntu Server (або інший Linux-сервер), доступ через SSH та встановлені Docker Engine і Docker Compose. Якщо Docker ще немає, скористайтеся офіційною інструкцією для Ubuntu. Встановлення Docker тут не розглядаємо.

Створіть каталог для PostgreSQL:

mkdir -p ~/studiofs-postgres/pgdata
cd ~/studiofs-postgres

У ньому створіть файл compose.yaml:

services:
  postgres:
    image: postgres:18-alpine
    container_name: studiofs-pg-test
    restart: unless-stopped

    environment:
      POSTGRES_DB: studiofs
      POSTGRES_USER: studiofs
      POSTGRES_PASSWORD: studiofs
      PGDATA: /var/lib/postgresql/data

    ports:
      - "5432:5432"

    volumes:
      - type: bind
        source: ./pgdata
        target: /var/lib/postgresql/data

    command: >
      postgres
        -c shared_buffers=3GB
        -c effective_cache_size=8GB
        -c work_mem=16MB
        -c maintenance_work_mem=512MB
        -c max_connections=40
        -c superuser_reserved_connections=3
        -c synchronous_commit=on
        -c wal_buffers=16MB
        -c checkpoint_completion_target=0.9
        -c checkpoint_timeout=15min
        -c max_wal_size=4GB
        -c min_wal_size=1GB
        -c random_page_cost=1.1
        -c effective_io_concurrency=200
        -c default_statistics_target=100
        -c max_worker_processes=4
        -c max_parallel_workers_per_gather=1
        -c max_parallel_workers=2
        -c max_parallel_maintenance_workers=1
        -c huge_pages=try
        -c tcp_keepalives_idle=60
        -c tcp_keepalives_interval=10
        -c tcp_keepalives_count=6
        -c idle_in_transaction_session_timeout=120000
        -c statement_timeout=60000
        -c jit=off
        -c log_min_duration_statement=1000
        -c log_checkpoints=on
        -c log_lock_waits=on

    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U studiofs -d studiofs"]
      interval: 10s
      timeout: 5s
      retries: 5

Docker автоматично вибере відповідний варіант образу postgres:18-alpine для архітектури сервера — наприклад, ARM64 або x86-64. Нічого окремо вказувати не потрібно. Наведена конфігурація розрахована на сервер із достатнім запасом оперативної пам’яті. Якщо ваш VPS має менш ніж 8 ГБ RAM, зменште насамперед shared_buffers та maintenance_work_mem. Інші параметри також можна адаптувати до свого навантаження.

Образ postgres:18-alpine — компактний варіант PostgreSQL 18. На першому запуску він автоматично створить базу studiofs та користувача studiofs з паролем, указаним у Compose. Зверніть увагу: користувач, створений через POSTGRES_USER, має права суперкористувача PostgreSQL. У прикладі пароль studiofs наведено лише для простоти; для реального розгортання замініть його.

Значення POSTGRES_USER, POSTGRES_PASSWORD і POSTGRES_DB застосовуються лише під час першої ініціалізації порожньої бази. Їх зміна у Compose не змінює вже створених користувачів чи баз даних.

Що з папкою pgdata?

Це звичайний каталог поруч із compose.yaml, у якому зберігатимуться всі дані PostgreSQL. Оскільки ми явно вказали PGDATA, bind mount спрямований саме в цей каталог, хоча типовий шлях даних в офіційному образі PostgreSQL 18 інший. Така схема придатна для нашого простого прикладу; перед оновленням на наступну основну версію PostgreSQL потрібно окремо спланувати перенесення даних.

Зазвичай Docker сам налаштовує права під час першого запуску. Для Alpine-образу PostgreSQL процес бази працює від користувача з UID/GID 70:70. Якщо в журналі з’являється Permission denied для pgdata, на звичайному Linux-сервері з Docker Engine можна зупинити контейнер і виправити власника:

docker compose down
sudo chown -R 70:70 ./pgdata

Після цього повторіть запуск. Не потрібно відкривати каталог для всіх через chmod 777.

Запускаємо й перевіряємо

docker compose up -d
docker compose ps

Дочекайтеся, поки контейнер отримає статус healthy. Якщо контейнер не стартує, перегляньте журнал:

docker compose logs --tail=50 postgres

Перевіримо, що потрібна база доступна і пароль працює при підключенні через мережу Docker:

docker compose run --rm --no-deps postgres \
  psql -h postgres -U studiofs -d studiofs -W \
  -c "SELECT current_database(), current_user;"

Після запиту введіть пароль користувача studiofs. У відповіді обидва значення мають бути studiofs.

І ще одна перевірка — доступ до службової бази, яку використовує поточний studiofs init:

docker compose run --rm --no-deps postgres \
  psql -h postgres -U studiofs -d postgres -W \
  -c "SELECT 1;"

Очікуємо 1. Це перевірки в мережі Docker; підключення з робочого комп’ютера перевіримо після налаштування VPN.

Для зупинки контейнера використовуйте docker compose down, для повторного запуску — docker compose up -d. Дані залишаються в ./pgdata.

Не видаляйте папку pgdata! У ній зберігаються метадані всієї файлової системи. Без резервної копії відновити роботу тому StudioFS може бути неможливо.

Як StudioFS підключатиметься до бази?

Для підключення використовується DSN — рядок з адресою сервера, користувачем, паролем і назвою бази:

postgresql://studiofs:studiofs@VPN_SERVER_ADDRESS:5432/studiofs

Замість VPN_SERVER_ADDRESS буде приватна IP-адреса сервера в Tailscale або NetBird.

Для цього прикладу ми використовуємо VPN як приватний транспорт. Проте Tailscale сам по собі не закриває публічний порт: запис 5432:5432 публікує його на всіх інтерфейсах Docker-хоста. Тому переконайтеся, що порт 5432 закритий для публічного інтернету правилами firewall VPS. Налаштування доступу через VPN — тема наступної глави.


Зміст · English · ← Попередня · Наступна →