Перейти к содержимому

Начало работы с Docker Compose

Репозиторий поставляет стек Compose в deploy/compose/: укреплённое одноузловое развёртывание (встроенный SQLite, ноль внешних зависимостей) плюс два наложения — override для мультиарендного Postgres и профиль резервного копирования для аварийного восстановления. Этот туториал проведёт вас от up -d до настроенного control plane с резервными копиями.

Контейнер оборачивает тот же единый бинарник, что и любая другая установка; различается лишь упаковка. Команды ниже — это собственные задокументированные точки входа стека (deploy/compose/*.yml), а поток первого запуска, который они приводят в действие, — тот же, что проверен от начала до конца против бинарника в туториале по одному узлу.

  1. Запустите его:

    Если AppArmor контролирует создание пользовательских пространств имён, перед запуском выполните инструкции «Session confinement on AppArmor hosts» из deploy/compose/README.md на хосте демона Docker.

    Окно терминала
    docker compose -f deploy/compose/docker-compose.yml up --wait --wait-timeout 120

    Что вы получаете по проектированию:

    Свойство Значение
    Порты 8443 (HTTPS: REST + веб-UI), 8444 (gRPC) — опубликованы на всех интерфейсах хоста, потому что это сервер. Задайте OLIVARES_BIND=127.0.0.1 в .env, чтобы ограничить их хостом
    Данные именованный том olivares-data → /var/lib/olivares (хранилище SQLite, ключ подписи аудита, материал TLS)
    Укрепление работает как 65532:65532, read-only root, все capabilities сброшены, no-new-privileges, tmpfs /tmp
    Healthcheck прямой запуск встроенной команды olivares readyz — без shell, curl и wget. Здоровым считается только HTTP 200 локального /readyz
  2. Спросите у движка, где он, и прочитайте одноразовый setup-токен из логов:

    Окно терминала
    # where the console answers, and whether setup is still pending. It runs the binary
    # directly and needs no shell.
    docker compose -f deploy/compose/docker-compose.yml exec olivares olivares first-boot
    # the one-time setup token, printed once at first boot
    docker compose -f deploy/compose/docker-compose.yml logs olivares \
    | sed -n '/FIRST-BOOT SETUP/,/========================/p'
  3. Создайте первого администратора, войдите в систему и создайте свою организацию — ровно так, как в туториале по одному узлу (API тот же; сертификат TLS самоподписан при первом запуске, поэтому используйте curl -k для бутстрапа):

    Окно терминала
    curl -ksf -X POST https://localhost:8443/v1/setup \
    -H 'Content-Type: application/json' \
    -d '{"token":"<olst_ token>","email":"you@example.com","password":"<strong-password>"}'

Источники объявляются в одном файле оператора, именованном через OLIVARES_SOURCES_CONFIG (подключите источник). Для контейнера смонтируйте файл и задайте переменную небольшим override:

# deploy/compose/docker-compose.sources.yml (yours — not shipped)
services:
olivares:
environment:
OLIVARES_SOURCES_CONFIG: /etc/olivares/sources.json
volumes:
- ./sources.json:/etc/olivares/sources.json:ro
Окно терминала
docker compose -f deploy/compose/docker-compose.yml \
-f deploy/compose/docker-compose.sources.yml up -d
docker compose -f deploy/compose/docker-compose.yml logs olivares | grep "ingest: wired source"

Помните, что пути внутри sources.json — это пути контейнера; например, «хвост» журнала pgAudit требует, чтобы каталог журналов Postgres был также смонтирован в контейнер только для чтения.

3. Зашифрованные DR-резервные копии (профиль backup)

Заголовок раздела «3. Зашифрованные DR-резервные копии (профиль backup)»

Стек поставляет одноразовый сервис резервного копирования, который создаёт зашифрованный, безопасный для непрерывности ledger bundle (olivares dr backup):

Храните парольную фразу в закрытом файле вне репозитория и образа, а её копию — в безопасном месте вне этого хоста: без неё нельзя восстановить ни один бандл. Предоставьте контейнеру резервного копирования доступ к файлу только для чтения (образ запускается с UID 65532):

Окно терминала
sudo install -d -o 65532 -g 65532 -m 0700 /srv/olivares-dr
sudo install -o 65532 -g 65532 -m 0400 /path/to/private-passphrase /srv/olivares-dr/dr-pass
BACKUP_TS="$(date -u +%Y%m%dT%H%M%SZ)" \
docker compose -f deploy/compose/docker-compose.yml \
-f deploy/compose/docker-compose.backup.yml \
-f - --profile backup run --rm backup <<'YAML'
services:
backup:
volumes:
- /srv/olivares-dr/dr-pass:/run/secrets/dr-pass:ro
YAML

Оберните эту команду в host cron для запланированного RPO и зеркалируйте том olivares-backups на офсайт — резервная копия на том же хосте не является аварийным восстановлением, а парольная фраза должна перемещаться отдельно от bundle-ов (3-2-1). Полная процедура, включая учения по восстановлению (olivares dr verify), описана в резервном копировании и восстановлении.

4. Опционально: override для мультиарендного Postgres

Заголовок раздела «4. Опционально: override для мультиарендного Postgres»

Для мультиарендной топологии наложите override для Postgres. Он поднимает Postgres 16, предоставляет роль наименьших привилегий olivares_app (без superuser, без BYPASSRLS — движок отказывается запускаться против привилегированной роли, потому что row-level security — это подстраховка арендности) и направляет на неё движок:

Override также создаёт olivares_admin, отдельную роль NOSUPERUSER BYPASSRLS с доступом только для чтения к таблицам движка. Движок использует её через --admin-dsn для чтения данных разных арендаторов, в том числе при первичной настройке.

Сначала задайте три разных пароля, используя только A-Z a-z 0-9 . _ ~ - для этой демо-топологии Compose, затем поднимите стек:

Окно терминала
cp deploy/compose/.env.example deploy/compose/.env
# set three distinct passwords in deploy/compose/.env:
# POSTGRES_SUPERUSER_PASSWORD, OLIVARES_DB_PASSWORD, OLIVARES_ADMIN_PASSWORD
docker compose -f deploy/compose/docker-compose.yml \
-f deploy/compose/docker-compose.postgres.yml up -d
Окно терминала
curl -ks https://localhost:8443/readyz
# {"leader":true,"setup_required":false,"status":"ok","store":"up"}
curl -ks https://localhost:8443/metrics | grep olivares_store_up