MAATRIX / Блог / Garage на Ubuntu 24.04: пошаговая установка

Garage на Ubuntu 24.04: пошаговая установка

MAATRIX

Если вам нужно S3-совместимое хранилище на нескольких серверах в разных дата-центрах, а MinIO кажется тяжеловесным и всё сложнее лицензируется для self-host-сценариев — есть более скромный вариант. Garage — это распределённое объектное хранилище от французской ассоциации Deuxfleurs, написанное на Rust специально для геораспределённых кластеров на слабом железе. Ниже — пошаговая установка на Ubuntu 24.04: от systemd-юнита до первого bucket и рабочего S3 API.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Garage и чем он отличается от MinIO

Garage изначально проектировался не для одного мощного сервера в одной стойке, а для кластера из недорогих узлов, разбросанных по разным сетям и даже странам — именно такой сценарий у большинства арендованных VPS в разных локациях. Отсюда несколько практических следствий:

  • Нет единой точки отказа на уровне метаданных. Garage использует консистентный протокол на основе CRDT и таблиц, реплицируемых между узлами, без выделенного мастера.
  • Терпимо относится к сети. Узлы могут быть за NAT, с разной задержкой между собой, с непостоянным аптаймом — кластер продолжает отдавать данные, если жив кворум реплик.
  • Меньше потребление ресурсов. Бинарник Garage — это один статический файл на Rust без JVM и без тяжёлого веб-интерфейса по умолчанию; на небольших кластерах это заметно легче, чем полноценный MinIO с его consul-подобной топологией и требованиями к дисковой подсистеме.
  • Лицензия AGPLv3 без сюрпризов. MinIO в последние годы урезал часть функциональности community-версии и клиента mc; у Garage лицензионная модель проще и стабильнее для небольших проектов.

Расплата за это — Garage не претендует на полную совместимость с S3 API: часть продвинутых фич (object lock, некоторые виды versioning-политик, сложные lifecycle-правила) либо отсутствует, либо реализована частично. Для базового сценария — хранение бэкапов, статики, объектов приложения через boto3/aws-cli/rclone — этого более чем достаточно.

Если вам нужна максимальная совместимость с экосистемой AWS S3 и вы готовы платить ресурсами за более тяжёлый процесс — посмотрите в сторону MinIO или сравнение MinIO и альтернатив. Если задача — именно геораспределённый кластер на нескольких недорогих узлах, Garage чаще будет более разумным выбором.

Требования и подготовка Ubuntu 24.04

Минимально Garage запускается и на 1 CPU / 1 GB RAM, но для продакшена с реальной нагрузкой закладывайте от 2 GB RAM на узел и SSD-диск — метаданные хранятся в LMDB, и производительность диска напрямую влияет на скорость операций со списками объектов.

Обновите систему и поставьте базовые утилиты:

apt update && apt upgrade -y
apt install -y curl wget ca-certificates gnupg

Создайте отдельного системного пользователя — Garage не должен работать от root:

useradd --system --home /var/lib/garage --shell /usr/sbin/nologin garage
mkdir -p /var/lib/garage/meta /var/lib/garage/data
chown -R garage:garage /var/lib/garage

Если планируете кластер из нескольких серверов в разных локациях (например, RU + US + UK), заранее выберите, как узлы будут видеть друг друга: через публичные IP с открытым портом RPC или через приватный туннель (WireGuard). Второй вариант безопаснее — вы не открываете внутренний протокол кластера в интернет.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка Garage как systemd-сервиса

Garage распространяется в виде одного статического бинарника. Скачайте актуальный релиз с официальной страницы garagehq.deuxfleurs.fr (на момент публикации — ветка 1.x; проверьте конкретный номер версии на сайте перед установкой, потому что проект активно обновляется):

GARAGE_VERSION="v1.0.1"
wget -O /usr/local/bin/garage \
  "https://garagehq.deuxfleurs.fr/_releases/${GARAGE_VERSION}/x86_64-unknown-linux-musl/garage"
chmod +x /usr/local/bin/garage
garage --version

Если вы предпочитаете Docker, у Garage есть официальный образ (dxflrs/garage) — но для геораспределённого кластера на разных VPS systemd-сервис проще диагностировать и перезапускать без лишней прослойки. Если всё же хотите контейнер — общий процесс развёртывания через Docker Compose описан в статье про установку Docker с нуля на Ubuntu 24.04.

Создайте unit-файл /etc/systemd/system/garage.service:

[Unit]
Description=Garage S3-compatible object storage
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=garage
Group=garage
Environment='RUST_LOG=garage=info'
ExecStart=/usr/local/bin/garage server -c /etc/garage.toml
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

Пока не запускайте сервис — сначала нужен конфиг.

Настройка garage.toml: узел, репликация, RPC

Сгенерируйте секрет для RPC-протокола между узлами кластера — этот же секрет должен быть одинаковым на всех серверах кластера:

openssl rand -hex 32

Создайте /etc/garage.toml:

metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "lmdb"

replication_factor = 3

rpc_bind_addr = "[::]:3901"
rpc_public_addr = "203.0.113.10:3901"   # публичный IP или адрес WireGuard этого узла
rpc_secret = "вставьте_сгенерированный_hex_секрет"

[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
root_domain = ".s3.example.com"

[s3_web]
bind_addr = "[::]:3902"
root_domain = ".web.example.com"
index = "index.html"

[admin]
api_bind_addr = "127.0.0.1:3903"
admin_token = "вставьте_ещё_один_hex_секрет"

Ключевые параметры:

  • replication_factor — сколько копий каждого объекта хранит кластер. Для геораспределённого сценария разумный минимум — 3 (переживает потерю одного узла или целой локации). Для тестового single-node запуска можно временно поставить 1.
  • rpc_public_addr — адрес, по которому этот узел доступен другим узлам кластера. Если серверы связаны через WireGuard-туннель, указывайте здесь именно IP из туннеля, а не публичный интернет-адрес.
  • root_domain в [s3_api] включает виртуальный хостинг бакетов вида bucket.s3.example.com — если он вам не нужен, можно опустить и работать только по path-style URL.

Скопируйте этот файл (с одинаковым rpc_secret, но своим rpc_public_addr) на каждый узел кластера, затем запустите сервис:

chown garage:garage /etc/garage.toml
chmod 600 /etc/garage.toml
systemctl daemon-reload
systemctl enable --now garage
systemctl status garage

Инициализация кластера и layout

Даже одиночный узел Garage требует явной инициализации топологии (layout) — это осознанное решение авторов, чтобы избежать случайной потери данных при добавлении узлов. Убедитесь, что бинарник garage в PATH, и посмотрите ID текущего узла:

garage status

Вы увидите ID узла вида a1b2c3d4... в статусе "HEALTHY NODES" без назначенной роли. Присвойте узлу зону (условное название дата-центра/локации) и объём диска, который он готов отдать под данные:

garage layout assign -z ru-msk -c 100G a1b2c3d4
garage layout apply --version 1

Для геораспределённого кластера из трёх узлов (например, RU, US, UK) на каждом сервере запустите garage node id, чтобы получить его идентификатор с адресом, и подключите узлы друг к другу:

# на первом узле
garage node connect <id_узла_2>@<ip_узла_2>:3901
garage node connect <id_узла_3>@<ip_узла_3>:3901

# затем назначьте зоны и ёмкость всем трём узлам одной командой
garage layout assign -z ru-msk -c 100G <id_узла_1>
garage layout assign -z us-east -c 100G <id_узла_2>
garage layout assign -z uk-lon -c 100G <id_узла_3>
garage layout apply --version 2

Разные зоны для узлов в разных локациях — не формальность: Garage старается размещать реплики одного объекта в разных зонах, а не просто на разных узлах. При replication_factor = 3 и трёх зонах вы получаете по одной копии каждого объекта в каждой локации — кластер переживёт полное падение одного дата-центра.

Проверить итоговую топологию:

garage layout show
garage status

Bucket, ключи доступа и работа через S3 API

Создайте bucket и ключ доступа:

garage bucket create mybucket
garage key create app-key
garage bucket allow --read --write --owner mybucket --key app-key
garage key info app-key

Команда garage key info выведет Key ID и Secret key — сохраните их сразу, secret второй раз получить нельзя (только пересоздать ключ).

Дальше с этим bucket можно работать как с обычным S3-совместимым хранилищем. Через mc (клиент MinIO, он же используется для Garage):

mc alias set garage http://127.0.0.1:3900 <Key ID> <Secret key> --api S3v4
mc ls garage/mybucket
mc cp ./backup.tar.zst garage/mybucket/

Через rclone (конфиг ~/.config/rclone/rclone.conf):

[garage]
type = s3
provider = Other
access_key_id = <Key ID>
secret_access_key = <Secret key>
endpoint = http://127.0.0.1:3900
region = garage

Если вы уже используете rclone для бэкапов, процесс настройки провайдера подробно разобран в статье про rclone на Ubuntu 24.04.

Для внешнего доступа по HTTPS поставьте перед узлом с S3 API обратный прокси с автоматическим TLS — например, Caddy — и закройте порт 3901 (RPC) файрволом, оставив снаружи только 3900/443. Как поднять терминирование TLS, описано в статье про Caddy с авто-SSL, а базовые правила файрвола — в статье про настройку UFW. Минимальный набор правил для узла кластера:

ufw allow 3900/tcp   # S3 API (или закройте и пускайте только через reverse proxy)
ufw allow 3901/tcp   # RPC между узлами — открывайте только для IP других узлов кластера
ufw deny 3903/tcp    # admin API — держите только на localhost

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Чем Garage принципиально отличается от MinIO по архитектуре?

MinIO строился вокруг идеи erasure coding на дисках одного логического пула с низкой задержкой между узлами. Garage изначально рассчитан на узлы с разной, иногда высокой задержкой между собой и на неполную доступность отдельных узлов — это классический geo-distributed дизайн, а не кластер в одной серверной.

Можно ли начать с одного узла и потом добавить ещё?

Да, это штатный сценарий. Запустите с replication_factor = 1 на одном узле, а когда добавите второй и третий сервер — смените replication_factor на 3 в конфиге на всех узлах, перезапустите сервисы и заново примените layout командой garage layout apply. Учтите: смена replication_factor требует остановки операций записи на время миграции данных на реальных объёмах.

Совместим ли Garage с aws-cli и SDK для S3?

Да, для базовых операций (PUT/GET/DELETE/LIST, multipart upload, presigned URL) совместимость рабочая. Часть продвинутых возможностей S3 (object lock, некоторые lifecycle-политики, SSE-KMS) не реализована — проверяйте конкретную нужную вам фичу в документации перед миграцией продакшена.

Что будет, если один из трёх геораспределённых узлов надолго отключится?

При replication_factor = 3 кластер продолжит отдавать и принимать данные с оставшимися узлами, пока жив кворум. После возвращения узла в строй Garage синхронизирует недостающие данные автоматически — но чем дольше узел отсутствовал, тем дольше идёт ресинхронизация, и в это время растёт нагрузка на сеть между локациями.

Нужен ли отдельный load balancer перед S3 API?

Для равномерного распределения запросов между узлами — да, полезен (DNS round-robin, HAProxy или Caddy с несколькими upstream). Сам Garage не балансирует входящие S3-запросы между узлами кластера — каждый узел отвечает только за свою часть данных согласно layout, но проксирует запрос к нужной реплике внутри кластера прозрачно для клиента.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →