Garage - S3 kompatibel objektlagring Snabbstart

Kör Garage i Docker på bara några minuter

Sidinnehåll

Garage är en öppen källkod, självvärdbaserad, S3-kompatibel objektlagringssystem som är utformad för små till medelstora distributioner, med ett starkt fokus på återhämtning och geografisk spridning.

Den här snabbstarten leder dig från en kopierings/klistra enkelservrarinstallation till produktionsinriktade mönster: klusterlayout, replikering, TLS via omvänd proxy, flerdiskslagringssystem, övervakning, reparationer och säkerhetskopiering/återställning.

För det bredare perspektivet – objektlagring, PostgreSQL, Elasticsearch och AI-nativ datalager – se artikeln Data Infrastructure for AI Systems.

Garage Boxes

Vad Garage är

Garage är en S3-kompatibel distribuerad objektlagring som är avsedd för självvärd, med syftet att förbli lättviktig och enkel att driva medan den stöder flersidiga/geo-distribuerade kluster.
Den släpps ut under AGPL v3 licensen.

Nyckelidéer som formar hur du kör den:

Garage mäter nodkapacitet och fysisk plats (“zoner”) för att placera replikationer; ändringar i klustertopologi (lägg till/ta bort noder) hanteras genom versionerade layouter och omfördelning.
Objekt delas upp i fasta storleksblock (block_size), vilket möjliggör deduplivering och valfri Zstandardkomprimering; blockhashar används för placering och deduplering.
Garage avslutar inte TLS på dess S3 API/webbändpunkter: du förväntas distribuera en omvänd proxy för HTTPS i verkliga distributioner.

Arkitektur och dataflöde

På ett högre plan interagerar du med Garage genom S3-kompatibla klienter; trafiken kommer vanligtvis via en omvänd proxy (TLS), nås en eller flera Garage API-ändpunkter (ofta “gateway”-noder) och serveras sedan av lagringsnoder som håller replikerade datablock.

garage- cluster data flow

Noder har roller: lagringsnoder med kapacitet mot gateway-noder som exponerar slutpunkter utan att lagra data; gateways minskar latens genom att undvika extra nätverkssteg och genom att “veta” vilka lagringsnoder som ska frågas.
Replikering styrs via replication_factor (t.ex. 3-vegs replikering över zoner), med tydliga tillgänglighets/felhanteringsväxlingar som beskrivs i konfigurationsreferensen.

Kopierings/klistra snabbstart

Detta är avsiktligt minimal enkelservrardistribution för att lära sig arbetsflöden: konfiguration → starta server → definiera layout → skapa bucket + nyckel → ladda upp ett objekt.

Förutsättningar

Du behöver docker, openssl och (valfritt) en S3-klient som awscli. Garage CLI är samma binär som används för att hantera klustret.

Steg för steg

# 0) Arbetsområde
mkdir -p ~/garage-quickstart/{config,meta,data}
cd ~/garage-quickstart

# 1) Skapa en starterkonfiguration (pålitliga sökvägar inuti behållaren)
cat > ./config/garage.toml <<EOF
metadata_dir = "/var/lib/garage/meta"
data_dir     = "/var/lib/garage/data"
db_engine = "sqlite"

# Enkelservrar lärande distribution (INGEN redundans). För produktion, se senare.
replication_factor = 1

rpc_bind_addr   = "[::]:3901"
rpc_public_addr = "127.0.0.1:3901"
rpc_secret      = "$(openssl rand -hex 32)"

[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
# Valfri vhost-stil. Path-stil är alltid aktiverad.
root_domain = ".s3.garage.localhost"

[s3_web]
bind_addr = "[::]:3902"
root_domain = ".web.garage.localhost"
index = "index.html"

[admin]
api_bind_addr = "[::]:3903"
admin_token   = "$(openssl rand -base64 32)"
metrics_token = "$(openssl rand -base64 32)"
EOF

# 2) Välj en bildtag (tillfällig). Exempeltaggar visas i Garage-dokumentationen.
GARAGE_IMAGE="dxflrs/garage:TAG_PLACEHOLDER"

# 3) Kör Garage (Docker)
docker run -d --name garaged \
  -p 3900:3900 -p 3901:3901 -p 3902:3902 -p 3903:3903 \
  -v "$PWD/config/garage.toml:/etc/garage.toml:ro" \
  -v "$PWD/meta:/var/lib/garage/meta" \
  -v "$PWD/data:/var/lib/garage/data" \
  "$GARAGE_IMAGE"

# 4) Använd garage CLI inuti behållaren
alias garage='docker exec -ti garaged /garage'

# 5) Kontrollera nodstatus (du kommer troligen se "NO ROLE ASSIGNED")
garage status

# 6) Tilldela en layout (enkel nod) och tillämpa den
NODE_ID="$(garage status | awk '/NO ROLE ASSIGNED/{print $1; exit}')"
garage layout assign -z dc1 -c 1G "$NODE_ID"
garage layout apply --version 1

# 7) Skapa en bucket + nyckel och bevilja minsta behörighet
garage bucket create example-bucket
garage key create example-app-key
garage bucket allow --read --write --owner example-bucket --key example-app-key

# 8) Visa nyckelmaterial (spara det säkert)
garage key info example-app-key

Konfigurationsmönstret (S3 API på 3900, RPC på 3901, webbändpunkt på 3902, admin API på 3903) och “layout krävs”-arbetsflödet kommer direkt från den upströms snabbstarten.

Validera med AWS CLI

Garage kräver att klienter använder den konfigurerade s3_region (ofta “garage”); om din klient använder us-east-1, kan du få AuthorizationHeaderMalformed omdirigeringar.

# Installera (en möjlighet)
python -m pip install --user awscli

# Konfigurera miljö (exempel)
export AWS_ACCESS_KEY_ID="DIN_GARAGE_NYCKEL_ID"
export AWS_SECRET_ACCESS_KEY="DIN_GARAGE_HEMLIG_NYCKEL"
export AWS_DEFAULT_REGION="garage"
export AWS_ENDPOINT_URL="http://localhost:3900"

aws s3 ls
aws s3 cp /etc/hosts s3://example-bucket/hosts.txt
aws s3 ls s3://example-bucket/
aws s3 cp s3://example-bucket/hosts.txt /tmp/hosts.txt

Den upströms snabbstarten rekommenderar att använda en ~/.awsrc-fil för att växla mellan slutpunkter/nycklar och noterar minsta AWS CLI-versioner för bekväm hantering av slutpunkter.

Installations- och distributionsalternativ

Binärinstallationer och paket

Garage-dokumentationen stöder explicit: ladda ner binärer från Garages nedladdningssida, använda distributionspaket (t.ex. apk add garage på Alpine) eller bygg från källkoden om det behövs.

Docker och Docker Compose

Garage tillhandahåller behållarbilder och dokumenterar en minimal docker run-metod för snabbstart.
För produktion använder du vanligtvis compose (eller en orchestrator) för att hantera pålitlig lagring, omvänd proxy och uppgraderingar (rollbörjande omstartar). Garages “distribution på ett kluster”-guide antar Docker på varje nod och nämner de vanliga värdvägarna och SSD-rekommendationen för metadata.

systemd

Garage dokumenterar en förstärkt systemd-deploy, inklusive varningar kring systemd:s DynamicUser= och var pålitlig tillstånd hamnar på disken.
Ett minimalt enhetsexempel (anpassa vägar till din miljö):

# /etc/systemd/system/garage.service
[Unit]
Beskrivning=Garage S3-kompatibel objektlagring
After=network.target

[Service]
ExecStart=/usr/local/bin/garage -c /etc/garage.toml server
Restart=on-failure
Environment=RUST_LOG=garage=info

[Install]
WantedBy=multi-user.target

Kubernetes och Helm

Garage levererar en Helm-karta i repo och har officiella dokumentationsidor för Kubernetes-distribution.
Ett vanligt problem är att du fortfarande måste initiera/applya ett klusterlayout efter installation (du kan automatisera det med en Kubernetes Job).

Konfiguration, säkerhet och TLS

Lagringsbakar och disklayout

Garage delar upp lagring i metadata_dir och data_dir. Konfigurationsreferensen rekommenderar att placera metadata_dir på snabb SSD för att förbättra svarsfrekvens, medan data_dir kan ligga på större HDD.
För noder med flera datadiskar stöder Garage en flerdisk data_dir-konfiguration med kapacitet per sökväg och automatisk balansering.

# Exempel: flera HDD:er för datablock
metadata_dir = "/mnt/ssd/garage-meta"
data_dir = [
  { path = "/mnt/hdd1/garage-data", capacity = "8T" },
  { path = "/mnt/hdd2/garage-data", capacity = "8T" },
]

Tillgångskontrollmodell mot S3-bucketspolicyer

Garage implementerar inte AWS-stil ACL:er eller bucketpolicyer; den använder sin egen “per access key per bucket”-behörighetsmodell som hanteras genom Garage CLI / admin API.
Detta innebär att “policy” du vanligtvis översätter till Garage är: vilken accesskey får läsa/skriva/ägare till vilka bucket(s).

# Läs-only nyckel till en bucket:
garage key create ro-key
garage bucket allow --read example-bucket --key ro-key

# Ta bort tillgång:
garage bucket deny example-bucket --key ro-key

DNS-stil vs path-stil bucketadressering

Garage kan stödja virtuell värd (DNS) stil bucketåtkomst om du konfigurerar [s3_api].root_domain; path-stil är alltid aktiverad.
Om du inte konfigurerar vhost-stil (wildcard DNS + eventuellt wildcard TLS) kan många klienter göras att fungera genom att tvinga path-stil, och Garage-dokumentationen visar klientexempel med force_path_style = true.

TLS

Garage S3 API och webbändpunkter stöder inte TLS direkt; den officiella riktlinjen är att placera en omvänd proxy framför, ofta Nginx, för att servera HTTPS och multiplexa tjänster på port 443.

Ett minimalt Nginx “form” (se den officiella omvänd proxy recept för ett fullständigt exempel):

# /etc/nginx/sites-available/garage.conf (utdrag)
upstream garage_s3 { server 127.0.0.1:3900; }

server {
  listen 443 ssl;
  server_name garage.example.com;

  ssl_certificate     /etc/letsencrypt/live/garage.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/garage.example.com/privkey.pem;

  location / {
    proxy_pass http://garage_s3;
    proxy_set_header Host $host;
  }
}

Server-sidan kryptering

Garage stöder S3 SSE-C (“server-side encryption with customer-provided keys”): klienten skickar krypteringsnycklar i rubriker per begäran; Garage krypterar på disk och kassar nyckeln efter begäran.
Garage S3 kompatibilitetslista noterar också att bucketnivå krypteringskonfigurationsändpunkter inte är implementerade, så behandla SSE-C som per-objekt/begäran beteende snarare än bucketstandard.

Driva Garage i produktion

Övervakning och loggning

Garage exponerar Prometheus-formatet mått och stöder export av spår i OpenTelemetry-format.
Admin och måttändpunkter kan skyddas med token (admin_token, metrics_token, och metrics_require_token), och spår kan exporteras via trace_sink (OTLP).
För loggning kan Garage anpassas via RUST_LOG, och konfigurationsreferensen dokumenterar miljövariabler för att skicka loggar till syslog/journald istället för stderr.

Hållbarhet, reparationer och vanliga underhållsåtgärder

Garage inkluderar bakgrunds “scrub” (integritetskontroll) och reparationstjänster; scrubs kan startas manuellt och övervakas via worker/task-kommandon, men de är diskintensiva och kan låsa upp klustret.
Topologiförändringar och kapacitetsjusteringar hanteras genom layouthantering; operationer tillämpas som nya layoutversioner.

Säkerhetskopierings- och återställningsstrategi

Minst säkerhetskopiera metadata, eftersom den innehåller klusterkonfiguration, bucket/nyckelstatus och index. Garage stöder periodiska metadata-snapshotter (metadata_auto_snapshot_interval) och manuella snapshotter (garage meta snapshot --all).
Garage-migreringsguiden rekommenderar explicit att säkerhetskopiera specifika filer/kataloger från varje nods metadata_dir (inklusive snapshotter och layoutfiler).

För objektdata, behandla Garage som någon S3-ändpunkt: använd S3-kompatibla säkerhetskopieringsverktyg (t.ex. restic, duplicity) som riktas mot en Garage-bucket, som dokumenterats i Garages “Säkerhetskopior” integrationsida.

Felsökning av vanliga fel

NO ROLE ASSIGNED i garage status betyder vanligtvis att du inte har skapat/applikerat en layout än. Lösning: garage layout assign … sedan garage layout apply.
AuthorizationHeaderMalformed indikerar ofta att en klient använder fel region; ställ in AWS_DEFAULT_REGION (eller motsvarande) för att matcha [s3_api].s3_region.
Signatur / begäran fel kan orsakas av path-stil vs vhost-stil matchning; konfigurera [s3_api].root_domain för vhost-stil, eller tvinga path-stil i klienter (t.ex. rclone’s force_path_style=true).
Behörighetsfel är ofta bara “nyckel inte tillåten på bucket”; undersök med garage bucket info <bucket> och se till att garage bucket allow har rätt flaggor.

Prestandatuning som mest betydelsefulla

Placera metadata_dir på SSD när det är möjligt; Garage-dokumentationen nämner förbättrad svarsfrekvens och “drastiskt minskad” latenspotential.
Justera block_size och komprimering noggrant: Garage-standardvärden är avsedda att vara sunt, men konfigurationsreferensen förklarar växeln och noterar att förändringar endast gäller för nyuppladdat data.
Om du har NVMe, kan ökning av blockskrivningskonkurrens förbättra throughput men ökar minnesanvändning; Garage ger vägledning för block_max_concurrent_writes_per_request.
Garages egna benchmarkar betonar kostnaderna för intra-klusterlatens i geodistribuerade konfigurationer och lyfter fram designval (t.ex. undvikande av konsensusledare) som kan minska geolatenspåverkan.

Kort jämförelse med MinIO och AWS S3

Garage är optimerad för självvärd, geodistribuerade kluster och drifts enkelhet, med några avsiktliga S3-funktionsskylor (t.ex. inga S3-bucketpolicyer/ACL:er; begränsad versioneringssupport).
MinIO fokuserar på S3 API-bredd och högpresterande företagsdistributioner (t.ex. MinIO:s egna material beskriver funktioner som objektlås, replikering och händelseaviseringar).
AWS S3 är den hanterade referensimplementeringen med stark konsekvens, 11 nines hållbarhet och 99.99% tillgänglighet, samt ett brett funktionssystem (lagringsklasser, livscykel, händelsehantering, IAM).

Mer om Minio:

Några användbara länkar